找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1719|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机数码管时钟及闹铃时间可调

[复制链接]
跳转到指定楼层
楼主
ID:693144 发表于 2020-2-14 19:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /*-----------------------------------------------
  2. 实验名称:基于定时器T0的可调时钟、
  3. 接线说明:
  4.          LSA=>P2^2;
  5.          LSB=>P2^3;
  6.          LSC=>P2^4;
  7.          P0=>数码管位选
  8.          P3=>独立按键
  9. 实验现象:
  10.          数码管从00-00-00 (时-分-秒)开始计秒
  11.          K1  时钟+   K2    时钟-
  12.          K3    分钟+    K4    分钟-
  13. ------------------------------------------------*/
  14. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

  15. #define KeyPort P3 //定义按键端口
  16. #define u8 unsigned char
  17. #define u16 unsigned int
  18. //#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换

  19. //sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
  20. //sbit LATCH2=P2^3;//                 位锁存
  21. sbit LSA=P2^2;
  22. sbit LSB=P2^3;
  23. sbit LSC=P2^4;
  24. sbit beep=P1^5;

  25. unsigned char hour,minute,second;//定义时分秒

  26. bit UpdateTimeFlag;//定义读时间标志

  27. unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
  28. unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码

  29. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  30.                     0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值

  31. unsigned char TempData[8],Key_Num; //存储显示值的全局变量

  32. void DelayUs2x(unsigned char t);//us级延时函数声明
  33. void DelayMs(unsigned char t); //ms级延时
  34. void DigDisplay();//数码管显示函数
  35. unsigned char KeyScan(void);//键盘扫描
  36. void     Init_Timer0(void);//定时器初始化
  37. /*------------------------------------------------
  38.                     主函数
  39. ------------------------------------------------*/
  40. void delay(u16 i)
  41. {
  42.     while(i--);   
  43. }   
  44. /*--------------------------------------------------*/
  45. void main (void)
  46. {
  47. //unsigned char num;                  

  48.     Init_Timer0();
  49.     //Init_Timer1();  //定时器1初始化

  50. while (1)         //主循环
  51.   {
  52.    
  53.                     Key_Num=KeyScan();
  54.                     switch(Key_Num)
  55.                         {
  56.                                     case 1:hour++;if(hour==24)hour=0;     //正常时间 小时 加1
  57.                                         break;
  58.                                     case 2:hour--;if(hour==255)hour=23;   //正常时间 小时减1
  59.                                          break;
  60.                                     case 3:minute++;if(minute==60)minute=0;     //分钟加1
  61.                                          break;
  62.                                     case 4:minute--;if(minute==255)minute=59;   //分钟减1
  63.                                          break;
  64.                                     default:break;
  65.                         }
  66. //                    if(UpdateTimeFlag==1)
  67. //                     {
  68. //                                UpdateTimeFlag=0;

  69.                              TempData[0]=dofly_DuanMa[hour/10]; //时            //数据的转换,因我们采用数码管0~9的显示,将数据分开
  70.                              TempData[1]=dofly_DuanMa[hour%10];
  71.                              TempData[2]=0x40;                                    //加入"-"
  72.                              TempData[3]=dofly_DuanMa[minute/10];//分
  73.                              TempData[4]=dofly_DuanMa[minute%10];
  74.                              TempData[5]=0x40;
  75.                              TempData[6]=dofly_DuanMa[second/10];//秒
  76.                              TempData[7]=dofly_DuanMa[second%10];   
  77.                            
  78.                             DigDisplay();
  79. //                        }
  80.                     // DigDisplay();
  81. }
  82. }
  83. /*------------------------------------------------
  84. uS延时函数,含有输入参数 unsigned char t,无返回值
  85. unsigned char   是定义无符号字符变量,其值的范围是
  86. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  87. 长度如下 T=tx2+5 uS
  88. ------------------------------------------------*/
  89. void DelayUs2x(unsigned char t)
  90. {   
  91. while(--t);
  92. }
  93. /*------------------------------------------------
  94. mS延时函数,含有输入参数 unsigned char t,无返回值
  95. unsigned char 是定义无符号字符变量,其值的范围是
  96. 0~255 这里使用晶振12M,精确延时请使用汇编
  97. ------------------------------------------------*/
  98. void DelayMs(unsigned char t)
  99. {
  100.      
  101. while(t--)
  102. {
  103.      //大致延时1mS
  104.      DelayUs2x(245);
  105.        DelayUs2x(245);
  106. }
  107. }
  108. /*------------------------------------------------
  109. 显示函数,用于动态扫描数码管
  110. 输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
  111. 如输入0表示从第一个显示。
  112. Num表示需要显示的位数,如需要显示99两位数值则该值输入2
  113. ------------------------------------------------*/
  114. void DigDisplay()
  115. {
  116.     u8 i=0;
  117.     for(i=0;i<8;i++)
  118.     {
  119.         switch(i)     //位选,选择点亮的数码管,
  120.         {
  121.             case(0):
  122.                 LSA=0;LSB=0;LSC=0; break;//显示第0位
  123.             case(1):
  124.                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  125.             case(2):
  126.                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  127.             case(3):
  128.                 LSA=1;LSB=1;LSC=0; break;//显示第3位
  129.             case(4):
  130.                 LSA=0;LSB=0;LSC=1; break;//显示第4位
  131.             case(5):
  132.                 LSA=1;LSB=0;LSC=1; break;//显示第5位
  133.             case(6):
  134.                 LSA=0;LSB=1;LSC=1; break;//显示第6位
  135.             case(7):
  136.                 LSA=1;LSB=1;LSC=1; break;//显示第7位   
  137.         }
  138.         P0=TempData[i];//发送段码
  139.         delay(100); //间隔一段时间扫描   
  140.         P0=0x00;//消隐
  141.     //delay(1000);
  142.     }
  143. }
  144. /*------------------------------------------------
  145.                     定时器初始化子程序
  146. ------------------------------------------------*/
  147. void Init_Timer0(void)
  148. {
  149. TMOD |= 0x01;      //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响            
  150. //TH0=0x00;          //给定初值
  151. //TL0=0x00;
  152. EA=1;            //总中断打开
  153. ET0=1;           //定时器中断打开
  154. TR0=1;           //定时器开关打开
  155. }
  156. /*------------------------------------------------
  157.                  定时器中断子程序
  158. ------------------------------------------------*/
  159. void Timer0_isr(void) interrupt 1
  160. {
  161. static unsigned int num,i;
  162. TH0=(65536-2000)/256;//重新赋值 2ms
  163. TL0=(65536-2000)%256;

  164. // DigDisplay();     // 调用数码管扫描
  165. i++;

  166.     if(hour==0,minute==1&&second<=3)
  167.     {
  168.     beep=~beep;
  169.    
  170. /*        if(i>=1000)                //持续时间
  171.         {
  172.                 i=0;                //计数清0                                
  173.                 beep=0;                //蜂鸣器端口复位
  174.                 TR0 = 0;
  175.                                 //定时器0关闭
  176.         }    */
  177.     }   

  178. if(i==10)              //20ms更新一次
  179.     {
  180.     i=0;
  181.     UpdateTimeFlag=1;     //更新时间志位置1
  182.     }
  183. num++;
  184. if(num==500)        //大致1s
  185.    {
  186.     num=0;
  187.     second++;
  188.     if(second==60)          //秒到60,分钟加1
  189.      {
  190.       second=0;      
  191.       minute++;
  192.       if(minute==60)    //分钟到60,小时加1
  193.         {
  194.          minute=0;
  195.          hour++;
  196.          if(hour==24)        //小时到24,回零
  197.            hour=0;
  198.         }
  199.      }
  200.    
  201.   }
  202. }

  203. /*------------------------------------------------
  204. 按键扫描函数,返回扫描键值
  205. ----------------------------------------------*/
  206. unsigned char KeyScan(void)
  207. {
  208. unsigned char keyvalue;
  209. if(KeyPort!=0xff)
  210.    {
  211.     DelayMs(10);
  212.     if(KeyPort!=0xff)
  213.        {
  214.         keyvalue=KeyPort;
  215.         while(KeyPort!=0xff);
  216.         switch(keyvalue)
  217.         {
  218.          case 0xfe:return 1;break;
  219.          case 0xfd:return 2;break;
  220.          case 0xfb:return 3;break;
  221.          case 0xf7:return 4;break;
  222.          case 0xef:return 5;break;
  223.          case 0xdf:return 6;break;
  224.          case 0xbf:return 7;break;
  225.          case 0x7f:return 8;break;
  226.          default:return   0;break;
  227.         }
  228.       }
  229.    }
  230.    return 0;
  231. }
复制代码

任务4.zip

43.74 KB, 下载次数: 21, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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