仿真图
按键的效果
要求加一个串口直接设置定时时间,并实时显示剩余时间。 感觉改动的难度有点大。 现在P3.1是修改时分秒,修改标志就是dp。p3.2加p3.3
减 现在在图的基础上加新串口实现定时的倒计时功能。 倒计时的不知道怎么去弄了。
现在的代码如下:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit k1=P3^1; //第一个按键,选择设置
- uchar code distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//共阴数码管段码表
- uchar disbuf[8]; //声明显示缓冲区8个单元
- uchar hour=12; //声明小时变量,初值为12
- uchar minute=59; //声明分变量,初值为59
- uchar second; //声明秒变量
- uchar t0n; //定时器T0中断计数,定时50ms,中断20次为1秒
- uchar dis; //调时状态下,显示小数点位
- void delay() //延时子程序,用于显示子程序
- {
- uint j;
- for(j=300;j>0;j--);
- }
- //显示子程序,参数dis为显示小数点位
- void display(uchar dis)
- {
- uchar j,disbit=0x01; //位码
- for(j=0;j<8;j++)
- {
- P2=~disbit; //P2口输出位码
- if(dis>0&&dis==j) //调时状态下,显示小数点
- P0=distab[disbuf[j]]+0x80; //在小时,分,秒位上显示小数点
- else
- P0=distab[disbuf[j]]; //其它位正常显示
- disbit<<=1; //取下一个位码
- delay(); //延时
- }
- }
- void main()
- {
- disbuf[2]=disbuf[5]=10;//数码管第3,6位显示-
- TMOD=0x01;
- TH0 =0x3C; //单片机晶振频率=12M,定时50ms,时间常数=3CB0
- TL0 =0xB0;
- IE =0x82; //开定时器T0中断
- TR0 =1; //启动定时器T0
- IT0 =1; //设置外部中断为下降沿有效
- IT1 =1;
- while(1)
- {
- display(dis); //调显示子程序
- if(k1==0) //选择设置
- {
- dis++; //停止计时,进入调时状态
- EX0=1; //调时状态下,允许外部INT0,INT1中断
- EX1=1; //用来调小时,分,秒
- if(dis>7) //调小时,在小时位显示小数点
- {
- dis=0; //灭小数点
- t0n=0; //调时结束,开始计时
- TR0=1;
- EX0=0; //关外部中断
- EX1=0;
- }
- else if(dis==2)dis=4; //调分,在分位显示小数点
- else if(dis==5)dis=7; //调秒,在秒位显示小数点
- while(k1==0)display(dis); //等待按键释放
- }
- if(t0n>=20&&dis==0) //中断20次,1秒到,计时状态下时钟计时
- {
- t0n=0;
- second++; //秒加1
- if(second>=60) //到60秒
- {
- second=0;
- minute++; //分加1
- if(minute>=60) //到60分
- {
- minute=0;
- hour++; //小时加1
- if(hour>=24)
- hour=0;
- }
- }
- }
- disbuf[0]=hour/10; //显示小时十位
- disbuf[1]=hour%10; //显示小时个位
- disbuf[3]=minute/10; //显示分十位
- disbuf[4]=minute%10; //显示分个位
- disbuf[6]=second/10; //显示秒十位
- disbuf[7]=second%10; //显示秒个位
- }
- }
- //定时器T0中断服务子程序
- void T0_isr() interrupt 1
- {
- TH0=0x3C; //重写时间常数
- TL0=0xb0;
- t0n++; //中断次加1
- }
- //外部中断INT0服务程序,调时状态下,加1
- void INT0_ISR() interrupt 0
- {
- if(dis==1) //调小时
- {
- hour++; //小时加1
- if(hour>=24)
- hour=0;
- }
- if(dis==4) //调分
- {
- minute++; //分加1
- if(minute>=60)
- minute=0;
- }
- if(dis==7) //调秒
- {
- second++; //秒加1
- if(second>=60)
- second=0;
- }
- }
- //外部中断INT1服务程序,调时状态下,减1
- void INT1_ISR() interrupt 2
- {
- if(dis==1) //调小时
- {
- hour--; //小时减1
- if(hour==0xff)
- hour=23;
- }
- if(dis==4) //调分
- {
- minute--; //分减1
- if(minute==0xff)
- minute=59;
- }
- if(dis==7) //调秒
- {
- second--;//秒减1
- if(second==0xff)
- second=59;
- }
- }
复制代码
|