找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机-数码管小时钟制作

  [复制链接]
跳转到指定楼层
楼主
ID:80436 发表于 2015-5-20 14:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
项目:简单的时钟(2015-2-23

设计要求:带冒号的4位数码管显示时间(MT05643DR)、按键设置时间




分析:本例是简单的时钟,因此采用单片机定时器提供时钟源。时间设置采用按键调节,用两个按键,一个负责小时的增加设置,另一个负责分钟的增加。
单片机用STC12C2052AD20脚,晶振采用12M
引脚分配:P1.0----P1.7  a b c d e f g :
P3.0 按键1 数码管小时加1按键
P3.1 按键2 数码管上分钟加1设置按键
P3.2----P3.5  4位数码管  
程序流程:
  1. #include <reg52.h>

  2. sbit Key1=P3^0;  //定义2个按键用于调整时间

  3. sbit Key2=P3^1;

  4. sbit Wei1=P3^2;     //四位数码管定义端口

  5. sbit Wei2=P3^3;     //

  6. sbit Wei3=P3^4;

  7. sbit Wei4=P3^5;



  8. unsigned char code LEDchar[]={

  9.        0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};    //数码管0-9真值表

  10. unsigned charLedBuff[4]={0xff,0xff,0xff,0xff}; //4位数码管显示数字缓存

  11. unsigned int ms=0;//定义毫秒全局变量

  12. unsigned char miao=0,fen=59,shi=23;//秒,分,时 全局变量

  13. bit keyst1=1;

  14. bit keyst2=1;

  15. bit backup1=1;

  16. bit backup2=1;

  17. void Time0int()//

  18. {

  19.        TMOD=0x01; //定时模式1,16位定时器

  20.        TH0=0xF8;//初值计算公式 65536-(定时时间(2ms=2000us)/1us(晶振12M的计数周期时间))=63536

  21.        TL0=0x30;//63536转换为16进制为 F830H 分配给定时器TH0 TL0 就可以了

  22.        EA=1;//开总中断

  23.        ET0=1;//打开定时器0中断

  24.        TR0=1;//定时器0开始运行

  25. }



  26. void ShowNumber(unsigned int num)  //显示数字函数,参数是1个短整形的数字num

  27. {

  28.        signedchar i;              //定义变量i用于循环数的位数

  29.        unsignedchar buf[4];       //定义一个数组用于保存分离出来各位的数据



  30.        for(i=0;i<4; i++)

  31.        {

  32.               buf[i]= num % 10;  

  33.               num= num / 10;

  34.        }                       //上面2个语句就是循环4次,把1个4位数进行按位分离后存放在数组buf中



  35.        for(i=3;i>=1; i--)         //进行首位是零,不显示

  36.        {

  37.               if(buf[i]== 0)     //如果首位是零,则把数码管显示缓存数据为0XFF,由于是共阳极数码管,如果数据是0xff 则数码管不显示

  38.               {

  39.                      LedBuff[i]= 0xFF;

  40.               }

  41.               else               //如果首位不是零,则跳出循环

  42.                      break;

  43.        }

  44.       

  45.        for(;i>=0; i--)           //i继承了上面语句的数值,把该位的数字通过Ledchar[buf[i]]数组,进行转换为该数字的显示数据并赋值给数码管显示缓存

  46.        {

  47.               LedBuff[i]= LEDchar[buf[i]];   

  48.        }



  49. }



  50. unsigned int num(unsigned charhour,unsigned char minute)  //2个8位数据类型变量,合并连接为16位数据来信变量

  51. {

  52.        unsignedint date;

  53.        date=100*hour+minute;

  54.        returndate;

  55. }



  56. void main()

  57. {

  58.        P1=LEDchar[0];

  59.        Time0int();//定时器初始化

  60.        while(1)

  61.        {

  62.               ShowNumber(num(shi,fen));

  63.               if(keyst1!=backup1)

  64.               {

  65.                      if(keyst1==0)

  66.                      {

  67.                             shi++;

  68.                      }

  69.                      backup1=Key1;

  70.               }

  71.              if(keyst2!=backup2)

  72.               {

  73.                      if(keyst2==0)

  74.                      {

  75.                             fen++;

  76.                      }

  77.                      backup2=Key2;

  78.               }

  79.        }   



  80. }



  81. void interruptTimer0() interrupt 1

  82. {

  83.        staticunsigned char i;

  84.        staticunsigned char keybuf1=0xff;

  85.        staticunsigned char keybuf2=0xff;

  86.        TH0=0xf8;     //定时器初值重新赋值

  87.        TL0=0x30;

  88.        ms++;            //利用2毫秒定时器中断来进行时间的累计并把累计次数赋值给时间变量

  89.        if(ms>=500)

  90.        {

  91.               ms=0;

  92.               miao++;

  93.        }

  94.        if(miao>=60)

  95.        {

  96.               miao=0;

  97.               fen++;

  98.        }

  99.        if(fen>=60)

  100.        {

  101.               fen=0;

  102.               shi++;

  103.        }

  104.        if(shi>=24)

  105.        {

  106.               shi=0;

  107.        }

  108.        switch(i)//每次进入中断进行1位数码管的显示刷新,5次耗时10ms

  109.        {

  110.              case0: Wei4=1;Wei3=1;Wei1=0;i++;P1=LedBuff[3];break;

  111.             case1: Wei1=1;Wei2=0;i++;P1=LedBuff[2];break;

  112.            case 2:Wei2=1;Wei3=0;i++;P1=LedBuff[1];break;

  113.               case3: Wei3=1;Wei4=0;i++;P1=LedBuff[0];break;

  114.               case4:

  115.               {

  116.                      Wei3=0;i=0;

  117.                      if(ms<=250)

  118.                             P1=0x7F;  //显示数码管上的冒号

  119.                      else

  120.                          P1=0xff;  //关闭冒号

  121.                      break;

  122.               }

  123.               default:break;

  124.        }

  125.        keybuf1=(keybuf1<<1)|Key1;       //按键扫描利用中断每2ms检测1次按键状态,把状态值放入keybuf变量中

  126.        if(keybuf1==0x00) //经过8次中断,如果keybuf变量时0x00,则按键为按下状态,

  127.               keyst1=0;

  128.        elseif(keybuf1==0xff)  //经过8次中断,如果keybuf变量时0xff,则按键为弹起状态,

  129.               keyst1=1;

  130.        keybuf2=(keybuf2<<1)|Key2;

  131.        if(keybuf2==0x00)

  132.               keyst2=0;

  133.        elseif(keybuf2==0xff)

  134.               keyst2=1;



  135. }
复制代码













评分

参与人数 2黑币 +7 收起 理由
vvv64 + 5 共享资料的黑币奖励!
qjzyx + 2 赞一个!

查看全部评分

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

使用道具 举报

沙发
ID:74992 发表于 2015-5-20 19:52 | 只看该作者
不錯,就是樓主給的資料不全哦。
回复

使用道具 举报

板凳
ID:89183 发表于 2015-9-25 22:34 | 只看该作者
很好谢谢楼主
回复

使用道具 举报

地板
ID:79544 发表于 2015-9-27 22:05 | 只看该作者
程序还可以优化,有点繁琐。谢谢分享
回复

使用道具 举报

5#
ID:90952 发表于 2015-10-4 23:46 | 只看该作者
很好谢谢楼主
回复

使用道具 举报

6#
ID:91533 发表于 2015-10-5 20:15 | 只看该作者
我也想做一个这样的时钟,感觉很好玩!
回复

使用道具 举报

7#
ID:251133 发表于 2018-1-18 19:38 | 只看该作者
用的什么时钟芯片啊
回复

使用道具 举报

8#
ID:225105 发表于 2018-2-10 11:22 | 只看该作者
我也想做一个这样的时钟,感觉很好玩!
回复

使用道具 举报

9#
ID:283240 发表于 2018-2-12 07:59 | 只看该作者
谢谢楼主,好玩!
回复

使用道具 举报

10#
ID:266116 发表于 2018-2-12 15:28 | 只看该作者
谢谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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