久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機單計時器 調做時鐘,求給個思路

[復制鏈接]
跳轉到指定樓層
樓主
  1. #include "BS87D20A-3.h"
  2. #define com1    _pc1
  3. #define com2        _pc0
  4. #define com3        _pc2
  5. #define com4        _pc3
  6. #define key1    _pd2
  7. #define key2        _pd3
  8. #define key3        _pa1
  9. #define key4    _pa4
  10. volatile bit Flag_T1ms;
  11. volatile bit Flag_T5ms;
  12. volatile bit flag_keylong;
  13. volatile bit flag_keyshort;

  14. const unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  15. unsigned char strtab[3];//緩沖區
  16. unsigned char key_number=0;
  17. unsigned char sec=0,min=0,hour=0;
  18. unsigned char temp;
  19. unsigned long s;  //秒級
  20. unsigned long ms5;

  21. unsigned char keyvalue;
  22. void read_key()
  23. {  
  24.         static char key_state=0x00,press_20ms;
  25.     unsigned char        keybak;        
  26.     keybak=0;
  27.         if(!key1)keybak|=0x01;
  28.         if(!key2)keybak|=0x02;
  29.         if(!key3)keybak|=0x04;
  30.         if(!key4)keybak|=0x08;

  31.     switch (key_state)
  32.     {
  33.         case 0x00:                 // 按鍵初始態
  34.                 if (keybak!=0)
  35.                         {        
  36.                                 press_20ms=0;
  37.                                 key_state=0x01; // 鍵被按下,狀態轉換到鍵確認態
  38.                                 
  39.                 }
  40.                         break;               
  41.         case 0x01:                  // 按鍵確認態
  42.             if (keybak!=0)
  43.             {
  44.                     if(++press_20ms>3)
  45.                     {
  46.                             key_state=0x02;
  47.                             press_20ms=0;
  48.                             keyvalue=keybak;               
  49.                     }
  50.             }
  51.             else
  52.             {
  53.                     key_state=0x00;        
  54.             }
  55.             break;
  56.                 case 0x02:
  57.                         if (keybak==0)
  58.                         {
  59.                                 flag_keyshort=1;
  60.                         }
  61.                         else if(++press_20ms>100)
  62.                         {
  63.                                 flag_keylong=1;
  64.                         }        
  65.         case 0x04:
  66.             if(keybak==0)
  67.             {
  68.                     if(++press_20ms>3)
  69.                     {
  70.                             key_state=0x00;
  71.                     }
  72.             }
  73.             else
  74.             {
  75.                     press_20ms=0;
  76.             }
  77.             break;
  78.         
  79.         default:
  80.                 break;
  81.    }
  82. }
  83. void key_do()
  84. {
  85.         if(flag_keyshort)
  86.         {
  87.                 switch(keyvalue)
  88.                 {
  89.                         case 0x01:

  90.                                 break;
  91.                         case 0x02:
  92.                                 
  93.                                 break;
  94.                         case 0x04:
  95.                                 
  96.                                 break;
  97.                         case 0x08:
  98.                                 
  99.                                 break;
  100.                         default:
  101.                                 break;
  102.                 }
  103.                 flag_keyshort=0;
  104.         }
  105. }

  106. void displaypro()
  107. {
  108.         strtab[0]=tab[sec%10];
  109.         strtab[1]=tab[sec/10];
  110.         strtab[2]=tab[min%10];
  111.         strtab[3]=tab[min/10];

  112. }
  113. void display_drive()
  114. {
  115.         com1=1;com2=1;com3=1;com4=1;
  116.                     switch(temp)
  117.                 {
  118.                         case 0:com4=0;
  119.                          _pb=strtab[temp]; break;
  120.                         case 1:com3=0;
  121.                          _pb=strtab[temp]; break;
  122.                         case 2:com2=0;
  123.                          _pb=strtab[temp]; break;
  124.                         case 3:com1=0;
  125.                          _pb=strtab[temp]; break;
  126.                         default:break;
  127.                 }
  128.                 temp++;
  129.                 if(temp==4)
  130.                         temp=0;

  131. }
  132. void init()
  133. {
  134.     _ctm0c0=0x20;  // fh/16   2us         
  135.         _ctm0c1=0xc1; // 定時/計數器模式 比較器a ctm0
  136.         _ctm0al=0xf4; // 1ms
  137.     _ctm0ah=0x01;
  138.         
  139.         _ctm1c0=0x20;  // fh/16   2us         
  140.         _ctm1c1=0xc1; // 定時/計數器模式 比較器a ctm1
  141.         _ctm1al=0xf4; // 1ms
  142.     _ctm1ah=0x01;
  143.         
  144.         
  145.         
  146.          _pbc=0; //輸出
  147.          _pcc0=0;
  148.          _pcc1=0;
  149.          _pcc2=0;
  150.          _pcc3=0;
  151.          
  152.          _pac1=1;
  153.          _pac4=1;
  154.          _pdc2=1;
  155.          _pdc3=1;
  156.          _pdpu3=1;
  157.         _pdpu2=1;
  158.         _papu1=1;
  159.         _papu4=1;

  160.           s=1000;
  161.           ms5=5;
  162.          temp=0;
  163.         _mfe=1; //開多功能中斷
  164.         _ctm1ae=1;
  165.     _ctm0ae=1; //CTM a中斷使能
  166.         _emi=1;        //開總中斷
  167.         _ct0on=1; //開定時器0
  168.         _ct1on=1;
  169.         }
  170.         void main()
  171.         {
  172.                 init();
  173.                 while(1)
  174.                 {
  175.                         if(Flag_T5ms)
  176.                         {
  177.                                 Flag_T5ms=0;
  178.                                 read_key();
  179.                                  displaypro();
  180.                                 
  181.                         }
  182.         
  183.                         
  184.                         GCC_CLRWDT();
  185.                 }
  186.         }
  187.         
  188.         void __attribute__((interrupt(0x20))) ISR_CTM1(void)
  189.         {
  190.                 _ctm1af=0;
  191.                 ms5--;
  192.                 if(!ms5)
  193.                 {
  194.                         ms5=5;
  195.                         Flag_T5ms=1;
  196.                 }
  197.                 display_drive();
  198.                 s--;
  199.                 if(! s)
  200.                 {   
  201.                         
  202.                         s=1000;//1s電子鐘計數
  203.                         sec++;        
  204.                         if(sec==60)
  205.                         {
  206.                                sec=0;
  207.                                min++;
  208.                                if(min==60)
  209.                                {
  210.                                         min=0;
  211.                                          hour++;
  212.                                         if(hour==24)
  213.                                         {
  214.                                                   hour=0;
  215.                                         }               
  216.                                }
  217.                        }        
  218.                 }
  219.                
  220.         }
  221.         
  222.         void __attribute__((interrupt(0x14))) ISR_CTMO(void)
  223.         {
  224.                 _ctm0af=0;
  225.                
  226.         }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:111634 發表于 2018-7-7 15:34 | 只看該作者
