找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1715|回复: 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 单片机教程网

快速回复 返回顶部 返回列表