|
近些天圖書館收書,規定人離開座位不能超過15分鐘不然就會把書收走,所以制作了一個計時器,用來指示人離開的時長,按照最簡需求設計,計時時長為1小時,超出時間清零。
附帶了一個按鍵,用于計時過程中的暫停,這樣這個計時器可以當作秒表使用了,做個題什么的限制一下時間又不用占用手機。而且最關鍵的是小巧,看起來不會太蠢...
1539009750357.jpg (3.6 MB, 下載次數: 80)
下載附件
2018-10-8 22:46 上傳
1539009807142.jpg (3.87 MB, 下載次數: 90)
下載附件
2018-10-8 22:46 上傳
說明:
1.單片機使用STC15F104W,共有6個I/O
2.數碼管為時鐘樣式的數碼管,中間帶有“:”的,焊接時按照最短路徑焊接,移植程序請考慮修改smgduan[10]的段選值
3.程序定時器0初始值是在12MHz晶振下的初始值,移植程序時請注意修改
4.數碼管采用74HC138+74HC595驅動,595典型連接方式到單片機普通I/O,138改為2-4線驅動,S2=0,Y0~Y3進行位選
5.清零操作就重新上電就好啦,畢竟是最簡需求嘛
6.整個板子需要4根跳線,分別是
74HC595的SRCLR'到VCC
74HC138的S2到GND
板子連接時138譯碼器GND到供電地的跳線
板子背面使用較硬鐵絲(剪下的元件引線)連接數碼管第4位到138譯碼器Y3
程序設計思路:
初始化一個5ms的定時器,每計數200次為1s,每秒將時間值變量加一,在主程序中循環處理這個數據,對60取模得到分鐘數,取余得到秒數。
將所取到的分鐘和秒按位取出,得到待顯示的每一位數據,存放在Display_time[4]數組中。調用數碼管顯示函數進行顯示。
在循環中加入一個按鍵檢測,如果按鍵按下,就將定時器運行位取反,實現暫停效果。
設定一個標志位point,每秒的前一半令其為1,后一半令其為0,在顯示函數中對這一位進行判斷,決定數碼管小數點位是否亮。
注意:時鐘數碼管的中間“:”是第二位小數點,但是為了簡便,將所有小數點全部點亮了。
- #include<STC15.H>
- #include<intrins.h>
- sbit S1=P3^0;
- sbit S2=P3^5;
- sbit SER=P3^1;
- sbit RCLK=P3^2;
- sbit SRCLK=P3^3;//74HC595管腳定義
- sbit KEY=P3^4;
- //全局變量表
- unsigned char code smgduan[10]={0xf5,0x05,0xb3,0x97,0x47,0xd6,0xf6,0x85,0xf7,0xd7};//給74HC595的段選值
- unsigned char Display_Time[4]={0,0,0,0};
- unsigned int time=0;
- unsigned char cnt=0;//定時器周期計數
- bit point=1;
- /*##############################################################################################
- 設計名稱:簡易一小時計時器
- 設計者:清河
- 平臺:STC15F104W
- 硬件部分
- 數碼管顯示:位選使用74HC138改為2-4線譯碼、段選使用74HC595減少IO口使用
- 使用4位共陰極數碼管,時鐘數碼管,顯示無符號位
- 注意:為盡可能保證精度,晶振選取12MHz
- ##############################################################################################*/
- void delay(unsigned int cnt)//調用該函數進行一段時間的延時
- {
- while(cnt--);
- }
- void Timer0Init(void) //5毫秒@12.000MHz
- {
- EA=1;
- ET0=1;
- AUXR |= 0x80; //定時器時鐘1T模式
- TMOD &= 0xF0; //設置定時器模式
- TL0 = 0xA0; //設置定時初值
- TH0 = 0x15; //設置定時初值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- }
- void hc595send(unsigned char dat)//使用SPI向74HC595發送一個字節的數據
- {
- unsigned char a;
- SRCLK=0;
- RCLK=0;
- for(a=0;a<8;a++)
- {
- SER=dat>>7;
- dat<<=1;
- SRCLK=1;
- _nop_();
- _nop_();
- SRCLK=0;
- }
- RCLK=1;
- _nop_();
- _nop_();
- RCLK=0;
- }
- void smgdisplay()//數碼管顯示函數,參數為需要顯示的數組
- {
- unsigned char i;
- for(i=0;i<4;i++)
- {
- switch(i)//位選,選擇點亮的數碼管
- {
- case(0):
- S1=0;S2=1; break;
- case(1):
- S1=1;S2=0; break;
- case(2):
- S1=0;S2=0; break;
- case(3):
- S1=1;S2=1; break;
- }
- if(point)
- {
- hc595send(smgduan[Display_Time[i]]|0x08);
- }
- else
- {
- hc595send(smgduan[Display_Time[i]]);
- }
- delay(10); //間隔一段時間掃描
- hc595send(0x00);//消隱
- }
- }
- void main()
- {
- Timer0Init();
- while(1)
- {
- Display_Time[0]=(time/60)/10;
- Display_Time[1]=(time/60)%10;
- Display_Time[2]=(time%60)/10;
- Display_Time[3]=(time%60)%10;
- smgdisplay();
-
- if(KEY==0)
- {
- delay(5000);
- if(KEY==0)
- {
- TR0=!TR0;
- point=1;
- }
- while(!KEY);
- }
- }
- }
- void Timer0() interrupt 1
- {
- TL0 = 0xA0; //設置定時初值
- TH0 = 0x15; //設置定時初值
-
- if(cnt==200)//計數到1s
- {
- cnt=0;//清空
- point=1;//秒閃爍:亮
- time++;//時間加1秒
- }
- else
- {
- if(cnt==100)//當計數半秒
- {
- point=0;//秒閃爍:滅
- }
- cnt++;
- }
-
- if(time==3600)//滿值清空
- {
- time=0;
- }
- }
復制代碼 插入的代碼似乎格式有問題,復制應該不影響編譯,但建議下載源代碼。
備注:由于該作品的耗電量很小,故使用“充滿自停”的移動電源供電時,可能會出現一段時間后自動停止供電的情況,解決辦法是使用無充電保護的移動電源或者增加作品負載(加幾個燈什么的...)
凌凈清河
雖然程序很簡單,不用回帖就可以下載,但是還是很期待大家的評論呢!
簡易一小時計時器 凌凈清河.zip
(23.53 KB, 下載次數: 42)
2018-10-8 22:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|