![]() |
發布時間: 2018-6-9 21:13
正文摘要:本來已經完成了但是又加上一條串口直接設置定時時間,并實時顯示剩余時間。理論本來就沒弄太懂,跌跌撞撞完成了。但是加上又難弄了。 在這個的基礎上可以修改嗎? 3.1口修改時分秒,dp是選 ... |
加P3^4一個按鍵定義為k2,該按鍵鎖死則開始從當前時間倒計時,釋放則恢復正常時鐘。可以先用你的k1,中斷0和1進行設置定時時間,再鎖死,也可以鎖死再實時設置 #include<reg51.h> #define uchar unsigned char//宏替換 #define uint unsigned int sbit k1=P3^1; //第一個按鍵,選擇設置 sbit k2=P3^4; bit c; uchar code distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//共陰數碼管段碼表(0-9,-) 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; //t0定時器方式1 TH0 =0x3C; //單片機晶振頻率=12M,定時50ms,時間常數=3CB0 TL0 =0xB0; IE =0x82; //開定時器T0中斷(EX1外部中斷1沒開) 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(c==0); { 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; } } } } if(k2==0) { c=~c; ET0=~ET0; while(k1==0)display(dis); } if(c==1) { second--; //秒加1 if(second==0xff) //到60秒 { second=59; minute--; //分加1 if(minute==0xff) //到60分 { minute=59; hour--; //小時加1 if(hour==0xff) hour=23; } } } 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; } } |
]4FU{4{@BOYR16ES6]9K_US.png (242.02 KB, 下載次數: 49)
18.3 KB, 下載次數: 4
在P3^4上加上一個按鍵命名為k2,k2鎖死就會自動倒計時,k2打開就恢復,可以直接先用你的k1中斷0中斷1設置時間再鎖死k2,也可以先鎖死再用你的k1和中斷0中斷1調整 #include<reg51.h> #define uchar unsigned char//宏替換 #define uint unsigned int sbit k1=P3^1; //第一個按鍵,選擇設置 sbit k2=P3^4; bit c; uchar code distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//共陰數碼管段碼表(0-9,-) 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; //t0定時器方式1 TH0 =0x3C; //單片機晶振頻率=12M,定時50ms,時間常數=3CB0 TL0 =0xB0; IE =0x82; //開定時器T0中斷(EX1外部中斷1沒開) 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(c==0); { 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; } } } } if(k2==0) { c=~c; ET0=~ET0; while(k1==0)display(dis); } if(c==1) { second--; //秒加1 if(second==0xff) //到60秒 { second=59; minute--; //分加1 if(minute==0xff) //到60分 { minute=59; hour--; //小時加1 if(hour==0xff) hour=23; } } } 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; } } |
]4FU{4{@BOYR16ES6]9K_US.png (242.02 KB, 下載次數: 54)
18.3 KB, 下載次數: 4
多加一個顯示倒計時 |
你這個的具體功能是什么 |
jizi 發表于 2018-6-10 14:38 多加一個模式,在數碼管顯示倒計時。 倒計時時間可以設置的。 |
串口是什么串口是通訊還是什么? 你要的是倒計時在數碼管上顯示嗎? 還是增加多一個模式? |