前言:
当前兄弟们对“定时器中断实验代码”都比较关心,大家都需要剖析一些“定时器中断实验代码”的相关知识。那么小编也在网络上汇集了一些有关“定时器中断实验代码””的相关内容,希望小伙伴们能喜欢,大家快快来了解一下吧!上一节分享了视频课程中的数码管动态刷新显示的代码,有网友说,应该通过定时器刷新来实现数码管的动态刷新显示,而不是用delay函数实现。是的,我们实际的工程应用中,一般都少不了定时器的身影,能够把定时器灵活的应用起来,也就基本上把单片机玩的差不多了。前后台的程序框架也就有所理解了,一般的工程项目也就基本可以解决了的。虽然51单片机的定时器的个数有限,但是如果有用到数码管显示和按键检测,一般我们都会拿出一个定时器做基本定时,来动态的刷新数码管,同时定时检测按键,当然有时候也可以把串口的接收监控也放到定时中断中来进行断帧。同时硬件定时器个数虽然有限,我们在应用时,可以通过软件代码来扩充软件定时器,从而实现不同的定时时间,处理不同的事件。下面的代码来源于视频课程——单片机应用实践篇之定时计数器中断方式实现数码管动态显示刷新,。
//main.c/***********************************************功能:定时/计数器定时刷新实现数码管动态显示 开机:初始5S钟,显示 - - - - 同时LED灯闪烁 进入主程序后:显示显示缓冲区中的数据************************************************#include <reg51.h>#include "display.h"sbit LED = P1^0;void Timer0Init(void);void display_Service();unsigned int num = 4534;unsigned int systemTimer = 0;unsigned char systemFlag = 1;void main(){ Timer0Init(); do { if(systemTimer%50 == 0) LED = ~LED; }while(systemTimer <5000);//5S 5000ms/1ms systemFlag = 0; LED = 1; while(1) { display_Service(); }}//显示服务函数,用于数据缓冲区的填充void display_Service(){ LEDBuf[0] = num/1000; LEDBuf[1] = num/100%10; LEDBuf[2] = num/10%10; LEDBuf[3] = num%10;}void Timer0Init(void) //1毫秒@12.000MHz{ TMOD &= 0xF0; //设置定时器模式 TMOD |= 0x01; //设置定时器模式 TL0 = 0x18; //设置定时初值 TH0 = 0xFC; //设置定时初值 TF0 = 0; //清除TF0标志 ET0 = 1;//定时器0的中断开关 EA = 1;//中断总开关 TR0 = 1; //定时器0开始计时}/***************************************1、中断服务函数一定是一个没有返回值的函数2、中断服务函数一定是没有参数的函数3、中断服务函数函数名后跟关键字 interrupt 4、interrupt n 0 - 4 5个中断源 8*n + 0003H 0003H INT0 000BH T0 0013H INT1 001BH T1 0023H ES5、中断服务函数不能北主程序或其他程序所调用6、 n 后面 跟 using m (0 - 3 )工作寄存器组******************************************/void timer0_ISR(void) interrupt 1{ TR0 = 0; if(systemFlag == 1) { systemTimer++; } Display();//定时刷新数码管 TL0 = 0x18; //设置定时初值 TH0 = 0xFC; //设置定时初值 TR0 = 1;}
//display.c#include "display.h"unsigned char code leddata[]={ //数码管的段码表 0x3F, //"0" 0x06, //"1" 0x5B, //"2" 0x4F, //"3" 0x66, //"4" 0x6D, //"5" 0x7D, //"6" 0x07, //"7" 0x7F, //"8" 0x6F, //"9" 0x77, //"A" 0x7C, //"B" 0x39, //"C" 0x5E, //"D" 0x79, //"E" 0x71, //"F" 0x76, //"H" 0x38, //"L" 0x37, //"n" 0x3E, //"u" 0x73, //"P" 0x5C, //"o" 0x40, //"-" 0x00, //熄灭 };unsigned char LEDBuf[] = {22,22,22,22};//数据显示缓冲区unsigned char code PLACE_CODE[] = {0xfe,0xfd,0xfb,0xf7};//位选信号void Display(){ static unsigned char i = 0; //1、送段码 //2、送位选 //3、延时 1ms <10ms //4、消隐 switch(i) { case 0: GPIO_DIG = 0x00; GPIO_DIG = leddata[LEDBuf[0]]; GPIO_PLACE = PLACE_CODE[0]; i++; break; case 1: GPIO_DIG = 0x00; GPIO_DIG = leddata[LEDBuf[1]]; GPIO_PLACE = PLACE_CODE[1]; i++; break; case 2: GPIO_DIG = 0x00; GPIO_DIG = leddata[LEDBuf[2]]; GPIO_PLACE = PLACE_CODE[2]; i++; break; case 3: GPIO_DIG = 0x00; GPIO_DIG = leddata[LEDBuf[3]]; GPIO_PLACE = PLACE_CODE[3]; i = 0; break; default:break; }}
//display.h#ifndef __DISPLAY_H__#define __DISPLAY_H__#include <reg51.h>//IO的声明#define GPIO_DIG P0 //段码 IO#define GPIO_PLACE P2 //位选 IO#define N 4 //数码管个数unsigned char code leddata[];extern unsigned char LEDBuf[];void Display();#endif
具体的代码及功能实现的讲解,可以参考视频课程。
本视频课程主要针对的单片机初学入门,代码规范有待提高,代码还有待改进,仅供大家学习参考。
鉴于很多同学私信要代码,后续有时间会陆续分享视频课程的代码供大家交流学习,代码有不当之处欢迎指出,一起学习交流。
标签: #定时器中断实验代码 #让一只led灯闪烁起来的c语言代码怎么写 #汇编语言 计数器实验报告 #定时器计数汇编语言