|
- /********************************************************************************
- 定时器定时1ms,数码管以秒钟计时,加上定时器0中断可消除数码管刷新时的闪烁问题,
- 闪烁问题是由while语句中分离数字时计算造成的,因为每次1s时间到,在数码管刷新前
- 都要进行计算,耽误了时间,导致闪烁,加了中断以后则是先刷新数码管再分离数字。
- ********************************************************************************/
- #include <reg52.h>//52单片机头文件
- #define uchar unsigned char // 自定义uchar为unsigned char(即无符号字符型数据,数据范围:0到255。)
- #define uint unsigned int //自定义uint为unsigned int(即有符号整数型数据,数据范围:0到65535。)
- uint count,i,sec,shumaguainitflag;//声明定时器0中断次数变量、选位变量、秒钟变量、数码管初始化标志位变量
- uint ge,shi,bai,qian;//声明数码管个位变量、数码管十位变量、数码管百位变量、数码管千位变量
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共阴数码管段码数字0~9字码表,高电平点亮数码管段码数字0~9。
- void Timer0Init()//定时器0初始化
- {
- TMOD=0x01;//设定定时器类型为定时器0,定时器工作模式为模式0。
- TH0=(65536-1000)/256;//TH0装初值
- TL0=(65536-1000)%256;//TL0装初值
- EA=1;//开启定时器总中断
- ET0=1;//开启定时器0中断开关
- TR0=1;//启动定时器0
- }
- void Timer0() interrupt 1//定时器0中断函数
- {
- TH0=(65536-1000)/256;//TH0重新装值
- TL0=(65536-1000)%256;//TL0重新装值
- count++;//定时器0中断次数变量先赋值再加
- P2=0xff;//此句为消除瞬间错误,例如case 1下,P0已刷新而P2暂留在case 0瞬间状态,会造成case 0下数码管瞬间显示错误数值,在每次进入开关语句前关闭所有数码管即可消除该错误。
- switch(i)//让4位数码管以1ms间隔轮流刷新
- {
-
- case 0:
- P0 = ge;//数码管个位数值显示
- P2 = 0xf7;//数码管个位显示位
- i++;//选位变量先赋值再加加
- break;
- case 1:
- P0 = shi;//数码管十位数值显示
- P2 = 0xfb;//数码管十位显示位
- i++;//选位变量先赋值再加加
- break;
- case 2:
- P0 = bai;//数码管百位数值显示
- P2 = 0xfd;//数码管百位显示位
- i++;//选位变量先赋值再加加
- break;
- case 3:
- P0 = qian;//数码管千位数值显示
- P2 = 0xfe;//数码管千位变量显示位
- i=0;//选位变量置0
- break;
-
- default : break;//自定义
- }
- }
- void main()//主函数
- {
- Timer0Init();//定时器0初始化函数
- while(1)//固定循环
- {
- if(count<1000&&shumaguainitflag==0)//判断定时器0中断次数变量是否小于1000和数码管初始化标志位变量是否等于0
- {
- ge = table[0];//数码管个位变量为0
- shi = table[0];//数码管十位变量为0
- bai = table[0];//数码管百位变量为0
- qian = table[0];//数码管千位变量为0
- }
- if(count>=1000)//判断定时器0中断次数变量是否大于等于1000,即1s。
- {
- count = 0;//定时器0中断次数变量置0
- sec++;//秒钟变量先赋值再加加
- shumaguainitflag=1;//数码管初始化标志位变量置1
- ge = table[sec%10];//数码管个位变量
- shi = table[sec%100/10];//数码管十位变量
- bai = table[sec%1000/100];//数码管百位变量
- qian = table[sec/1000];//数码管千位变量
- }
- }
- }
复制代码
|
评分
-
查看全部评分
|