找回密码
 立即注册

QQ登录

只需一步,快速开始

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

我的单片机流水灯程序不知道为什么无法很好的显示?

[复制链接]
跳转到指定楼层
楼主
本帖最后由 sophist 于 2021-10-18 09:05 编辑

刚学51,按郭天祥的那本红书和那个配套的单片机做的,芯片是89C52RC
具体就是我刚学流水灯,然后自己写了一个程序,我想让一共六个数码管轮流显示0——9,a——f的功能,就是第一个显示1,第二个显示2,这样轮流下去,第六个管子显5,第一个显6,这样轮下去。

接下来是一些问题
① 不太明白为什么前面4个数码管总是一起变化,后两个数码管却可以单独变化,

②有时候数码管会显示错误,这里本应该显示8的,包括后面字符的显示也有很多有问题。有时候能显示0,有时候又不能了

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. sbit dula=P2^6;  //送段选数据的那个锁存端,对应U1锁存器(后面有图)
  4. sbit wela=P2^7;   //送位选数据的锁存端,对应U2锁存器
  5. unsigned char code table[]={0X3F,0X06,0X5b,0X4f,0X66,0X6d,0X7d,0X07,0X7f,0X6f,0X77,0X7c,0X39,0X5e,0X79,0X71};                                          unsigned char aa;            //  ↑这个是数码管的字母表,分别实现0—9,a--f的字符显示,下面的变量j与之对应。
  6. void delayms(unsigned int xms);    //实现延迟

  7. void main()
  8. {
  9.         unsigned int i=0,j=0;
  10. while(1)
  11. {
  12.          aa=0XFE;            //每次for语句前重启aa地址
  13.          for(i=0;i<6;i++)
  14.          {
  15.                  dula=1;                 
  16.                  P0=table[j++];  
  17.                 dula=0;
  18.                  P0=0Xff;

  19.                  wela=1;
  20.                  P0=aa;     //共阴极接法,0的时候对应的数码管亮
  21.                  wela=0;
  22.                  aa=_crol_(aa,1);                 
  23.                  delayms(1000);
  24.          }
  25. if(j>15)
  26.          j=0;         //防j越界
  27. }
  28. }
  29. void delayms(unsigned int xms)
  30. {unsigned int p,q;
  31.         for(p=xms;p>0;p--)
  32.         for(q=110;q>0;q--);
  33. }
复制代码


图1.jpg (1.26 MB, 下载次数: 83)

前四个管子一起显示数字

前四个管子一起显示数字

图2.jpg (1.21 MB, 下载次数: 87)

后两个管子可以单独显示数字

后两个管子可以单独显示数字

图3.jpg (1.18 MB, 下载次数: 89)

本该是8的

本该是8的

4572322a14f352f114b63ea80f55d51.jpg (1.03 MB, 下载次数: 86)

书上的电路

书上的电路
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:956872 发表于 2021-10-18 07:39 来自手机 | 只看该作者
给你推荐bilibili 金善愚老师的视频,我是跟他视频自学的。 先点亮一个,一个的程序理顺了,多个也跟一个一样
回复

使用道具 举报

板凳
ID:332444 发表于 2021-10-18 08:28 | 只看该作者
本帖最后由 xianfajushi 于 2021-10-18 16:43 编辑

如果按每6个显示的话,数组个数是希望分3次显示还是分2次显示?分3次显示显然数组个数不足,不足的部分就要另外处理,第一次显示后切换下一次显示应该按6步进才对.
回复

使用道具 举报

地板
ID:213173 发表于 2021-10-18 08:50 | 只看该作者
天祥板子只有6位数码管,楼主初学单片机写这个程序有点难度。给你稍改一下基本可以满足设计目标。
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. sbit dula=P2^6;  //送段选数据的那个锁存端,对应U1锁存器(后面有图)
  4. sbit wela=P2^7;   //送位选数据的锁存端,对应U2锁存器
  5. unsigned char code table[]={//数码管字库
  6. //         0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
  7.         0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
  8. //   H    J          K         L           N          o    P            U
  9.    0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E};
  10. unsigned char aa;//  ↑这个是数码管的字母表,分别实现0—9,a--f的字符显示,虽然我实在不明白a 怎么显示。。。
  11. void delayms(unsigned int xms);    //实现延迟

  12. void main()
  13. {
  14.         unsigned int i=0,j=0;
  15.         while(1)
  16.         {
  17. //                aa=0XFE;            //每次for语句前重启aa地址
  18. //                for(i=0;i<16;i++)
  19. //                {
  20.                         dula=1;                 
  21.                         P0=table[i];  
  22.                         dula=0;
  23. //                        P0=0Xff;
  24.        
  25.                         aa=~(0x01<<i%6);
  26.                         wela=1;
  27.                         P0=aa;     //共阴极接法,0的时候对应的数码管亮
  28.                         wela=0;
  29.                         delayms(1000);
  30.                         i=++i%24;
  31. //                        aa=_crol_(aa,1);                 

  32. //                }
  33. //                if(j>15)
  34. //                        j=0;         //防j越界
  35.         }
  36. }
  37. void delayms(unsigned int xms)
  38. {
  39.         unsigned int p,q;
  40.         for(p=xms;p>0;p--)
  41.                 for(q=110;q>0;q--);
  42. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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