找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 9392|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

簡(jiǎn)易一小時(shí)定時(shí)器 數(shù)碼管顯示

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
近些天圖書館收書,規(guī)定人離開座位不能超過15分鐘不然就會(huì)把書收走,所以制作了一個(gè)計(jì)時(shí)器,用來指示人離開的時(shí)長(zhǎng),按照最簡(jiǎn)需求設(shè)計(jì),計(jì)時(shí)時(shí)長(zhǎng)為1小時(shí),超出時(shí)間清零。
附帶了一個(gè)按鍵,用于計(jì)時(shí)過程中的暫停,這樣這個(gè)計(jì)時(shí)器可以當(dāng)作秒表使用了,做個(gè)題什么的限制一下時(shí)間又不用占用手機(jī)。而且最關(guān)鍵的是小巧,看起來不會(huì)太蠢...






說明:
1.單片機(jī)使用STC15F104W,共有6個(gè)I/O
2.數(shù)碼管為時(shí)鐘樣式的數(shù)碼管,中間帶有“:”的,焊接時(shí)按照最短路徑焊接,移植程序請(qǐng)考慮修改smgduan[10]的段選值
3.程序定時(shí)器0初始值是在12MHz晶振下的初始值,移植程序時(shí)請(qǐng)注意修改
4.數(shù)碼管采用74HC138+74HC595驅(qū)動(dòng),595典型連接方式到單片機(jī)普通I/O,138改為2-4線驅(qū)動(dòng),S2=0,Y0~Y3進(jìn)行位選
5.清零操作就重新上電就好啦,畢竟是最簡(jiǎn)需求嘛
6.整個(gè)板子需要4根跳線,分別是
    74HC595的SRCLR'到VCC
    74HC138的S2到GND
    板子連接時(shí)138譯碼器GND到供電地的跳線
    板子背面使用較硬鐵絲(剪下的元件引線)連接數(shù)碼管第4位到138譯碼器Y3

