找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求解答:用proteus仿真实现时钟(帮忙看下代码,已写好了但是显示不对

[复制链接]
跳转到指定楼层
楼主

代码:
  1. /*********************************************************************************************************************
  2. 程序名称:8位数码管时钟程序
  3. 函数功能:在8位数码管上显示包含小时,分钟,秒钟的C语言程序
  4. 程序版本:V1.0
  5. 调试状态:成功
  6. 调试时间:2014.10.10
  7. 定时器初值计算方法:【16进制】65535-[(晶振频率/12)/(1秒/定时的时间)]
  8. **********************************************************************************************************************/
  9. #include<reg52.h>
  10. #include<absacc.h>
  11. #define uchar unsigned char
  12. #define uint unsigned int

  13. /*********************************************************************************************************************/
  14. //函数申明        
  15. void data_deal();  //数据处理函数
  16. void delay(uchar timer);//延时函数
  17. void   H_M_S_circle();//时钟时分秒循环函数
  18. void display();//送显示函数
  19. /*********************************************************************************************************************/
  20. unsigned char code table[]={
  21.   0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
  22. //  0    1    2    3    4    5    6    7    8    9   
  23. };
  24. /*********************************************************************************************************************/
  25. //全局变量申明
  26. uchar time_flag;
  27. uchar Hour=0,Min=0,second=0;
  28. uchar DispBuf[8];        //定义显示缓冲区——待显示的数据(由定时中断程序自动扫描),全局变量
  29. /*********************************************************************************************************************/
  30. void main()
  31. {
  32.         //启动定时器
  33.         TMOD |= 0x01; //选择定时器的工作方式(00表示13位定时计数器,01表示16位定时计数器,10表示8位定时计数器,11停止工作)
  34.         TH0 = 0xDC; //装载定时器初值高八位(此初值表示定时器定时为10ms)
  35.         TL0 = 0x00; //装载定时器初值低八位(此初值表示定时器定时为10ms)

  36.         EA = 1;         //开启总中断
  37.         ET0 = 1; //开启定时器中断允许位
  38.         TR0 = 1; //开启定时器中断

  39.         //时钟显示
  40.         while(1)
  41.         {
  42.                 data_deal();//调用数据处理函数,提取处理后的数据
  43.                 display(); //调用显示函数,显示处理好的数据
  44.         }
  45. }
  46. /*********************************************************************************************************************
  47. 函数名称:delay(uchar timer)
  48. 函数功能:延时
  49. **********************************************************************************************************************/
  50. void delay(uchar timer)
  51. {
  52.         uchar i,j;
  53.         for(i=0;i<114;i++)
  54.         for(j=0;j<timer;j++)
  55.         ;
  56. }

  57. /*********************************************************************************************************************
  58. 函数名称:T1IN_time()
  59. 函数功能:利用定时器中断开启定时,并计算出1秒钟
  60. **********************************************************************************************************************/
  61. void T1IN_time() interrupt 1 //(1表示中断号,0表示外部中断0,1表示定时器T0,2表示外部中断1,3表示定时器T1)
  62. {
  63.          uchar count;//申明定时器变量
  64.          TH0 = 0xDC; //装载定时器初值高八位(此初值表示定时器定时为10ms)
  65.          TL0 = 0x00; //装载定时器初值低八位(此初值表示定时器定时为10ms)

  66.          count ++; //定时器变量自加1
  67.          if(count == 100) //count自加100次,定时器运行100次初值的时间,即10ms *100 = 1s(1秒钟)
  68.          {
  69.                  count = 0; //count归零,等待下一次定时
  70.                 time_flag = 1; //定时器标志位为1,启动时钟时分秒循环程序
  71.          }
  72. }
  73. /*********************************************************************************************************************
  74. 函数名称:H_M_S_circle()
  75. 函数功能:时分秒循环
  76. *************************************************************************************/
  77. void   H_M_S_circle()
  78. {
  79.         if(time_flag == 1)//当定时器标志位为1时,表示时间为1秒
  80.         {
  81.                 time_flag = 0;//标志位归零
  82.                 second++;          //秒钟自加1
  83.         }
  84.         if(second == 60) //当秒钟自加1到60时
  85.         {
  86.                 second = 0; //秒钟归零
  87.                 Min ++;                //分钟自加1
  88.         }
  89.         if(Min == 60) //当分钟自加1到60时
  90.         {
  91.                 Min = 0; //分钟归零
  92.                 Hour ++; //小时自加1
  93.         }
  94.         if(Hour == 24) //当小时自加1到24时
  95.         {
  96.                 Hour = 0; //小时归零
  97.                 Min = 0;  //分钟归零
  98.                 second = 0; //秒钟归零
  99.         }        
  100. }
  101. /********************************************************************************
  102. 函数名称:data_deal()
  103. 函数功能:对数码管将要显示的数据进行拆分
  104. **********************************************************************************/
  105. void data_deal()
  106. {
  107.          H_M_S_circle(); //调用时钟时分秒循环程序,取出时,分。秒的值
  108.          DispBuf[7] = Hour /10; //小时十位
  109.          DispBuf[6] = Hour %10; //小时个位
  110.          DispBuf[5] = 8; //显示“-”
  111.          DispBuf[4] = Min /10; //分钟十位
  112.          DispBuf[3] = Min %10; //分钟个位
  113.          DispBuf[2] = 8; //显示“-”
  114.          DispBuf[1] = second /10; //秒钟十位
  115.          DispBuf[0] = second %10; //秒钟个位
  116. }

  117. void display()
  118. {
  119.         uchar i;
  120.         code unsigned char com[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};


  121.         for(i=0;i<8;i++)
  122.         {
  123.                 P0 =com[i]; //i=0表示数码管的最低位
  124.                 P2        =table[DispBuf[i]];//DispBuf[i]表示拆分后的数据,i表示需要显示的动态数据
  125.                 delay(1);
  126.         }        P0 = 0x00; //关闭所有数码管显示
  127. }
  128. /***************************************END********************************************/
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:275826 发表于 2020-3-24 15:36 | 只看该作者
DispBuf[2] = 8; //显示“-” 怎么会是显示“-”,肯定显示“8”
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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