找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6099|回复: 26
收起左侧

单片机初学者,为什么我写的数码管显示怎么就显示一个0,求指教

  [复制链接]
ID:158886 发表于 2019-5-2 21:50 | 显示全部楼层 |阅读模式
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. sbit wea=P2^2;
  6. sbit web=P2^3;
  7. sbit wec=P2^4;



  8. uchar i;

  9. uchar code duanma[]={0x3f,0x06,0x5b,0x4f,
  10.                                         0x66,0x6d,0x7d,0x07,
  11.                                         0x7f,0x6f,0x77,0x7c,
  12.                                         0x39,0x5e,0x79,0x71};



  13. void dalay(uint z);
  14. void dalay(uint z)
  15. {
  16.   while(z--);


  17. }
  18.                                  
  19. void main()
  20. {                 wea=1;
  21.                  web=1;
  22.                  wec=0;
  23.                         
  24.         
  25.                   
  26.     while(1)
  27.     {
  28.            P0=duanma[i];
  29.            for(i=0;i<15;i++);
  30.             delay();
  31.         
  32.          


  33.         
  34.         }

  35. }
复制代码

回复

使用道具 举报

ID:213173 发表于 2019-5-3 08:31 | 显示全部楼层
本帖最后由 wulin 于 2019-5-3 10:54 编辑

楼主的本意是想写3位数码管动态显示0~F,实际没有动起来。要想动起来位码需要随时间变化,显示的数字也要随时间变化。给你改成了不同数字的动态显示,你试试。
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. sbit wea=P2^2;
  6. sbit web=P2^3;
  7. sbit wec=P2^4;
  8. uchar i;
  9. uint  j;
  10. uchar code duanma[]={
  11.         0x3f,0x06,0x5b,0x4f,
  12.         0x66,0x6d,0x7d,0x07,
  13.         0x7f,0x6f,0x77,0x7c,
  14.         0x39,0x5e,0x79,0x71};

  15. void dalay(uint z);

  16. void dalay(uint z)
  17. {
  18.   while(--z);
  19. }
  20.                                  
  21. void main()
  22. {
  23. //        wea=1;
  24. //        web=1;
  25. //        wec=0;
  26.         i=0;
  27.         j=0;
  28.         while(1)
  29.         {
  30.                 P0=0x00;//消除鬼影
  31.                 wea=1;
  32.                 web=1;
  33.                 wec=0;
  34.                 P0=duanma[i];
  35.                 dalay(500);

  36.                 P0=0x00;
  37.                 wea=1;
  38.                 web=0;
  39.                 wec=1;
  40.                 P0=duanma[i+1];
  41.                 dalay(500);

  42.                 P0=0x00;
  43.                 wea=0;
  44.                 web=1;
  45.                 wec=1;
  46.                 P0=duanma[i+2];
  47.                 dalay(500);

  48.                 j++;
  49.                 if(j>=100)//控制i的增量速度
  50.                 {
  51.                         j=0;
  52.                         i++;
  53.                         if(i>=14)
  54.                                 i=0;
  55.                 }
  56.         }
  57. }
复制代码
回复

使用道具 举报

ID:365802 发表于 2019-5-3 08:33 | 显示全部楼层
1) 把对应的电路图也贴上来方便吧友帮你分析. 2) 我觉得可能你的Delay时间太少了.
回复

使用道具 举报

ID:496604 发表于 2019-5-3 12:44 | 显示全部楼层
我也觉得delay太少了,改为50000比较合适,for循环也有毛病
主循环可改为
for(i=o;i<=15;i++)
{
    P0=duanma[i];
     delay(50000);
}
回复

使用道具 举报

ID:158886 发表于 2019-5-3 13:07 | 显示全部楼层
wulin 发表于 2019-5-3 08:31
楼主的本意是想写3位数码管动态显示0~F,实际没有动起来。要想动起来位码需要随时间变化,显示的数字也要随 ...

老师,我的意思是让一位数码管显示0~F,但是我写的,就是显示0运行不了,我不知道错在哪,刚学。
回复

使用道具 举报

ID:158886 发表于 2019-5-3 13:09 | 显示全部楼层
这是开发板的数码管电路图
数码管.png
回复

使用道具 举报

ID:293387 发表于 2019-5-3 13:23 | 显示全部楼层
for循环有毛病
for(i=o;i<=15;i++);
每次执行后i的值不会变。
应该把P0=duanma[i];delay();
放在for循环里面
并且添加合适的延时时间。
回复

使用道具 举报

ID:158886 发表于 2019-5-3 13:25 | 显示全部楼层
ping264888 发表于 2019-5-3 08:33
1) 把对应的电路图也贴上来方便吧友帮你分析. 2) 我觉得可能你的Delay时间太少了.

我在while里面的delay括号中加数值会报错。
回复

使用道具 举报

