找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的时钟设计,包涵源码及仿真电路

[复制链接]
跳转到指定楼层
楼主
ID:197252 发表于 2018-10-29 15:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是我这个周用单片机做的时钟,用数码管显示,用定时器来即时。 Clock.zip (93.36 KB, 下载次数: 15)



单片机源程序:
  1. #include"reg51.h"
  2. #define uchar unsigned char
  3. uchar code scan_con[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  4. uchar code dis_7[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
  5.                                         0x80,0x90,0xff,0xbf};
  6. uchar data dis[8]={0x00,0x00,0x0b,0x00,0x00,0x0b,0x00,0x00};
  7. uchar data timedata[3]={0x00,0x00,0x00};
  8. //timedata[0]: 秒计数       timedata[1] :分计数       timedata[2] :小时计数
  9. uchar data ms50=0x00,con=0x00,con1=0x00,con2=0x00;
  10. //ms50:每过50ms加一    con按键按下计数 为1 改变分钟  为2改变小时
  11. //con1   con2
  12. sbit key0=P1^0;
  13. sbit key1=P1^1;
  14. sbit key2=P1^2;
  15. void delay1ms(int t)   
  16. {
  17.     unsigned char a,b;
  18.         for(b=0;b<t;b++)
  19.             for(a=0;a<120;a++);
  20. }
  21. void keyscan()         //按键检测函数
  22. {
  23. EA=0; //关闭总中断
  24. if(key0==0) //判断按键是否按下
  25. {
  26. delay1ms(10); //延时消抖
  27. while(key0==0); //等待按键释放
  28. con++;  //计数值加
  29.         TR0=0; //关闭定时器0
  30.         ET0=0;  //关闭定时器0中断
  31. if(con>=3)  //若按下3次
  32. {
  33.    con=0; //计数值清0
  34.          TR0=1; //开启定时器
  35.          ET0=1; //开启定时器中断
  36. }
  37. }
  38.    if(con!=0) //若按键0按下一次
  39.      {
  40.           if(key1==0) //如果按键1按下
  41.        {
  42.               delay1ms(10); //延时消抖
  43.                           while(key1==0);     //等待按键释放
  44.               timedata[con]++; //(分/时)自加
  45.                           if(con==2)             //若按下两次
  46.                           con1=24;               
  47.                           else con1=60;
  48.                           if(timedata[con]>=con1) //若加到最大值则将0赋值给变量
  49.                           timedata[con]=0;
  50.          }  
  51.          }
  52.         if(con!=0)
  53.      {
  54.           if(key2==0)
  55.        {
  56.               delay1ms(10);
  57.                           while(key2==0);
  58.               timedata[con]--;
  59.                           if(con==2)
  60.                           con1=23;
  61.                           else con1=59;
  62.                           if(timedata[con]<=0)
  63.                           timedata[con]=con1; //若减到最小值0则将最大值付给变量
  64.          }  
  65.          }
  66.          EA=1;
  67. }
  68. void scan()
  69.    {
  70.       char k;
  71.           dis[0]=timedata[0]%10; //显示秒个位数据
  72.           dis[1]=timedata[0]/10; //显示秒十位数据
  73.           dis[3]=timedata[1]%10; //显示分个位数据
  74.           dis[4]=timedata[1]/10; //显示分十位数据
  75.           dis[6]=timedata[2]%10; //显示时个位数据
  76.           dis[7]=timedata[2]/10; //显示时十位数据
  77.           for(k=0;k<8;k++)
  78.             {
  79.                   P0=~dis_7[dis[k]]; //段选端
  80.                   P2=scan_con[k];   //位选端
  81.                    delay1ms(1);     
  82.                    P2=0xff;                                        //消影
  83.                 }
  84.    }
  85. void main(void)
  86. {
  87.   TMOD=0X01;     //开启定时器0
  88.   TH0=0X3C;      //选择工作方式2
  89.   TL0=0XB0;      //载入高位初值
  90.   TR0=1;         //载入低位初值
  91.   ET0=1;         //开启定时器中断0
  92.   EA=1;          //全局中断使能
  93.   while(1)
  94.   {
  95.    scan();
  96.    keyscan();
  97.   }
  98. }
  99. void time_intt0(void) interrupt 1
  100. {
  101.      ET0=0;   //关闭定时器0中断
  102.            TR0=0;                //
  103.      TH0=0X3C;
  104.      TL0=0XB0;
  105.          TR0=1;       //
  106.          ms50++;     //50毫秒计数
  107.          if(ms50==20)  //1秒
  108.            {
  109.              ms50=0x00;
  110.                  timedata[0]++;
  111.                   if(timedata[0]==60)
  112.                    {
  113.                      timedata[0]=0;
  114.                          timedata[1]++;
  115.                          if(timedata[1]==60)
  116.                       {
  117.                         timedata[1]=0;
  118.                             timedata[2]++;
  119.                           if(timedata[2]==24)
  120.                       {
  121.                         timedata[2]=0;
  122.                       }
  123.                    }
  124.            }
  125. }
  126. ET0=1;
  127. }
复制代码


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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