找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4270|回复: 9
收起左侧

单片机秒表计数,为什么10位能变化,个位不动呢,在线等,求助

[复制链接]
ID:353085 发表于 2018-6-17 01:02 | 显示全部楼层 |阅读模式
自己按照书上的程序编了一个,也自己花了个图,秒表计数,为什么10位能变化,个位不动呢,可是每10秒10位还发生变化,在线等哥哥们帮助,哪有问题自己按照书上的程序编了一个,也自己花了个图,秒表计数,为什么10位能变化,个位不动呢,可是每10秒10位还发生变化,在线等哥哥们帮助,哪有问题

QQ图片20180617004959.png

单片机源程序如下:
  1. #include<reg52.h>

  2. sbit ADDR0=P1^0;
  3. sbit ADDR1=P1^1;
  4. sbit ADDR2=P1^2;
  5. sbit ADDR3=P1^3;
  6. sbit ENLED=P1^4;

  7. unsigned char code Ledchar [16]={
  8.         0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
  9.         0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
  10. };
  11. unsigned char Ledbuff [6]={
  12.         0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
  13. unsigned int flagls=0;
  14. unsigned int cnt=0;
  15. unsigned int i=0;
  16.       
  17. void main()
  18. {
  19.         unsigned long sec = 0;
  20.   EA  = 1;
  21.         ADDR3=1;
  22. ENLED=0;
  23. TMOD = 0x01;
  24. ET0  = 1;
  25.         TH0 = 0xFC;
  26.         TL0 = 0x67;
  27.   TR0 = 1;
  28.         while(1)
  29.         {
  30.                 if(flagls == 1)
  31.                 {
  32.                         flagls = 0;
  33.                         sec++;
  34.                         Ledbuff[0] = Ledchar[sec%10];
  35.                         Ledbuff[1] = Ledchar[sec/10%10];
  36.                         Ledbuff[2] = Ledchar[sec/100%10];
  37.                         Ledbuff[3] = Ledchar[sec/1000%10];
  38.                         Ledbuff[4] = Ledchar[sec/10000%10];
  39.                         Ledbuff[5] = Ledchar[sec/100000%10];
  40.                        
  41.                 }
  42.         }
  43. }
  44. void InterruptTimer0() interrupt 1
  45.         {
  46.                 TH0=0xFC;
  47.                 TL0=0x67;
  48.                 cnt++;
  49.                 if(cnt >= 1000)
  50.                 {
  51.                         cnt  = 0;
  52.                         flagls = 1;
  53.                 }
  54.                
  55.                 P0=0xFF;
  56.                 switch(i)
  57.                 {      
  58.                   case 0:ADDR0=0;ADDR1=0;ADDR2=0;i++;P0=Ledbuff[0];break;
  59.                   case 1:ADDR0=1;ADDR1=0;ADDR2=0;i++;P0=Ledbuff[1];break;
  60.                   case 2:ADDR0=0;ADDR1=1;ADDR2=0;i++;P0=Ledbuff[2];break;
  61.                   case 3:ADDR0=1;ADDR1=1;ADDR2=0;i++;P0=Ledbuff[3];break;
  62.                   case 4:ADDR0=0;ADDR1=0;ADDR2=1;i++;P0=Ledbuff[4];break;
  63.                   case 5:ADDR0=1;ADDR1=0;ADDR2=1;i=0;P0=Ledbuff[5];break;
  64.                 default: break;
  65.         }
  66. }
复制代码



回复

使用道具 举报

ID:341045 发表于 2018-6-17 13:10 | 显示全部楼层
程序没看出问题呀, 估计是硬件部分问题, 但这句改下会好点
default: break;  改为 default:  i = 0; break;  // i 异常时下次会正常

可改这几句调试:
                        Ledbuff[0] = 0: //Ledchar[sec%10];
                        Ledbuff[1] = 1; //Ledchar[sec/10%10];
                        Ledbuff[2] = 2; //Ledchar[sec/100%10];
                        Ledbuff[3] = 3; //Ledchar[sec/1000%10];
                        Ledbuff[4] = 4; //Ledchar[sec/10000%10];
                        Ledbuff[5] = 5; //Ledchar[sec/100000%10];
程序正常, 应该显示543210, 显示正常再看程序, 我估算你电路会串位, 也就是138译码不正常, 如是, 试着P1.0 P1.1 P1.2拉个3K3的上拉电阻, 还有, 138输出到三极管要接个几百到1K欧的电阻. 再不行就换138.

评分

参与人数 1黑币 +5 收起 理由
figo88130 + 5 谢谢老哥了,指点的非常详细,也非常到位。.

查看全部评分

回复

使用道具 举报

ID:234075 发表于 2018-6-17 16:34 | 显示全部楼层
60行“ case 0:ADDR0=0;ADDR1=0;ADDR2=0;i++;P0=Ledbuff[0];break;”你这样写没有数码管显示的,中间应该是“ADDR0=1;ADDR1=0;ADDR2=0;”,后面的以此类推
回复

使用道具 举报

ID:234075 发表于 2018-6-17 16:43 | 显示全部楼层
我的不对

评分

参与人数 1黑币 +5 收起 理由
figo88130 + 5 很给力!

查看全部评分

回复

使用道具 举报

ID:353085 发表于 2018-6-17 20:39 | 显示全部楼层
lzts88 发表于 2018-6-17 13:10
程序没看出问题呀, 估计是硬件部分问题, 但这句改下会好点
default: break;  改为 default:  i = 0; break ...

QQ截图20180617202752.png QQ截图20180617202817.png ,改成这样了。可是还是不行。这个2都显示不正确。怎么办。。。
回复

使用道具 举报

ID:341045 发表于 2018-6-17 23:22 | 显示全部楼层
figo88130 发表于 2018-6-17 20:39
,改成这样了。可是还是不行。这个2都显示不正确。怎么办。。。

                        Ledbuff[0] = 0: //Ledchar[sec%10];
                        Ledbuff[1] = 1; //Ledchar[sec/10%10];
                        Ledbuff[2] = 2; //Ledchar[sec/100%10];
                        Ledbuff[3] = 3; //Ledchar[sec/1000%10];
                        Ledbuff[4] = 4; //Ledchar[sec/10000%10];
                        Ledbuff[5] = 5; //Ledchar[sec/100000%10];
改这样呀, 你程序有查表, 会显示012345的, 我估计你是串位了. 就是138译码不正确. 你几位显一样的看不出
回复

使用道具 举报

ID:341045 发表于 2018-6-17 23:29 | 显示全部楼层
figo88130 发表于 2018-6-17 20:39
,改成这样了。可是还是不行。这个2都显示不正确。怎么办。。。

                        Ledbuff[0] = Ledchar[0];//sec%10];
                        Ledbuff[1] = Ledchar[1];//sec/10%10];
                        Ledbuff[2] = Ledchar[2];//sec/100%10];
                        Ledbuff[3] = Ledchar[3];//sec/1000%10];
                        Ledbuff[4] = Ledchar[4];//sec/10000%10];
                        Ledbuff[5] = Ledchar[5];//sec/100000%10];
没注意, 这样才样显示012345
回复

使用道具 举报

ID:341045 发表于 2018-6-17 23:39 | 显示全部楼层
figo88130 发表于 2018-6-17 20:39
,改成这样了。可是还是不行。这个2都显示不正确。怎么办。。。

2显示不正常, 0A4, 高电平不显示, 数据有3个"1", 连小数点共3个段不显, 程序看不出问题, 实际只有2个段不显.估计还是硬件部分, 给P0口全加3K3的上拉电阻试下.
回复

使用道具 举报

ID:111634 发表于 2018-6-18 11:05 | 显示全部楼层
本帖最后由 zl2168 于 2018-6-18 11:07 编辑

给你介绍一个正确有效看得懂的案例,自己对照查错吧!
实例93  99.9秒秒表
实例95 99.9秒秒表.rar (38.86 KB, 下载次数: 9)
回复

使用道具 举报

ID:353085 发表于 2018-6-18 15:32 | 显示全部楼层
zl2168 发表于 2018-6-18 11:05
给你介绍一个正确有效看得懂的案例,自己对照查错吧!
实例93  99.9秒秒表
先Proteus仿真一下,确认有效 ...

谢谢兄弟,我会认真看的,十分感谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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