本帖最后由 zl2168 于 2018-7-7 15:35 編輯

給你介紹一個正確有效看得懂的參考案例,自己對照查錯吧!
實例94  模擬電子鐘(由80C51定時器產生秒時基)

Proteus仿真一下,確認有效。 實例94 模擬電子鐘(由80C51定時器產生秒時基).rar (43.05 KB, 下載次數: 4)
以上摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil CProteus》清華大學出版社ISBN 978-7-302-41682-1,內有常用的單片機應用100案例,用于仿真實驗操作,電路與程序真實可靠可信可行。書中電路和程序設計有詳細說明,程序語句條條有注解。

評分

參與人數 1黑幣 +3 收起 理由
6278779JJJ + 3 很給力!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品视频网站 | 亚洲欧美日本在线 | 一区二区三区国产精品 | 黄视频免费 | h视频免费在线观看 | 欧美日韩一区二区在线观看 | 国产精品久久久久久婷婷天堂 | 韩国精品一区二区三区 | 国内在线视频 | 久久国产精品视频免费看 | 日韩久久中文字幕 | 91综合网| 成人午夜网 | 国产精品久久久久免费 | 大乳boobs巨大吃奶挤奶 | 日韩三级 | 亚洲综合热 | 日韩在线免费视频 | 欧美一区 | 国产精品久久久久无码av | 精品三区| 日韩中文欧美 | 国产在线视频一区二区董小宛性色 | 成人在线观看网站 | 7777奇米影视 | 久久久精彩视频 | 国产高清视频一区 | 久久成人免费视频 | 成人欧美一区二区三区在线播放 | 欧美日韩综合 | 欧美激情久久久 | 视频在线观看亚洲 | 久久久久久黄 | www.色午夜.com | 国产精品国产a级 | a级片网站| 自拍偷拍第一页 | 国产丝袜一区二区三区免费视频 | www.四虎.com| 91偷拍精品一区二区三区 | 成人免费影院 |