找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7472|回复: 4
收起左侧

单片机四位数码管可调时钟

  [复制链接]
ID:350812 发表于 2018-6-14 16:56 | 显示全部楼层 |阅读模式
四位数码管可调时钟(1)

/**** 本程序中,晶振为12MHz,           ****/
/**** 时间控制采用定时中断控制方式。  ****/
/**** 模式和时间调整采用查询方式。    ****/

  1. #include<reg52.h>

  2. sbit P20=P2^0;              //分个位控制端
  3. sbit P21=P2^1;              //分十位控制端
  4. sbit P22=P2^2;              //时个位控制端
  5. sbit P23=P2^3;              //时十位控制端
  6. sbit led=P2^7;              //second display led

  7. sbit key0=P3^0;              //模式设置
  8. sbit key1=P3^1;              //加
  9. sbit key2=P3^2;              //减

  10. unsigned char hour,min,sec,T50ms;
  11. unsigned char modstate;              //模式状态

  12. unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//段码

  13. void init();                                                        //初始化子程序声明
  14. void delay500us(unsigned char X);              //延时子程序声明
  15. void display();                                                        //显示子程序声明
  16. void display001();                                          //显示子程序声明
  17. void display002();                                          //显示子程序声明
  18. void keyscan();                                                        //按键识别子程序声明

  19. void main()
  20. {              
  21.               init();
  22.               while(1)
  23.               {
  24.                             keyscan();            
  25.               }
  26. }

  27. void init()              //初始化子程序
  28. {            
  29.               TMOD=0x01;
  30.               TH0=(65536-49990)/256;
  31.               TL0=(65536-49990)%256;
  32.               ET0=1;
  33.               EA=1;
  34.               TR0=1;            
  35. }

  36. void delay500us(unsigned char X)
  37. {
  38.               unsigned char i,j;
  39.               for(i=X;i>0;i--)
  40.               for(j=248;j>0;j--);
  41. }

  42. void timer0() interrupt 1              //timer0中断服务子程序,定时时间为50ms,本程序加了10us的时间修正量
  43. {
  44.               TMOD=0x01;
  45.               TH0=(65536-49990)/256;            
  46.               TL0=(65536-49990)%256;

  47.               T50ms++;
  48.               if(T50ms>=20)
  49.               {
  50.                             T50ms=0;
  51.                             sec++;
  52.                             if(sec>=60)
  53.                             {
  54.                                           sec=0;
  55.                                           min++;
  56.                                           if(min>=60)
  57.                                           {
  58.                                                         min=0;
  59.                                                         hour++;
  60.                                                         if(hour>=24)hour=0;
  61.                                           }
  62.                             }
  63.               }
  64. }

  65. void display()
  66. {
  67.               P20=1;
  68.               P21=1;
  69.               P22=1;
  70.               P23=1;
  71.               P0=table[hour/10];
  72.               P23=0;
  73.               delay500us(5);

  74.               P20=1;
  75.               P21=1;
  76.               P22=1;
  77.               P23=1;
  78.               P0=table[hour%10];
  79.               P22=0;
  80.               delay500us(5);

  81.               P20=1;
  82.               P21=1;
  83.               P22=1;
  84.               P23=1;
  85.               P0=table[min/10];
  86.               P21=0;
  87.               delay500us(5);

  88.               P20=1;
  89.               P21=1;
  90.               P22=1;
  91.               P23=1;
  92.               P0=table[min%10];
  93.               P20=0;
  94.               delay500us(5);

  95.               if(T50ms<=10)led=0;
  96.               if(T50ms>10)led=1;
  97. }

  98. void display001()
  99. {
  100.               P20=1;
  101.               P21=1;
  102.               P22=1;
  103.               P23=1;
  104.               P0=table[hour/10];
  105.               P23=0;
  106.               delay500us(10);

  107.               P20=1;
  108.               P21=1;
  109.               P22=1;
  110.               P23=1;
  111.               P0=table[hour%10];
  112.               P22=0;
  113.               delay500us(10);
  114. }

  115. void display002()
  116. {
  117.               P20=1;
  118.               P21=1;
  119.               P22=1;
  120.               P23=1;
  121.               P0=table[min/10];
  122.               P21=0;
  123.               delay500us(10);

  124.               P20=1;
  125.               P21=1;
  126.               P22=1;
  127.               P23=1;
  128.               P0=table[min%10];
  129.               P20=0;
  130.               delay500us(10);
  131. }


  132. void keyscan()                            //按键识别钟程序
  133. {
  134.               while(modstate==0)
  135.               {
  136.                             display();
  137.                             if(key0==0)
  138.                             {
  139.                                           display();
  140.                                           if(key0==0)modstate++;                            //这两句加在一起为延时10ms软件防抖设计。
  141.                                           while(key0==0)display001();              //等待按键释放。
  142.                             }
  143.               }
  144. //****************************************************************************//
  145.               while(modstate==1)
  146.               {
  147.                             display001();
  148.                             if(key0==0)
  149.                             {
  150.                                           display001();
  151.                                           if(key0==0)modstate++;                            //这两句加在一起为延时10ms软件防抖设计。
  152.                                           while(key0==0)display002();              //等待按键释放。
  153.                             }

  154.                             if(key1==0)
  155.                             {
  156.                                           display001();
  157.                                           if(key1==0)
  158.                                           {
  159.                                                         hour++;
  160.                                                         if(hour>=24)hour=0;
  161.                                                         while(key1==0)display001();
  162.                                           }            
  163.                             }
  164.                             if(key2==0)
  165.                             {
  166.                                           display001();
  167.                                           if(key2==0)
  168.                                           {
  169.                                                         hour--;
  170.                                                         if(hour>=24)hour=0;
  171.                                                         while(key2==0)display001();
  172.                                           }
  173.                             }
  174.               }
  175. //****************************************************************************//
  176.               while(modstate==2)
  177.               {
  178.                             display002();
  179.                             if(key0==0)
  180.                             {
  181.                                           display002();
  182.                                           if(key0==0)modstate=0;                            //这两句加在一起为延时10ms软件防抖设计。
  183.                                           while(key0==0)display();              //等待按键释放。
  184.                             }

  185.                             if(key1==0)
  186.                             {
  187.                                           display002();
  188.                                           if(key1==0)
  189.                                           {
  190.                                                         min++;
  191.                                                         if(min>=60)min=0;
  192.                                                         while(key1==0)display002();
  193.                                           }            
  194.                             }
  195.                             if(key2==0)
  196.                             {
  197.                                           display002();
  198.                                           if(key2==0)
  199.                                           {
  200.                                                         min--;
  201.                                                         if(min>=60)min=0;
  202.                                                         while(key2==0)display002();
  203.                                           }
  204.                             }
  205.               }
  206. }
复制代码


四位数码管秒闪烁可调时钟 (1).doc

801 KB, 下载次数: 58, 下载积分: 黑币 -5

回复

使用道具 举报

ID:240780 发表于 2018-10-8 00:00 | 显示全部楼层
想问问数码管是共阴的还是共阳的
回复

使用道具 举报

ID:433466 发表于 2018-12-18 17:03 | 显示全部楼层
想知道接数码管1.2.3.4的那四个三角是什么?
回复

使用道具 举报

ID:682093 发表于 2020-1-8 18:48 | 显示全部楼层
你好 如果再加上闹钟设置  应该怎么弄呢  大哥求解
回复

使用道具 举报

ID:863092 发表于 2020-12-18 21:56 来自手机 | 显示全部楼层
漫威 发表于 2018-10-8 00:00
想问问数码管是共阴的还是共阳的

是共阳极的啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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