程序設(shè)計(jì)思路:
初始化一個(gè)5ms的定時(shí)器,每計(jì)數(shù)200次為1s,每秒將時(shí)間值變量加一,在主程序中循環(huán)處理這個(gè)數(shù)據(jù),對(duì)60取模得到分鐘數(shù),取余得到秒數(shù)。
將所取到的分鐘和秒按位取出,得到待顯示的每一位數(shù)據(jù),存放在Display_time[4]數(shù)組中。調(diào)用數(shù)碼管顯示函數(shù)進(jìn)行顯示。
在循環(huán)中加入一個(gè)按鍵檢測(cè),如果按鍵按下,就將定時(shí)器運(yùn)行位取反,實(shí)現(xiàn)暫停效果。
設(shè)定一個(gè)標(biāo)志位point,每秒的前一半令其為1,后一半令其為0,在顯示函數(shù)中對(duì)這一位進(jìn)行判斷,決定數(shù)碼管小數(shù)點(diǎn)位是否亮。
注意:時(shí)鐘數(shù)碼管的中間“:”是第二位小數(shù)點(diǎn),但是為了簡(jiǎn)便,將所有小數(shù)點(diǎn)全部點(diǎn)亮了。

  1. #include<STC15.H>
  2. #include<intrins.h>
  3. sbit S1=P3^0;
  4. sbit S2=P3^5;
  5. sbit SER=P3^1;
  6. sbit RCLK=P3^2;
  7. sbit SRCLK=P3^3;//74HC595管腳定義
  8. sbit KEY=P3^4;

  9. //全局變量表
  10. unsigned char code smgduan[10]={0xf5,0x05,0xb3,0x97,0x47,0xd6,0xf6,0x85,0xf7,0xd7};//給74HC595的段選值
  11. unsigned char Display_Time[4]={0,0,0,0};
  12. unsigned int time=0;
  13. unsigned char cnt=0;//定時(shí)器周期計(jì)數(shù)
  14. bit point=1;
  15. /*##############################################################################################
  16. 設(shè)計(jì)名稱:簡(jiǎn)易一小時(shí)計(jì)時(shí)器
  17. 設(shè)計(jì)者:清河

  18. 平臺(tái):STC15F104W
  19. 硬件部分
  20. 數(shù)碼管顯示:位選使用74HC138改為2-4線譯碼、段選使用74HC595減少IO口使用
  21.         使用4位共陰極數(shù)碼管,時(shí)鐘數(shù)碼管,顯示無(wú)符號(hào)位

  22. 注意:為盡可能保證精度,晶振選取12MHz
  23. ##############################################################################################*/
  24. void delay(unsigned int cnt)//調(diào)用該函數(shù)進(jìn)行一段時(shí)間的延時(shí)
  25. {
  26.         while(cnt--);
  27. }

  28. void Timer0Init(void)                //5毫秒@12.000MHz
  29. {
  30.         EA=1;
  31.         ET0=1;
  32.         AUXR |= 0x80;                //定時(shí)器時(shí)鐘1T模式
  33.         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  34.         TL0 = 0xA0;                //設(shè)置定時(shí)初值
  35.         TH0 = 0x15;                //設(shè)置定時(shí)初值
  36.         TF0 = 0;                //清除TF0標(biāo)志
  37.         TR0 = 1;                //定時(shí)器0開始計(jì)時(shí)
  38. }

  39. void hc595send(unsigned char dat)//使用SPI向74HC595發(fā)送一個(gè)字節(jié)的數(shù)據(jù)                                
  40. {  
  41.         unsigned char a;
  42.         SRCLK=0;
  43.         RCLK=0;
  44.         for(a=0;a<8;a++)
  45.         {
  46.                 SER=dat>>7;
  47.                 dat<<=1;
  48.                 SRCLK=1;
  49.                 _nop_();
  50.                 _nop_();
  51.                 SRCLK=0;       
  52.         }
  53.         RCLK=1;
  54.         _nop_();
  55.         _nop_();
  56.         RCLK=0;
  57. }

  58. void smgdisplay()//數(shù)碼管顯示函數(shù),參數(shù)為需要顯示的數(shù)組
  59. {
  60.         unsigned char i;
  61.         for(i=0;i<4;i++)
  62.         {
  63.                 switch(i)//位選,選擇點(diǎn)亮的數(shù)碼管
  64.                 {
  65.                         case(0):
  66.                                 S1=0;S2=1; break;
  67.                         case(1):
  68.                                 S1=1;S2=0; break;
  69.                         case(2):
  70.                                 S1=0;S2=0; break;
  71.                         case(3):
  72.                                 S1=1;S2=1; break;
  73.                 }
  74.                 if(point)
  75.                 {
  76.                         hc595send(smgduan[Display_Time[i]]|0x08);
  77.                 }
  78.                 else
  79.                 {
  80.                         hc595send(smgduan[Display_Time[i]]);
  81.                 }
  82.                 delay(10); //間隔一段時(shí)間掃描
  83.                 hc595send(0x00);//消隱
  84.         }
  85. }

  86. void main()
  87. {
  88.         Timer0Init();
  89.         while(1)
  90.         {
  91.                 Display_Time[0]=(time/60)/10;
  92.                 Display_Time[1]=(time/60)%10;
  93.                 Display_Time[2]=(time%60)/10;
  94.                 Display_Time[3]=(time%60)%10;
  95.                 smgdisplay();
  96.                
  97.                 if(KEY==0)
  98.                 {
  99.                         delay(5000);
  100.                         if(KEY==0)
  101.                         {
  102.                                 TR0=!TR0;
  103.                                 point=1;
  104.                         }
  105.                         while(!KEY);
  106.                 }
  107.         }
  108. }

  109. void Timer0() interrupt 1
  110. {
  111.         TL0 = 0xA0;                //設(shè)置定時(shí)初值
  112.         TH0 = 0x15;                //設(shè)置定時(shí)初值
  113.        
  114.         if(cnt==200)//計(jì)數(shù)到1s
  115.         {
  116.                 cnt=0;//清空
  117.                 point=1;//秒閃爍:亮
  118.                 time++;//時(shí)間加1秒
  119.         }
  120.         else
  121.         {
  122.                 if(cnt==100)//當(dāng)計(jì)數(shù)半秒
  123.                 {
  124.                         point=0;//秒閃爍:滅
  125.                 }
  126.                 cnt++;
  127.         }
  128.        
  129.         if(time==3600)//滿值清空
  130.         {
  131.                 time=0;
  132.         }
  133. }
