找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

基于51单片机的数字电子时钟异常显示

查看数: 3554 | 评论数: 3 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2019-2-15 14:59

正文摘要:

我基于51设计了一个数字电子时钟,但不知道哪里出错了,导致仿真显示时显示很离谱,想请教下各位是程序里哪里出问题导致的。 代码如下 #include<reg51.h> #include<intrins.h> #define u8 unsigned char ...

回复

ID:376199 发表于 2019-2-20 15:41
wulin 发表于 2019-2-15 22:54
你的程序问题多多,给你改了,仿真正常,你自己对照查找问题。

哇,谢谢您的指导
ID:96682 发表于 2019-2-15 23:38
从贴图上看是位驱动问题
ID:213173 发表于 2019-2-15 22:54
你的程序问题多多,给你改了,仿真正常,你自己对照查找问题。




  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define u8 unsigned char
  4. #define u16 unsigned int
  5. sbit K1 = P1^4;
  6. sbit K2 = P1^5;
  7. sbit K3 = P1^6;
  8. sbit K4 = P1^7;
  9. u8 code discode[]={//共阳数码管段码"0~f-."
  10.                 0xc0,0xf9,0xa4,0xb0,
  11.                 0x99,0x92,0x82,0xf8,
  12.                 0x80,0x90,0x88,0x83,
  13.                 0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
  14. u8 code data1[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//位码
  15. //u8 code data1[8]={~0x01,~0x02,~0x04,~0x08,~0x10,~0x20,~0x40,~0x80};//三极管反向位码
  16. u8 data2[8]; //定义时分秒的十位和个位
  17. u8 shi,fen,miao;//时分秒变量
  18. u16 count = 0;//中断次数
  19. u8 num;//键值变量

  20. void process(void) //数据处理函数,分别分离其十位和个位
  21. {
  22.         data2[0] = shi / 10;
  23.         data2[1] = shi % 10;
  24.         data2[2] = 16;
  25.         data2[3] = fen / 10;
  26.         data2[4] = fen % 10;
  27.         data2[5] = 16;
  28.         data2[6] = miao / 10;
  29.         data2[7] = miao % 10;
  30. }

  31. void display(void) //显示程序                                                                                                                        //数据显示函数
  32. {
  33.         static u8 i=0;
  34.         P0 = 0xff;
  35.         P2=data1[i];
  36.         P0 = discode[data2[i]];
  37.         i++;
  38.         if(i==8)
  39.                 i=0;
  40. }

  41. void horse()//根据不同按键执行相应功能
  42. {
  43.         switch(num)
  44.         {
  45.                 case 0xe0:
  46.                 shi++;
  47.                 if(shi == 24) shi = 0; break;
  48.                 case 0xd0:
  49.                 shi--;
  50.                 if(shi == 255) shi = 23; break;
  51.                 case 0xb0:
  52.                 fen++;
  53.                 if(fen == 60) fen = 0; break;
  54.                 case 0x70:
  55.                 fen--;
  56.                 if(fen == 255) fen = 59; break;
  57.         }
  58. }

  59. void keyproc(void)  //按键扫描及处理函数
  60. {                                                                                                                                                   
  61.         static bit sign=0;                        //按键自锁标志
  62.         static u16 count1=0;                //消抖计数变量        
  63.         u8 key;  //保存按键状态码        
  64.         key=P1&0xf0;
  65.         if(key!=0xf0)
  66.         {
  67.                 count1++;                                //消抖计数
  68.                 if((count1>=500)&&(sign==0))//100~1000,根据主循环周期调整约10~20ms
  69.                 {
  70.                         sign=1;                        //按键自锁标志置1
  71.                         num=key;
  72.                         horse();
  73.                 }
  74.         }
  75.         else                                                //键抬起
  76.         {
  77.                 sign=0;                                        //按键自锁标志清0
  78.                 count1=0;                                //消抖计数清0
  79.         }
  80. }

  81. void main(void)
  82. {
  83.         TMOD = 0x01;
  84.         TH0 = (65536 - 1000) / 256;
  85.         TL0 = (65536 - 1000) % 256;
  86.         TR0 = 1;
  87.         EA = 1;
  88.         ET0 = 1;
  89.         while(1)
  90.         {
  91.                 keyproc(); //按键处理
  92.                 process();  //数据处理
  93. //                display();        //显示数据
  94.         }
  95. }
  96. void timer0(void) interrupt 1 using 1  //定时中断函数1ms
  97. {
  98.         TH0 = (65536 - 1000) / 256;
  99.         TL0 = (65536 - 1000) % 256;
  100.         count++;
  101.         if(count == 1000)
  102.         {
  103.                 count = 0;
  104.                 miao++;
  105.                 if(miao == 60)
  106.                 {
  107.                         miao = 0;
  108.                         fen++;
  109.                         if(fen == 60)
  110.                         {
  111.                                 fen = 0;
  112.                                 shi++;
  113.                                 if(shi == 24)
  114.                                 shi = 0;
  115.                         }
  116.                 }
  117.         }
  118.         display();        //显示数据
  119. }
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

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

Powered by 单片机教程网

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