找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2467|回復: 12
打印 上一主題 下一主題
收起左側

單片機電子鐘,有沒有人可以提供下思路呀

[復制鏈接]
回帖獎勵 16 黑幣 回復本帖可獲得 2 黑幣獎勵! 每人限 2 次
跳轉到指定樓層
樓主
ID:565961 發(fā)表于 2020-6-9 21:24 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
題目是要求電子鐘設置一個開機控制顯示按鍵、一個時/分切換按鍵、一個加 1 按鍵,每到整點蜂鳴器鳴響,用 6 位一體數(shù)碼管顯示時、分、秒,開機顯示 12:00:00。給定單片機頻率為 11.0592MHz。設計硬件電路圖并在 Protel 上繪制原理圖和 PCB 圖,在 Keil 中編寫代碼并在 Proteus 上做出仿真。
基礎很差,臨時學有點大海撈針的感覺,求好心人指導一下涉及了哪些知識點哇,我去康康,復習復習
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:774455 發(fā)表于 2020-6-9 22:52 | 只看該作者

  1. #include <reg51.h>
  2. #include <intrins.h>

  3. unsigned char data dis_digit;
  4. unsigned char key_s, key_v;

  5. unsigned char code dis_code[11]={0x3f,0x06,0x5b,0x4f,
  6.                                 0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x00};
  7. unsigned char data dis_buf[6];
  8. unsigned char data dis_index;
  9. unsigned char hour,min,sec;
  10. unsigned char sec100;

  11. sbit        K1 = P1^4;
  12. sbit        K2 = P1^5;

  13. bit scan_key();
  14. void proc_key();
  15. void inc_sec();
  16. void inc_min();
  17. void inc_hour();
  18. void display();
  19. void delayms(unsigned char ms);

  20. void main(void)
  21. {
  22.         P0 = 0x00;
  23.         P2 = 0x00;
  24.         TMOD = 0x11;                // 定時器0, 1工作模式1, 16位定時方式
  25.         TH1 = 0xdc;
  26.         TL1 = 0;

  27.         TH0 = 0xFC;
  28.         TL0 = 0x17;
  29.        
  30.         hour = 12;
  31.         min = 00;

  32.         sec = 00;
  33.         sec100 = 0;
  34.        
  35.         dis_buf[0] = dis_code[hour / 10];                // 時十位
  36.         dis_buf[1] = dis_code[hour % 10];                // 時個位
  37.         dis_buf[2] = dis_code[min / 10];                // 分十位
  38.         dis_buf[3] = dis_code[min % 10];                // 分個位
  39.         dis_buf[4] = dis_code[sec / 10];                // 秒十位
  40.         dis_buf[5] = dis_code[sec % 10];                // 秒個位
  41.                        
  42.         dis_digit = 0xfe;
  43.         dis_index = 0;
  44.        
  45.         TCON = 0x01;
  46.         IE = 0x8a;                                // 使能timer0,1 中斷
  47.        
  48.         TR0 = 1;
  49.         TR1 = 1;

  50.         key_v = 0x03;

  51.         while(1)
  52.         {
  53.                 if(scan_key())
  54.                 {
  55.                         delayms(10);
  56.                         if(scan_key())
  57.                         {
  58.                                 key_v = key_s;
  59.                                 proc_key();
  60.                         }
  61.                 }
  62.                
  63.         }
  64. }

  65. bit scan_key()
  66. {
  67.         key_s = 0x00;
  68.         key_s |= K2;
  69.         key_s <<= 1;
  70.         key_s |= K1;
  71.         return(key_s ^ key_v);       

  72. }

  73. void proc_key()
  74. {
  75.         EA = 0;
  76.         if((key_v & 0x01) == 0)                // K1
  77.         {
  78.                 inc_hour();
  79.         }
  80.         else if((key_v & 0x02) == 0)        // K2
  81.         {
  82.                 min++;
  83.                 if(min > 59)
  84.                 {
  85.                         min = 0;
  86.                 }
  87.                 dis_buf[2] = dis_code[min / 10];                // 分十位
  88.                 dis_buf[3] = dis_code[min % 10];                // 分個位
  89.         }

  90.         EA = 1;
  91. }

  92. void timer0() interrupt 1
  93. // 定時器0中斷服務程序, 用于數(shù)碼管的動態(tài)掃描
  94. // dis_index --- 顯示索引, 用于標識當前顯示的數(shù)碼管和緩沖區(qū)的偏移量
  95. // dis_digit --- 位選通值, 傳送到P2口用于選通當前數(shù)碼管的數(shù)值, 如等于0xfe時,
  96. //                                選通P2.0口數(shù)碼管
  97. // dis_buf   --- 顯于緩沖區(qū)基地址       
  98. {
  99.         TH0 = 0xFC;
  100.         TL0 = 0x17;
  101.        

  102.         P0 = dis_buf[dis_index];                        // 顯示代碼傳送到P0口
  103.         P2 = dis_digit;                                                //

  104.         dis_digit = _crol_(dis_digit,1);        // 位選通值左移, 下次中斷時選通下一位數(shù)碼管
  105.         dis_index++;                                                //
  106.         if(dis_index == 0x06)                // 6個數(shù)碼管全部掃描完一遍之后,再回到第一個開始
  107.         {                           // 掃描
  108.                 dis_index = 0;


  109.                 dis_digit = 0xfe;
  110.         }
  111. }

  112. void timer1() interrupt 3
  113. {
  114.         TH1 = 0xdc;
  115.        
  116.         sec100++;
  117.        
  118.         if(sec100 >= 100)
  119.         {
  120.                 sec100 = 0;
  121.                 inc_sec();
  122.         }
  123. }

  124. void inc_sec()
  125. {
  126.         sec++;
  127.         if(sec > 59)
  128.         {
  129.                 sec = 0;
  130.                 inc_min();
  131.         }
  132.         dis_buf[4] = dis_code[sec / 10];                // 秒十位
  133.         dis_buf[5] = dis_code[sec % 10];                // 秒個位       
  134. }

  135. void inc_min()
  136. {
  137.         min++;
  138.         if(min > 59)
  139.         {
  140.                 min = 0;
  141.                 inc_hour();
  142.         }
  143.         dis_buf[2] = dis_code[min / 10];                // 分十位
  144.         dis_buf[3] = dis_code[min % 10];                // 分個位
  145. }

  146. void inc_hour()

  147. {
  148.         hour++;
  149.         if(hour > 23)
  150.         {
  151.                 hour = 0;
  152.         }
  153.         if(hour > 9)
  154.                 dis_buf[0] = dis_code[hour / 10];                // 時十位
  155.         else
  156.                                                                      
  157.                 dis_buf[0] = 0x00;                                        // 當小時的十位為0時不顯示
  158.         dis_buf[1] = dis_code[hour % 10];                // 時個位

  159. }


  160. void delayms(unsigned char ms)       
  161. // 延時子程序
  162. {                                               
  163.         unsigned char i;
  164.         while(ms--)
  165.         {
  166.                 for(i = 0; i < 120; i++);
  167.         }
  168. }
