单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1870|回复: 2
收起左侧

高仿真单片机PCF8583数码管电子钟,刚做的课设

[复制链接]
maweixin999 发表于 2017-6-6 23:46 | 显示全部楼层 |阅读模式
直接发包 两个包 ,两个电路有点差别 ,程序是一样的,都proteus图加源代码 ,加生成好的hex、
带小时 分钟时间设置和 12/24 小时显示按钮
基于51单片机和PCF8583的电子钟设计proteus仿真原理图如下(工程文件可到附件下载):
0.png
0.png 0.png

单片机源程序如下:
  1. //-------------------------------------------------------------------
  2. //名称:高度仿真数码管电子钟
  3. //-------------------------------------------------------------------
  4. //说明:本例在Proteus中选用了高仿真的电子钟元器件,并添加了时分调整
  5. //      功能,闪烁显示,AM/PM切换,12h/24h制选择等。
  6. #include <reg51.h>
  7. #include <intrins.h>
  8. #define uchar unsigned char
  9. #define uint unsigned int
  10. uchar tCount=0;
  11. //时钟设置开关及按键
  12. sbit K1=P0^0;            //12h/24h
  13. sbit K2=P0^1;            //设置
  14. sbit K3=P0^2;           //小时加
  15. sbit K4=P0^3;            //时钟加
  16. //当前时间:时分秒
  17. uchar current_Time[ ]={12,59,00};
  18. //时分秒显示缓冲(各占两位),最后的0x00控制AM,PM及发光管闪光等
  19. uchar disp_Buffer[ ]={0,0,0,0,0,0,0x00};
  20. //12h,24h,AM,PM及SET控制标志
  21. uchar f_24=0,f_AM=0,f_set=0;
  22. //--------------------------------------------------------------------
  23. //延时
  24. //--------------------------------------------------------------------
  25. void DelayMS(uint x)
  26. {
  27.         uchar i;
  28.         while(--x) for (i=0;i<120;i++);         
  29. }
  30. //--------------------------------------------------------------------
  31. //加时
  32. //--------------------------------------------------------------------
  33. void Add_Hour()
  34. {
  35.         //小时数累加
  36.         ++current_Time[0];
  37.         //24小时制时满24归零
  38.         if (f_24 ==1 && current_Time[0] == 24 ) current_Time[0] = 0;
  39.         //12h制满13归1,且取反AM与PM标志
  40.         if (f_24==0 && current_Time[0]==13)
  41.         {
  42.                  current_Time[0]=1;
  43.                 //将原来的AM与PM位取反
  44.         disp_Buffer[6]=(disp_Buffer[6]&0xFE)|(~(disp_Buffer[6]&0x01)&0x01);
  45.          }
  46.         
  47. }
  48. //--------------------------------------------------------------------
  49. //加分
  50. //--------------------------------------------------------------------
  51. void Add_Miniute()
  52. {
  53.         //分钟数累加
  54.         ++current_Time[1];
  55.         if (current_Time[1]==60)
  56.         {
  57.                 current_Time[1]=0;
  58.                 Add_Hour();
  59.         }        
  60. }
  61. //--------------------------------------------------------------------
  62. //根据当前时间刷新时分秒显示缓冲
  63. //--------------------------------------------------------------------
  64. void Refresh_Disp_Buffer()
  65. {
  66.         uchar i;
  67.         //刷新显示缓冲
  68.         for (i=0;i<3;i++)
  69.         {
  70.                 disp_Buffer[2*i] = current_Time[i]/10;
  71.                 disp_Buffer[2*i+1] =current_Time[i]%10;
  72.         }
  73. }

  74. //--------------------------------------------------------------------
  75. //外部中断
  76. //--------------------------------------------------------------------
  77. void EX0_INT() interrupt 0
  78. {
  79.         ++tCount;
  80.         if (tCount==25) disp_Buffer[6] &=0xF7;//每0.5秒 LED[:]点亮
  81.         if (tCount==50)                               //每秒刷新显示缓冲等
  82.         {
  83.                 tCount=0;
  84.                 disp_Buffer[6] |=0x08;            //每1秒 LED[:]关闭
  85.                 if (++current_Time[2] == 60)              //秒递增
  86.                 {
  87.                         current_Time[2]=0;
  88.                         Add_Miniute();               
  89.                 }
  90.                 Refresh_Disp_Buffer();                  //刷新时分秒的显示缓冲
  91.         }
  92. }
  93. //--------------------------------------------------------------------
  94. //显示时间
  95. //--------------------------------------------------------------------
  96. void Display_Time()
  97. {
  98.         uchar i;
  99.         for (i=0;i<7;i++)
  100.         {
  101.         P2=(disp_Buffer[i]<<4)|i|0x08;  DelayMS(5);
  102.             P2=P2&0xF7; DelayMS(5);
  103.         }
  104. }
  105. //--------------------------------------------------------------------
  106. //时钟调整与设置
  107. //--------------------------------------------------------------------
  108. void adjust_and_set_clock()
  109. {
  110.         //设置状态下,调整时与分,12h/24h制等
  111.         while (K2==0)
  112.         {
  113.                 //设置12h/24h制
  114.                 if (K1==0) //切换12h/24h制
  115.                 {
  116.                         f_24=1;disp_Buffer[6]|=0x02;
  117.                 }
  118.                 else
  119.                 {
  120.                         f_24=0;disp_Buffer[6]&=0xFD;
  121.                 }
  122.                 //加小时
  123.                 if (K3==0)
  124.                 {
  125.                         DelayMS(150);//小时增加时会影响am,pm标志,因此这里可调用数
  126.                         Add_Hour();
  127.                 }
  128.                 //加分钟
  129.                 if (K4==0)
  130.                 {
  131.                         DelayMS(150);//因为加分钟的函数会向小时进位,故单独增加               
  132.                         current_Time[1]=(current_Time[1]+1)%60;
  133.                 }
  134.                 Refresh_Disp_Buffer();
  135.                 Display_Time();
  136.         }
  137. }
  138. //---------------------------------------------------------------------
  139. //按键扫描子程序
  140. //---------------------------------------------------------------------
  141. void Keyboard_scan()
  142. {
  143.          if (K1==0) //切换12h/24h制
  144.         {
  145.                 f_24=1;disp_Buffer[6]|=0x02;
  146.         }
  147.         else
  148.         {
  149.                 f_24=0;disp_Buffer[6]&=0xFD;
  150.         }
  151.         if (K2==0) //显示或关闭"set"
  152.         {
  153.                 EX0=0;f_set=1;disp_Buffer[6] |=0x04;
  154.         }
  155.         else
  156. ……………………

  157. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
高仿真数码管电子钟.rar (28.92 KB, 下载次数: 21)

评分

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

查看全部评分

回复

使用道具 举报

admin 发表于 2017-6-7 03:18 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

zyllive1995418 发表于 2018-7-15 21:01 | 显示全部楼层
里面的程序根本没有关于pcf8583的程序啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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