找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5125|回复: 0
收起左侧

单片机数字钟(两个定时器,优先级)

[复制链接]
ID:332269 发表于 2018-11-14 16:22 | 显示全部楼层 |阅读模式
数字钟电路原理图如下:

效果图

效果图


单片机源程序如下:
  1. #include"reg51.h"

  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit k1 = P0^0;//按键调时间加一  秒
  5. sbit k2 = P0^1;                                //分
  6. sbit k3 = P0^2;                                //时
  7. sbit k4 = P0^7;             //暂停


  8. char code smduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,   //共阳
  9.                                         0x80,0x90,0xbf};        //0-9和-

  10. uchar ms = 0,sec = 0,min =0,hour = 12;//定义变量
  11. uchar i = 0;
  12. /**************延时函数,有参******/
  13. void delay(uchar h)//延时xms
  14. {
  15.         uchar k;
  16.                  for(;h > 0;h--)
  17.                         {
  18.                                  for(k = 110;k > 0;k--);
  19.                         }
  20. }

  21. /********定时器初始化************/
  22. void csh()
  23. {
  24.         TMOD = 0x11;//T0,T1工作方式1
  25.         TH1 = (65536 - 2500) / 256;           //给初值        T1给2.5ms
  26.         TL1 = (65536 - 2500) % 256;
  27.         TH0 = (65536 - 50000) / 256;                 //T0给50ms
  28.         TL0 = (65536 - 50000) % 256;
  29.         //开中断
  30.         ET1 = 1;
  31.         ET0 = 1;
  32.         EA = 1;
  33.         //二级中断嵌套令T0 50ms优先
  34.         PT0 = 1;
  35.         //开定时器
  36.         TR0 = 1;
  37.         TR1 = 1;
  38. }

  39. /****************按键函数*******/
  40. void key()
  41. {
  42.          if(k1 == 0) //秒
  43.          {
  44.                  delay(10);//延时10ms
  45.                 if(k1 == 0)
  46.                 {
  47.                         if(sec > 59) sec = 0;
  48.                         else sec++;                                                     
  49.                 }
  50.          while(k1 == 0);
  51.          }                                                        
  52.          if(k2 == 0)//分
  53.          {
  54.                  delay(10);//延时10ms,
  55.                 if(k2 == 0)
  56.                 {
  57.                         if(min > 59) min = 0;
  58.                         else min++;
  59.                 }
  60.          while(k2 == 0);
  61.          }
  62.          if(k3 == 0) //时
  63.          {
  64.                  delay(10);//延时10ms
  65.                 if(k3 == 0)
  66.                 {
  67.                         if(hour > 23) hour = 0;
  68.                         else hour++;
  69.                 }
  70.             while(k3 == 0);
  71.          }
  72.          if(k4 == 0)
  73.          {
  74.                  delay(10);//延时10ms
  75.                 if(k4 == 0)
  76.                 {
  77.                          TR0 = 0;
  78.                         TR1 = 0;
  79.                 }
  80.                 while(k4 == 0);
  81.          }
  82.        
  83.                

  84. }




  85. /***********定时器T0中断(产生时间数据)*********/
  86. void i_time() interrupt 1
  87. {
  88.         TH0 = (65536 - 50000) / 256;                 //初值
  89.         TL0 = (65536 - 50000) % 256;
  90.         if(ms > 19)        //1s时间到
  91.         {
  92.                 ms = 0;
  93.                 if(sec >59)        //1min时间到
  94.                         {
  95.                                 sec = 0;
  96.                                         if (min>59)//1h到
  97.                                         {
  98.                                                 min = 0;
  99.                                                 if(hour > 23) hour = 0;
  100.                                                 else hour++;
  101.                                         }
  102.                                         else min++;
  103.                         }
  104.                 else sec++;
  105.         }
  106.         else ms++;//50ms中断计数
  107.        
  108. }
  109. /***********定时器T1中断(产生动态扫描)*********/
  110. void t_display() interrupt 3
  111. {
  112.         TH1 = (65536 - 2500) / 256;//给初值        T1给2.5ms
  113.         TL1 = (65536 - 2500) % 256;       
  114.         i++;
  115.         if(i > 7) i =0;
  116.         switch(i)
  117.                 {
  118.                        
  119.                         case 0:P3 = 0x00; P2 = smduan[sec % 10]; P3 = 0x01;  //第0次中断,显示秒个位
  120.                                 break;
  121.                         case 1: P3 = 0x00;P2 = smduan[sec / 10]; P3 = 0x02;  //第1次中断,显示秒十位
  122.                                 break;
  123.                         case 2:P3 = 0x00; P2 = smduan[10]; P3 = 0x04;  //第2次中断,显示-
  124.                                 break;
  125.                         case 3:P3 = 0x00; P2 = smduan[min % 10]; P3 = 0x08;  //第3次中断,显示分个位
  126.                                 break;
  127.                         case 4: P3 = 0x00;P2 = smduan[min / 10]; P3 = 0x10;  //第4次中断,显示分十位
  128.                                 break;
  129.                         case 5: P3 = 0x00;P2 = smduan[10]; P3 = 0x20;  //第5次中断,显示-
  130.                                 break;
  131.                         case 6:P3 = 0x00; P2 = smduan[hour % 10]; P3 = 0x40;  //第6次中断,显示时个位
  132.                                 break;
  133.                         case 7:P3 = 0x00; P2 = smduan[hour / 10]; P3 = 0x80;  //第7次中断        ,显示时十位
  134.                                 break;
  135.                   }                                  
  136. }

  137. /***************主函数************/
  138. main()
  139. {
  140.         csh();
  141.         while(1)
  142.         {
  143.                 key();
  144.         }                                                       
  145. }
复制代码

所有资料51hei提供下载:
KEIL.zip (25.43 KB, 下载次数: 33)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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