復制代碼
回復

使用道具 舉報

板凳
ID:774455 發(fā)表于 2020-6-9 22:52 | 只看該作者
我的簡易數(shù)字鐘的源代碼 希望能幫到你。
回復

使用道具 舉報

地板
ID:732506 發(fā)表于 2020-6-10 05:58 | 只看該作者
看下這個,很像改改就可以了。 http://www.torrancerestoration.com/bbs/dpj-186609-1.html
回復

使用道具 舉報

5#
ID:584814 發(fā)表于 2020-6-10 08:04 | 只看該作者
不想動腦上淘寶呀
回復

使用道具 舉報

6#
ID:774629 發(fā)表于 2020-6-10 08:49 | 只看該作者
原來有人和我一樣無助
回復

使用道具 舉報

7#
ID:774709 發(fā)表于 2020-6-10 10:45 | 只看該作者
可以在網上找找資料再配合B站視頻
回復

使用道具 舉報

8#
ID:565961 發(fā)表于 2020-6-10 17:32 | 只看該作者
fatetl 發(fā)表于 2020-6-9 22:52
我的簡易數(shù)字鐘的源代碼 希望能幫到你。

好噠,謝謝我會參考噠
回復

使用道具 舉報

9#
ID:565961 發(fā)表于 2020-6-10 17:34 | 只看該作者
黑衣天王J 發(fā)表于 2020-6-10 10:45
可以在網上找找資料再配合B站視頻

好噠,謝謝
回復

使用道具 舉報

10#
ID:782358 發(fā)表于 2020-6-17 18:24 | 只看該作者
時鐘的走時涉及定時器
回復

使用道具 舉報

11#
ID:633896 發(fā)表于 2020-7-7 12:00 | 只看該作者
這是我的一個時鐘。 你可以拿去參考參考。

20172308魏海龍.zip

81.09 KB, 下載次數(shù): 12

回復

使用道具 舉報

12#
ID:633896 發(fā)表于 2020-7-7 12:02 | 只看該作者
我上傳了 信息 看到了木有
回復

使用道具 舉報

13#
ID:633896 發(fā)表于 2020-7-7 12:02 | 只看該作者
內存太大了

20172308魏海龍.zip

81.09 KB, 下載次數(shù): 5

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表