ID:158886 发表于 2019-5-3 13:27 | 显示全部楼层
堂堂 发表于 2019-5-3 12:44
我也觉得delay太少了,改为50000比较合适,for循环也有毛病
主循环可改为
for(i=o;i

在delay里加数会报错,这也是问题之一
回复

使用道具 举报

ID:158886 发表于 2019-5-3 13:30 | 显示全部楼层
静态显示.C(114): warning C206: 'delay': missing function-prototype
静态显示.C(114): error C267: 'delay': requires ANSI-style prototype
Target not created

提示这个错误,
回复

使用道具 举报

ID:526392 发表于 2019-5-3 13:40 | 显示全部楼层
P0=duanma[i]应该放在for(i=0;i<15;i++)循环语句里面,另外要保持足够长的延时
回复

使用道具 举报

ID:526392 发表于 2019-5-3 13:50 | 显示全部楼层
while(1)后面改为for(i=0;i<=15;i++) {     P0=duanma[i];      delay(1000); }
回复

使用道具 举报

ID:395068 发表于 2019-5-3 17:04 | 显示全部楼层
P0=duanma[i];这一段代码写在for语句里试试
回复

使用道具 举报

ID:395068 发表于 2019-5-3 17:05 | 显示全部楼层
还有你主循环根本就没用到延时,delay括号里面是空的,就算在显示也看不出来啊,
回复

使用道具 举报

ID:526540 发表于 2019-5-3 17:21 | 显示全部楼层
低电平还是高电平?
回复

使用道具 举报

ID:525872 发表于 2019-5-3 17:29 | 显示全部楼层
延时不是空,明明定义delay(int Z),调用的时候你直接delay();
回复

使用道具 举报

ID:213173 发表于 2019-5-3 17:37 | 显示全部楼层
江西奉新 发表于 2019-5-3 13:07
老师,我的意思是让一位数码管显示0~F,但是我写的,就是显示0运行不了,我不知道错在哪,刚学。

按你的意思这样写就可以了,但必须把跳线帽J21插在LE与VCC上,如果插在P10与LE上就可能须加一句P10=1;
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. sbit wea=P2^2;
  6. sbit web=P2^3;
  7. sbit wec=P2^4;
  8. uchar i;
  9. uchar code duanma[]={
  10.                 0x3f,0x06,0x5b,0x4f,
  11.                 0x66,0x6d,0x7d,0x07,
  12.                 0x7f,0x6f,0x77,0x7c,
  13.                 0x39,0x5e,0x79,0x71};

  14. void dalay(uint z);

  15. void dalay(uint z)
  16. {
  17.         while(--z);
  18. }
  19.                                  
  20. void main()
  21. {
  22.         wea=0;
  23.         web=0;
  24.         wec=0;
  25.         i=0;
  26.         while(1)
  27.         {
  28.                 P0=duanma[i];
  29.                 dalay(65530);
  30.                 i++;
  31.                 if(i>=16)
  32.                         i=0;
  33.         }
  34. }
复制代码
回复

使用道具 举报

ID:462827 发表于 2019-5-3 18:08 | 显示全部楼层
楼主这个应该是普中的单片机吧
回复

使用道具 举报

ID:111634 发表于 2019-5-3 18:09 | 显示全部楼层
看看人家正确的案例吧!
回复

使用道具 举报

ID:150234 发表于 2019-5-3 19:18 | 显示全部楼层
LE应该为高电平
回复

使用道具 举报

ID:526392 发表于 2019-5-3 20:12 | 显示全部楼层
51go 发表于 2019-5-3 13:50
while(1)后面改为for(i=0;i

测试了一下,还是delay(50000)这个时长比较合适
回复

使用道具 举报

ID:525068 发表于 2019-5-6 10:41 | 显示全部楼层
for循环那里有问题,思路是对的
回复

使用道具 举报

ID:158886 发表于 2019-5-7 15:50 | 显示全部楼层
谢谢个各位老师,我找到问题了,第一个是你们说的FOR循环有问题,第二个是delay,这个写错了,才报错,等会晚一点把我写的,再发出来看看,
回复

使用道具 举报

ID:158886 发表于 2019-5-7 15:53 | 显示全部楼层
hantu 发表于 2019-5-3 18:08
楼主这个应该是普中的单片机吧

是普中的,普中的视频我看不懂,因为我学历不高,以前学习又不太好,他们讲的我看不懂!我在网上看的电路都是不一样的!
回复

使用道具 举报

ID:158886 发表于 2019-5-7 20:20 | 显示全部楼层
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit wea=P2^2;
sbit web=P2^3;
sbit wec=P2^4;
uchar i;
uchar code duanma[]={0x3f,0x06,0x5b,0x4f,
                                        0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,
                                        0x39,0x5e,0x79,0x71};



void delay(uint z);
void delay(uint z)
{
  while(z--);


}
                                 
void main()
{                 
                        
        
                  
    while(1)
    {       
                           P0=0xff;
                         wea=0;
                 web=0;
                 wec=0;
           
           for(i=0;i<=15;i++)
                  
                           {
                            P0=duanma[i];
                           delay(40000);
                  
            }
        
         


        
        }

} 这是我修正过的,现在可以正常一位数码管,0~F循环显示,时间delay,里面的可以写数值,谢谢大家指点!       
回复

使用道具 举报

ID:529961 发表于 2019-5-7 20:37 | 显示全部楼层
因为你的循环里面没有写延时呀,你直接跳过去了括号里面应该定义
回复

使用道具 举报

ID:531695 发表于 2019-5-9 16:51 | 显示全部楼层
你这样P0完全不能读到i的值
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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