|
跟論壇前輩抄抄改改,累死若干腦細(xì)胞,弄了這么個(gè)縫合怪,可以放廚房燉排骨計(jì)時(shí)間了。1、上電復(fù)位靜態(tài)顯示0000。
2、按旋轉(zhuǎn)編碼器中鍵第1次顯示00:00,分鐘00按秒閃爍;左右旋轉(zhuǎn)分鐘減加(00-59)。
3、按旋轉(zhuǎn)編碼器中鍵第2次顯示00:XX,小時(shí)00按秒閃爍;左右旋轉(zhuǎn)小時(shí)減加(00-23),所以最大定時(shí)時(shí)間23小時(shí)59分。
4、按旋轉(zhuǎn)編碼器中鍵第3次顯示XX:XX,秒點(diǎn)閃爍,開始倒計(jì)時(shí)走時(shí)。七色LED點(diǎn)亮(自閃)表示正在倒計(jì)時(shí)。倒計(jì)時(shí)結(jié)束顯示00:00并全部秒閃,七彩LED熄滅,有源蜂鳴器按秒叫喚。
5、按旋轉(zhuǎn)編碼器中鍵第4次單片機(jī)復(fù)位,顯示0000,蜂鳴器關(guān)閉,LED關(guān)閉。
不會(huì)畫proteus,再說沒幾個(gè)元件。TM1637 DIO接P3^4、CLK接P3^5,旋轉(zhuǎn)編碼器中鍵接P3^6+GND,左右接P3^2、P3^3、GND,蜂鳴器接P0^7(P0是開漏,接其他口準(zhǔn)雙向口灌電流太小帶不動(dòng)),七彩LED接P2^1。精度么,5分鐘差不了1秒,沒耐心再比對更長時(shí)間的去微調(diào)了
制作出來的實(shí)物圖如下:
51hei圖片_20241112163212.jpg (362.58 KB, 下載次數(shù): 0)
下載附件
2024-11-12 17:03 上傳
51hei圖片_20241112163254.jpg (515.41 KB, 下載次數(shù): 0)
下載附件
2024-11-12 17:03 上傳
單片機(jī)源程序如下:
- #include "STC89C52.h"
- #include "TM1637.h"
- #include "intrins.h"
- sbit KA=P3^2; //旋轉(zhuǎn)編碼器A
- sbit KB=P3^3; //旋轉(zhuǎn)編碼器B
- sbit KC=P3^6; //旋轉(zhuǎn)編碼器中
- bit relay=0; //時(shí)間到標(biāo)志
- sbit com=P0^7; //蜂鳴器
- sbit con=P2^1; //七彩LED
- unsigned char KO=0; //旋轉(zhuǎn)編碼器
- char Num=0,Nu=0; //計(jì)時(shí)變量
- unsigned char hour=0,minute=0,second=0,time_count=0; //時(shí),分,秒,10ms計(jì)數(shù)器
- unsigned char show[6]={0,0,0,0,0,0}; //TM1637四位數(shù)碼管顯示數(shù)組:小時(shí)的十位和個(gè)位,分鐘的十位和個(gè)位,最后兩個(gè)為小時(shí)和分鐘。
- unsigned int Se=0; //秒計(jì)數(shù)
- unsigned int Kcase=0;//旋轉(zhuǎn)編碼器中鍵按鍵次數(shù)
- bit flag_1s=0; //秒任務(wù)標(biāo)志位
- bit flag_500ms=0; //半秒標(biāo)志位
- bit stat_100ms=0; //快閃標(biāo)志位
- bit stat_500ms=0; //半秒狀態(tài)位,控制閃爍
- bit flag=0; //調(diào)整標(biāo)志位
- /******************************
- 函數(shù)說明:延時(shí)函數(shù),STC_ISP軟件給出 @6MHz 1T單片機(jī)
- 入口參數(shù):us=延時(shí)微秒數(shù)
- 出口參數(shù):無
- ******************************/
- void Delay_US(unsigned int us)
- {
- while(us--)
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- }//us延時(shí)函數(shù)結(jié)束
- void djs(void) ///////////////////////////////倒計(jì)時(shí)
- {
- if(flag_1s==1)
- {flag_1s=0;
- if(second>0)
- {second--;
- Se++;
- }
- else if(minute>0)
- {minute--;
- second=59;}
- else if(hour>0)
- {hour--;
- minute=59;
- second=59;}
- else{relay=1;flag=1;}
- }
- show[4]=hour;
- show[5]=minute;
- show[0]=show[4]/10%10; //顯示的小時(shí)十位數(shù)
- show[1]=show[4]%10; //顯示的小時(shí)個(gè)位數(shù)
- show[2]=show[5]/10%10; //顯示的分鐘十位數(shù)
- show[3]=show[5]%10; //顯示的分鐘個(gè)位數(shù)
- //以下時(shí)間到,閃爍顯示00
- if(relay==1)
- {
- con=1;
- if(stat_500ms==0)
- {
- TM1637_display(21,21,21,21,0); //半秒熄滅
- if(Se==0)
- {com=1;}
- else{com=0;}
- }
- else
- {
- TM1637_display(0,0,0,0,1); //半秒顯示00:00
- com=1;
- }
- }
-
- else { com=1;
- con=0;
- if(stat_500ms==0)
- {
- TM1637_display(show[0],show[1],show[2],show[3],stat_500ms); //半秒秒點(diǎn)
- }
- else
- {
- TM1637_display(show[0],show[1],show[2],show[3],stat_500ms); //半秒秒點(diǎn)
- }
- }
-
- }
- /******************************
- 函數(shù)說明:定時(shí)器0初始化,12T自動(dòng)重裝模式,定時(shí)10毫秒
- ******************************/
- void Timer0Init(void) //10毫秒@6.000MHz
- {
- AUXR &= 0x7F; //定時(shí)器時(shí)鐘12T模式
- TMOD &= 0xF0; //設(shè)置定時(shí)器模式
- TL0 = 0x78; //設(shè)置定時(shí)初值
- TH0 = 0xEC; //設(shè)置定時(shí)初值
- TF0 = 0; //清除TF0標(biāo)志
- TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
- ET0=1; //允許T0中斷
- EA=1; //開全局中斷
- }//定時(shí)器初始化結(jié)束
- void Zuan() //旋轉(zhuǎn)處理
- {
- switch(Kcase)
- {case 1:
- if((KO==KA)||(KA==1)) //不理會(huì)A引腳上升沿,低電平每個(gè)脈沖只做一次處理
- {
- KO=KA;
- _nop_();
- _nop_();
- return;
- }
- (KB == 0)?Num-- : Num++; //根據(jù)引腳B的值,判斷正反轉(zhuǎn)
- KO=KA; //存儲(chǔ)引腳A狀態(tài)
- _nop_();
- _nop_();
-
- if(Num<0){Num=59;}
- if(Num==60){Num=0;}
- show[5]=Num;
- show[0]=show[4]/10%10; //顯示的小時(shí)十位數(shù)
- show[1]=show[4]%10; //顯示的小時(shí)個(gè)位數(shù)
- show[2]=show[5]/10%10; //顯示的分鐘十位數(shù)
- show[3]=show[5]%10; //顯示的分鐘個(gè)位數(shù)
- minute=Num;
- break;
- case 2:
- if((KO==KA)||(KA ==1)) //不理會(huì)A引腳上升沿,低電平每個(gè)脈沖只做一次處理
- {
- KO=KA;
- _nop_();
- _nop_();
- _nop_();
- return;
- }
- (KB == 0)?Nu-- : Nu++; //根據(jù)引腳B的值,判斷正反轉(zhuǎn)
- KO=KA;
- _nop_();
- _nop_();
- _nop_();//存儲(chǔ)引腳A狀態(tài)
- if(Nu<0){Nu=23;}
- if(Nu==24){Nu=0;}
- show[4]=Nu;
- show[0]=show[4]/10%10; //顯示的小時(shí)十位數(shù)
- show[1]=show[4]%10; //顯示的小時(shí)個(gè)位數(shù)
- show[2]=show[5]/10%10; //顯示的分鐘十位數(shù)
- show[3]=show[5]%10; //顯示的分鐘個(gè)位數(shù)
- hour=Nu;
- break;
-
- case 3:
- break;
- }
- }
- void main(void)
- {
- Se=0;
- relay=0;
- flag=0;
- com=1;
- con=1;
- TM1637_display(0,0,0,0,stat_500ms); //上電后默認(rèn)顯示00:00
- Timer0Init(); //定時(shí)器T0初始化并啟動(dòng)
- while(1)
- {
-
-
- if(KC==0)/////////////中鍵檢測
- {
- Delay_US(7000);///////////按鍵消抖
- if(KC==0)////再次確認(rèn)中鍵
- {
- Kcase++;
- if(Kcase==5)
- {Kcase=1;
- com=1;
- con=1;
- relay=0;
- flag=0;
- Num=0;
- }
-
- }
- }
- switch(Kcase)///////////////////狀態(tài)選擇
- { case 1:
- if(stat_500ms==1) //半秒閃爍分鐘
- {
- TM1637_display(show[0],show[1],21,21,1); //半秒閃爍分鐘
- }
- else
- {
- TM1637_display(show[0],show[1],show[2],show[3],1); //半秒閃爍分鐘
- }
-
- Zuan();
- break;
- case 2:
- if(stat_500ms==1) //半秒閃爍小時(shí)
- {
- TM1637_display(show[0],show[1],show[2],show[3],1); //半秒閃爍小時(shí)
- }
- else
- {
- TM1637_display(21,21,show[2],show[3],1); //半秒閃爍小時(shí)
- }
- Zuan();
- break;
- case 3:
- djs();
- break;
- case 4:
- ISP_CONTR=0x20; //第4按軟件復(fù)位
- break;
- } ////////switch狀態(tài)選擇結(jié)束
- }//while(1)結(jié)束
- }//main函數(shù)結(jié)束
- void time0(void) interrupt 1 //T0中斷服務(wù),每10ms響應(yīng)一次
- {
- time_count++; //計(jì)數(shù)加1
- if(time_count==55)
- {stat_500ms=~stat_500ms;
- }
- if(time_count==113)
- {time_count=0;
- stat_500ms=~stat_500ms;
- flag_1s=1;
- }
- }////////////////////////////////T0中斷結(jié)束
復(fù)制代碼
以下為TM1637顯示
- sbit CLK= P3^5; //定義模擬IIC總線的時(shí)鐘線
- sbit DIO = P3^4; //定義模擬IIC總線的數(shù)據(jù)線
- void Delay_US(unsigned int us);
-
- unsigned char code tab[] =
- {
- 0x3F,/*0*/
- 0x06,/*1*/
- 0x5B,/*2*/
- 0x4F,/*3*/
- 0x66,/*4*/
- 0x6D,/*5*/
- 0x7D,/*6*/
- 0x07,/*7*/
- 0x7F,/*8*/
- 0x6F,/*9*/
- 0x77,/*10 A*/
- 0x7C,/*11 b*/
- 0x58,/*12 c*/
- 0x5E,/*13 d*/
- 0x79,/*14 E*/
- 0x71,/*15 F*/
- 0x76,/*16 H*/
- 0x38,/*17 L*/
- 0x54,/*18 n*/
- 0x73,/*19 P*/
- 0x3E,/*20 U*/
- 0x00,/*21 黑屏*/
- };
- //IIC開始
- void TM1637_start(void)
- {
- CLK=1;
- DIO=1;
- Delay_US(2);
- DIO=0;
- }
- //IIC應(yīng)答
- void TM1637_ack(void)
- {
- unsigned char i;
- CLK=0;
- Delay_US(5);
- //DIO=1;
- while(DIO==1&&(i<250))i++;
- CLK=1;
- Delay_US(2);
- CLK=0;
- }
- //IIC停止
- void TM1637_stop(void)
- {
- CLK=0;
- Delay_US(2);
- DIO=0;
- Delay_US(2);
- CLK=1;
- Delay_US(2);
- DIO=1;
- Delay_US(2);
- }
- //寫數(shù)據(jù)函數(shù)
- void TM1637_Write(unsigned char DATA)
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- CLK=0;
- if(DATA & 0x01)
- DIO=1;
- else DIO=0;
- Delay_US(3);
- DATA=DATA>>1;
- CLK=1;
- Delay_US(3);
- }
- //TM1637_ack();
- }
-
- //按順序顯示
- void TM1637_display(unsigned char a,unsigned char b,unsigned char c,unsigned char d,unsigned char h)
- {
- TM1637_start();
- TM1637_Write(0x40);//寫數(shù)據(jù)+自動(dòng)地址加1+普通模式
- TM1637_ack();
- TM1637_stop();
- TM1637_start();
- TM1637_Write(0xc0);//設(shè)置顯示首地址即第一個(gè)LED
- TM1637_ack();
- TM1637_Write(tab[a]);
- TM1637_ack();
- TM1637_Write(tab[b]|h<<7);//h為1時(shí)顯示時(shí)鐘中間的兩點(diǎn)
- TM1637_ack();
- TM1637_Write(tab[c]);
- TM1637_ack();
- TM1637_Write(tab[d]);
- TM1637_ack();
- TM1637_stop();
- TM1637_start();
- TM1637_Write(0x89);//開顯示,2/16亮度
- TM1637_ack();
- TM1637_stop();
- }
復(fù)制代碼
|
評分
-
查看全部評分
|