復(fù)制代碼
插入的代碼似乎格式有問題,復(fù)制應(yīng)該不影響編譯,但建議下載源代碼。



備注:由于該作品的耗電量很小,故使用“充滿自!钡囊苿(dòng)電源供電時(shí),可能會(huì)出現(xiàn)一段時(shí)間后自動(dòng)停止供電的情況,解決辦法是使用無(wú)充電保護(hù)的移動(dòng)電源或者增加作品負(fù)載(加幾個(gè)燈什么的...)

凌凈清河

雖然程序很簡(jiǎn)單,不用回帖就可以下載,但是還是很期待大家的評(píng)論呢!
簡(jiǎn)易一小時(shí)計(jì)時(shí)器 凌凈清河.zip (23.53 KB, 下載次數(shù): 42)


評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
楊雪飛 + 15 洞洞板焊得不是一般了得,感謝分享,跳線在.

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:386381 發(fā)表于 2018-10-9 09:35 來自手機(jī) | 只看該作者
謝謝分享,非常適合我們菜鳥學(xué)習(xí)!

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

板凳
ID:97554 發(fā)表于 2018-10-9 11:39 | 只看該作者
洞洞板焊得不是一般了得,感謝分享,那根飛線在元件面跳過去就更美觀了,看著很舒適。

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15 感謝建議,以后會(huì)注意的!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

地板
ID:407306 發(fā)表于 2018-10-9 22:56 | 只看該作者
有點(diǎn)意思哦,弄來看看先

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

5#
ID:229361 發(fā)表于 2018-10-10 01:02 | 只看該作者
看起來不錯(cuò)哦~

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

6#
ID:670606 發(fā)表于 2019-12-22 19:56 | 只看該作者
謝謝樓主分享~感覺單片機(jī)有點(diǎn)小難ORZ
回復(fù)

使用道具 舉報(bào)

7#
ID:441155 發(fā)表于 2019-12-22 21:58 來自手機(jī) | 只看該作者
下載學(xué)習(xí)一下,謝謝分享
回復(fù)

使用道具 舉報(bào)

8#
ID:371895 發(fā)表于 2020-1-3 07:23 來自手機(jī) | 只看該作者
不錯(cuò)啊
回復(fù)

使用道具 舉報(bào)

9#
ID:97678 發(fā)表于 2020-1-3 09:54 | 只看該作者
很感興趣。能不能他提供原理圖?
回復(fù)

使用道具 舉報(bào)

10#
ID:362076 發(fā)表于 2020-1-3 20:18 | 只看該作者
jovew 發(fā)表于 2020-1-3 09:54
很感興趣。能不能他提供原理圖?

做的時(shí)候沒畫原理圖,不過一共就6根線,老哥你照著程序的位定義連就是了
回復(fù)

使用道具 舉報(bào)

11#
ID:97678 發(fā)表于 2020-1-4 09:22 | 只看該作者
凌凈清河 發(fā)表于 2020-1-3 20:18
做的時(shí)候沒畫原理圖,不過一共就6根線,老哥你照著程序的位定義連就是了

謝謝。。。。。。
回復(fù)

使用道具 舉報(bào)

12#
ID:95809 發(fā)表于 2020-1-4 18:34 來自手機(jī) | 只看該作者
可以更簡(jiǎn)化,用一片單片機(jī)就搞定。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表