通过at89c51的定时器实现60秒倒计时,显示采用两位数码管
1个回答
关注
展开全部
这里有一个可能的实现方法,使用了at89c51的定时器0工作在方式1下,产生一秒的定时时间,并用P0和P2口分别控制两位数码管的显示。
咨询记录 · 回答于2023-05-02
通过at89c51的定时器实现60秒倒计时,显示采用两位数码管
这里有一个可能的实现方法,使用了at89c51的定时器0工作在方式1下,产生一秒的定时时间,并用P0和P2口分别控制两位数码管的显示。
#include #define uchar unsigned char#define uint unsigned intuchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管显示码uchar count = 0; //计数变量uchar sec = 60; //倒计时秒数uchar start = 0; //启动标志void delay(uint z) //延时函数{ uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--);}void timer0() interrupt 1 //定时器中断服务函数{ TH0 = (65536-50000)/256; //重装初值 TL0 = (65536-50000)%256; count++; //计数加一 if(count == 20) //计数到20,即一秒 { count = 0; //清零计数变量 if(start == 1) //如果启动标志为1,开始倒计时 { sec--; //秒数减一 if(sec == 0) //如果秒数为零,复位秒数和启动标志 { sec = 60; start = 0; } } }}void keyscan() //按键扫描函数{ if(P3_2 == 0) //如果P3.2口为低电平,即按键按下 { delay(10); //消抖延时 if(P3_2 == 0) //再次检测按键状态 { start = ~start; //取反启动标志 if(start == 1) //如果启动标志为1,开始倒计时 { sec = 60; //复位
} } while(!P3_2); //等待按键释放 }}void display() //显示函数{ uchar shi,ge; //十位和个位变量 shi = sec/10; //计算十位数值 ge = sec%10; //计算个位数值 P2 = 0xfe; //点亮第一位数码管 P0 = table[shi]; //显示十位数值 delay(5); //短暂延时 P2 = 0xfd; //点亮第二位数码管 P0 = table[ge]; //显示个位数值 delay(5); //短暂延时}void main() //主函数{ TMOD = 0x01; //设置定时器工作方式为1 TH0 = (65536-50000)/256; //装入初值,产生50ms的定时时间 TL0 = (65536-50000)%256; EA = 1; //开总中断 ET0 = 1; //开定时器中断 TR0 = 1; //启动定时器 while(1) { keyscan(); //扫描按键状态 display(); //显示倒计时秒数 }}
按这个图要怎么写程序