熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2018-6-9 21:13
正文摘要:本來已經(jīng)完成了但是又加上一條串口直接設(shè)置定時(shí)時(shí)間,并實(shí)時(shí)顯示剩余時(shí)間。理論本來就沒弄太懂,跌跌撞撞完成了。但是加上又難弄了。 在這個(gè)的基礎(chǔ)上可以修改嗎? 3.1口修改時(shí)分秒,dp是選 ... |
加P3^4一個(gè)按鍵定義為k2,該按鍵鎖死則開始從當(dāng)前時(shí)間倒計(jì)時(shí),釋放則恢復(fù)正常時(shí)鐘?梢韵扔媚愕膋1,中斷0和1進(jìn)行設(shè)置定時(shí)時(shí)間,再鎖死,也可以鎖死再實(shí)時(shí)設(shè)置 #include<reg51.h> #define uchar unsigned char//宏替換 #define uint unsigned int sbit k1=P3^1; //第一個(gè)按鍵,選擇設(shè)置 sbit k2=P3^4; bit c; uchar code distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//共陰數(shù)碼管段碼表(0-9,-) uchar disbuf[8]; //聲明顯示緩沖區(qū)8個(gè)單元 uchar hour=12; //聲明小時(shí)變量,初值為12 uchar minute=59; //聲明分變量,初值為59 uchar second; //聲明秒變量 uchar t0n; //定時(shí)器T0中斷計(jì)數(shù),定時(shí)50ms,中斷20次為1秒 uchar dis; //調(diào)時(shí)狀態(tài)下,顯示小數(shù)點(diǎn)位 void delay() //延時(shí)子程序,用于顯示子程序 { uint j; for(j=300;j>0;j--); } //顯示子程序,參數(shù)dis為顯示小數(shù)點(diǎn)位 void display(uchar dis) // ???????????????????????????? { uchar j,disbit=0x01; //位碼(未知) for(j=0;j<8;j++) { P2=~disbit; //P2口輸出位碼 if(dis>0&&dis==j) //調(diào)時(shí)狀態(tài)下,顯示小數(shù)點(diǎn)(看不懂) P0=distab[disbuf[j]]+0x80; //在小時(shí),分,秒位上顯示小數(shù)點(diǎn) else P0=distab[disbuf[j]]; //其它位正常顯示 disbit<<=1; //取下一個(gè)位碼 delay(); //延時(shí) } } void main()//主函數(shù) { disbuf[2]=disbuf[5]=10;//數(shù)碼管第3,6位顯示- TMOD=0x01; //t0定時(shí)器方式1 TH0 =0x3C; //單片機(jī)晶振頻率=12M,定時(shí)50ms,時(shí)間常數(shù)=3CB0 TL0 =0xB0; IE =0x82; //開定時(shí)器T0中斷(EX1外部中斷1沒開) TR0 =1; //啟動(dòng)定時(shí)器T0 IT0 =1; //設(shè)置外部中斷為下降沿有效 IT1 =1; while(1) { display(dis); //調(diào)顯示子程序(未知) if(k1==0) //選擇設(shè)置 { dis++; //停止計(jì)時(shí),進(jìn)入調(diào)時(shí)狀態(tài)(暫停了秒計(jì)時(shí)) EX0=1; //調(diào)時(shí)狀態(tài)下,允許外部INT0,INT1中斷 EX1=1; //用來調(diào)小時(shí),分,秒 if(dis>7) //調(diào)小時(shí),在小時(shí)位顯示小數(shù)點(diǎn) { dis=0; //滅小數(shù)點(diǎn) t0n=0; //調(diào)時(shí)結(jié)束,開始計(jì)時(shí) TR0=1; EX0=0; //關(guān)外部中斷 EX1=0; } else if(dis==2)dis=4; //調(diào)分,在分位顯示小數(shù)點(diǎn) else if(dis==5)dis=7; //調(diào)秒,在秒位顯示小數(shù)點(diǎn) while(k1==0)display(dis); //等待按鍵釋放 } //這里做改動(dòng) if(c==0); { if(t0n>=20&&dis==0) //中斷20次,1秒到,計(jì)時(shí)狀態(tài)下時(shí)鐘計(jì)時(shí) { t0n=0; second++; //秒加1 if(second>=60) //到60秒 { second=0; minute++; //分加1 if(minute>=60) //到60分 { minute=0; hour++; //小時(shí)加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--; //小時(shí)加1 if(hour==0xff) hour=23; } } } disbuf[0]=hour/10; //顯示小時(shí)十位 disbuf[1]=hour%10; //顯示小時(shí)個(gè)位 disbuf[3]=minute/10; //顯示分十位 disbuf[4]=minute%10; //顯示分個(gè)位 disbuf[6]=second/10; //顯示秒十位 disbuf[7]=second%10; //顯示秒個(gè)位 } } //定時(shí)器T0中斷服務(wù)子程序 void T0_isr() interrupt 1 { TH0=0x3C; //重寫時(shí)間常數(shù) TL0=0xb0; t0n++; //中斷次加1 } //外部中斷INT0服務(wù)程序,調(diào)時(shí)狀態(tài)下,加1 void INT0_ISR() interrupt 0 { if(dis==1) //調(diào)小時(shí) { hour++; //小時(shí)加1 if(hour>=24) hour=0; } if(dis==4) //調(diào)分 { minute++; //分加1 if(minute>=60) minute=0; } if(dis==7) //調(diào)秒 { second++; //秒加1 if(second>=60) second=0; } } //外部中斷INT1服務(wù)程序,調(diào)時(shí)狀態(tài)下,減1 void INT1_ISR() interrupt 2 { if(dis==1) //調(diào)小時(shí) { hour--; //小時(shí)減1 if(hour==0xff) hour=23; } if(dis==4) //調(diào)分 { minute--; //分減1 if(minute==0xff) minute=59; } if(dis==7) //調(diào)秒 { second--;//秒減1 if(second==0xff) second=59; } } |
]4FU{4{@BOYR16ES6]9K_US.png (242.02 KB, 下載次數(shù): 49)
18.3 KB, 下載次數(shù): 4
在P3^4上加上一個(gè)按鍵命名為k2,k2鎖死就會(huì)自動(dòng)倒計(jì)時(shí),k2打開就恢復(fù),可以直接先用你的k1中斷0中斷1設(shè)置時(shí)間再鎖死k2,也可以先鎖死再用你的k1和中斷0中斷1調(diào)整 #include<reg51.h> #define uchar unsigned char//宏替換 #define uint unsigned int sbit k1=P3^1; //第一個(gè)按鍵,選擇設(shè)置 sbit k2=P3^4; bit c; uchar code distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//共陰數(shù)碼管段碼表(0-9,-) uchar disbuf[8]; //聲明顯示緩沖區(qū)8個(gè)單元 uchar hour=12; //聲明小時(shí)變量,初值為12 uchar minute=59; //聲明分變量,初值為59 uchar second; //聲明秒變量 uchar t0n; //定時(shí)器T0中斷計(jì)數(shù),定時(shí)50ms,中斷20次為1秒 uchar dis; //調(diào)時(shí)狀態(tài)下,顯示小數(shù)點(diǎn)位 void delay() //延時(shí)子程序,用于顯示子程序 { uint j; for(j=300;j>0;j--); } //顯示子程序,參數(shù)dis為顯示小數(shù)點(diǎn)位 void display(uchar dis) // ???????????????????????????? { uchar j,disbit=0x01; //位碼(未知) for(j=0;j<8;j++) { P2=~disbit; //P2口輸出位碼 if(dis>0&&dis==j) //調(diào)時(shí)狀態(tài)下,顯示小數(shù)點(diǎn)(看不懂) P0=distab[disbuf[j]]+0x80; //在小時(shí),分,秒位上顯示小數(shù)點(diǎn) else P0=distab[disbuf[j]]; //其它位正常顯示 disbit<<=1; //取下一個(gè)位碼 delay(); //延時(shí) } } void main()//主函數(shù) { disbuf[2]=disbuf[5]=10;//數(shù)碼管第3,6位顯示- TMOD=0x01; //t0定時(shí)器方式1 TH0 =0x3C; //單片機(jī)晶振頻率=12M,定時(shí)50ms,時(shí)間常數(shù)=3CB0 TL0 =0xB0; IE =0x82; //開定時(shí)器T0中斷(EX1外部中斷1沒開) TR0 =1; //啟動(dòng)定時(shí)器T0 IT0 =1; //設(shè)置外部中斷為下降沿有效 IT1 =1; while(1) { display(dis); //調(diào)顯示子程序(未知) if(k1==0) //選擇設(shè)置 { dis++; //停止計(jì)時(shí),進(jìn)入調(diào)時(shí)狀態(tài)(暫停了秒計(jì)時(shí)) EX0=1; //調(diào)時(shí)狀態(tài)下,允許外部INT0,INT1中斷 EX1=1; //用來調(diào)小時(shí),分,秒 if(dis>7) //調(diào)小時(shí),在小時(shí)位顯示小數(shù)點(diǎn) { dis=0; //滅小數(shù)點(diǎn) t0n=0; //調(diào)時(shí)結(jié)束,開始計(jì)時(shí) TR0=1; EX0=0; //關(guān)外部中斷 EX1=0; } else if(dis==2)dis=4; //調(diào)分,在分位顯示小數(shù)點(diǎn) else if(dis==5)dis=7; //調(diào)秒,在秒位顯示小數(shù)點(diǎn) while(k1==0)display(dis); //等待按鍵釋放 } //這里做改動(dòng) if(c==0); { if(t0n>=20&&dis==0) //中斷20次,1秒到,計(jì)時(shí)狀態(tài)下時(shí)鐘計(jì)時(shí) { t0n=0; second++; //秒加1 if(second>=60) //到60秒 { second=0; minute++; //分加1 if(minute>=60) //到60分 { minute=0; hour++; //小時(shí)加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--; //小時(shí)加1 if(hour==0xff) hour=23; } } } disbuf[0]=hour/10; //顯示小時(shí)十位 disbuf[1]=hour%10; //顯示小時(shí)個(gè)位 disbuf[3]=minute/10; //顯示分十位 disbuf[4]=minute%10; //顯示分個(gè)位 disbuf[6]=second/10; //顯示秒十位 disbuf[7]=second%10; //顯示秒個(gè)位 } } //定時(shí)器T0中斷服務(wù)子程序 void T0_isr() interrupt 1 { TH0=0x3C; //重寫時(shí)間常數(shù) TL0=0xb0; t0n++; //中斷次加1 } //外部中斷INT0服務(wù)程序,調(diào)時(shí)狀態(tài)下,加1 void INT0_ISR() interrupt 0 { if(dis==1) //調(diào)小時(shí) { hour++; //小時(shí)加1 if(hour>=24) hour=0; } if(dis==4) //調(diào)分 { minute++; //分加1 if(minute>=60) minute=0; } if(dis==7) //調(diào)秒 { second++; //秒加1 if(second>=60) second=0; } } //外部中斷INT1服務(wù)程序,調(diào)時(shí)狀態(tài)下,減1 void INT1_ISR() interrupt 2 { if(dis==1) //調(diào)小時(shí) { hour--; //小時(shí)減1 if(hour==0xff) hour=23; } if(dis==4) //調(diào)分 { minute--; //分減1 if(minute==0xff) minute=59; } if(dis==7) //調(diào)秒 { second--;//秒減1 if(second==0xff) second=59; } } |
]4FU{4{@BOYR16ES6]9K_US.png (242.02 KB, 下載次數(shù): 54)
18.3 KB, 下載次數(shù): 4
多加一個(gè)顯示倒計(jì)時(shí) |
1.我先提一點(diǎn),樓主應(yīng)該不打算做實(shí)物吧?因?yàn)樽鰧?shí)物的畫,你的數(shù)碼管驅(qū)動(dòng)電路需要重新設(shè)計(jì)下。 2.你現(xiàn)在是一般時(shí)鐘,需要外加一個(gè)功能,我不清楚你說的串口是啥。姑且認(rèn)為你是說按鍵,通過按鍵切換到這個(gè)模式,然后設(shè)計(jì)相應(yīng)位置,再確定。這里應(yīng)該還需要一個(gè)中斷,然后用另一個(gè)定時(shí)器。當(dāng)中斷觸發(fā)時(shí)數(shù)碼管顯示倒計(jì)時(shí)模式,然后你設(shè)置運(yùn)行,當(dāng)?shù)褂?jì)時(shí)結(jié)束后,中斷結(jié)束返回時(shí)鐘畫面。個(gè)人愚見 |
參與人數(shù) 1 | 黑幣 +8 | 收起 理由 |
---|---|---|
![]() | + 8 | 絕世好帖! |
你這個(gè)的具體功能是什么 |
jizi 發(fā)表于 2018-6-10 14:38 多加一個(gè)模式,在數(shù)碼管顯示倒計(jì)時(shí)。 倒計(jì)時(shí)時(shí)間可以設(shè)置的。 |
串口是什么串口是通訊還是什么? 你要的是倒計(jì)時(shí)在數(shù)碼管上顯示嗎? 還是增加多一個(gè)模式? |
Powered by 單片機(jī)教程網(wǎng)