仿真圖
按鍵的效果
要求加一個串口直接設置定時時間,并實時顯示剩余時間。 感覺改動的難度有點大。 現在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;
- }
- }
復制代碼
|