龙空技术网

2 利用定时/计数器中断定时刷新实现数码管动态显示的代码来了

金善愚 398

前言:

当前兄弟们对“定时器中断实验代码”都比较关心,大家都需要剖析一些“定时器中断实验代码”的相关知识。那么小编也在网络上汇集了一些有关“定时器中断实验代码””的相关内容,希望小伙伴们能喜欢,大家快快来了解一下吧!

上一节分享了视频课程中的数码管动态刷新显示的代码,有网友说,应该通过定时器刷新来实现数码管的动态刷新显示,而不是用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语言代码怎么写 #汇编语言 计数器实验报告 #定时器计数汇编语言