找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求大神调试单片机数码管问题

[复制链接]
跳转到指定楼层
楼主
为什么单片机上程序效果不好使  我想要数码管显示这个数

  1. #include<reg51.h>
  2. #define DataPort P0
  3. sbit duso=P2^1;
  4. sbit weso=P2^2;
  5. unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
  6. unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
  7. unsigned char count_Data[5];//定义count的全局变量

  8. void Display(unsigned int i);
  9. main(unsigned int count)
  10. {
  11. count=116788;
  12. while(1)
  13. {
  14.         count_Data[1]=dofly_DuanMa[count/100000];//第一位数字,十万位上数字
  15.         count_Data[2]=dofly_DuanMa[(count%100000)/10000];//第二位数字,万位上数字
  16.         count_Data[3]=dofly_DuanMa[(count%10000)/1000];//第三位数字 千位上数字
  17.         count_Data[4]=dofly_DuanMa[(count%1000)/100];
  18.         count_Data[5]=dofly_DuanMa[(count%100)/10];
  19.         count_Data[6]=dofly_DuanMa[count%10];




  20. }


  21. }        

  22. void Display()
  23. {
  24.       unsigned char i;
  25.          
  26.           for(i=0;i<6;i++)
  27.            {
  28.            DataPort=0;   //清空数据,防止有交替重影
  29.        duso=1;     //段锁存
  30.        duso=0;

  31.        DataPort=dofly_WeiMa[i+2]; //取位码
  32.        weso=1;     //位锁存
  33.        weso=0;

  34.        DataPort=count_Data[i]; //取显示数据,段码
  35.        duso=1;     //段锁存
  36.        duso=0;

  37.          

  38.        }

  39. }
复制代码



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

使用道具 举报

沙发
ID:334868 发表于 2018-5-21 14:54 | 只看该作者
主函数中没有发现怎么以调用显示函数呀~~显示似乎没有执行吧??
回复

使用道具 举报

板凳
ID:213173 发表于 2018-5-21 15:14 | 只看该作者
想要数码管显示count=116788;要定义变量count为 long 类型,分解这么大的数在12MHz时钟条件下需要耗时约3ms,这会造成数码管闪烁。给你改主循环一次分解一位,显示一位。
#include<reg51.h>
#define DataPort P0
sbit duso=P2^1;
sbit weso=P2^2;
unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsigned char count_Data[6];//定义count的全局变量

void main()
{
        unsigned char i=0;
        unsigned long count=116788;
        while(1)
        {
                switch(i)
                {
                        case 0: count_Data[0]=dofly_DuanMa[count/100000]; break;
                        case 1: count_Data[1]=dofly_DuanMa[count%100000/10000]; break;
                        case 2: count_Data[2]=dofly_DuanMa[count%10000/1000]; break;
                        case 3: count_Data[3]=dofly_DuanMa[count%1000/100]; break;
                        case 4: count_Data[4]=dofly_DuanMa[count%100/10]; break;
                        case 5: count_Data[5]=dofly_DuanMa[count%10]; break;
                }
                DataPort=0;   //清空数据,防止有交替重影
                duso=1;     //段锁存
                duso=0;               
                DataPort=dofly_WeiMa[i+2]; //取位码
                weso=1;     //位锁存
                weso=0;               
                DataPort=count_Data[i]; //取显示数据,段码
                duso=1;     //段锁存
                duso=0;
                i++;
                if(i>=6)
                i=0;
        }
}
回复

使用道具 举报

地板
ID:164602 发表于 2018-5-21 16:07 | 只看该作者
好像我有你这板子,所以我有现成的程序。
看看我写的(呵呵——得意的笑——新手的表现)
#include<reg51.h>

#define SMG P0//数码管

sbit DUAN=P2^6;
sbit WEI1=P2^7;

unsigned char code ZF[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77
,0x7c,0x39,0x5e,0x79,0x71,0x00};//标准0~F数码管显示码
unsigned char code WEI[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//控制哪一位数码管显示
                                //一次一位,对应最左位→最右位
unsigned char DisplayData[8];//用来存放要显示的8位数的值,一个管分配一位数组,叫显示缓存

void DigDisplay()//数码管动态显示函数
{
        unsigned char i,j;
        for(i=0;i<8;i++)//只有8个数码管
        {
                switch(i)         //位选,选择点亮的数码管,并赋值显示内容
                {
                        case(0):
                                SMG=WEI[i];//先选位0(最左边),后选段
                                WEI1=1;
                                WEI1=0;
                                SMG=DisplayData[i];//发送段码
                                DUAN=1;
                                DUAN=0;
                                break;
                        case(1):
                                SMG=WEI[i];
                                WEI1=1;
                                WEI1=0;
                                SMG=DisplayData[i];
                                DUAN=1;
                                DUAN=0;
                                break;
                        case(2):
                                SMG=WEI[i];
                                WEI1=1;
                                WEI1=0;
                                SMG=DisplayData[i];
                                DUAN=1;
                                DUAN=0;
                                break;
                        case(3):
                                SMG=WEI[i];
                                WEI1=1;
                                WEI1=0;
                                SMG=DisplayData[i];
                                DUAN=1;
                                DUAN=0;
                                break;
                        case(4):
                                SMG=WEI[i];
                                WEI1=1;
                                WEI1=0;
                                SMG=DisplayData[i];
                                DUAN=1;
                                DUAN=0;
                                break;
                        case(5):
                                SMG=WEI[i];
                                WEI1=1;
                                WEI1=0;
                                SMG=DisplayData[i];
                                DUAN=1;
                                DUAN=0;
                                break;
                        case(6):
                                SMG=WEI[i];
                                WEI1=1;
                                WEI1=0;
                                SMG=DisplayData[i];
                                DUAN=1;
                                DUAN=0;
                                break;
                        case(7):
                                SMG=WEI[i];
                                WEI1=1;
                                WEI1=0;
                                SMG=DisplayData[i];
                                DUAN=1;
                                DUAN=0;
                                break;
                }
                j=20;//显示一段时间,再消隐,可以得到稳定的显示
                while(j--);       
                SMG=0xff;
                WEI1=1;
                WEI1=0;
                SMG=0x00;//消隐
                DUAN=1;
                DUAN=0;//关闭段码
        }
}

void XSHCFZ (unsigned long j)//显示缓存赋值
{
        DisplayData[0]=ZF[j/10000000];//将十进制数换算为可显示字符
        DisplayData[1]=ZF[(j%10000000)/1000000];
        DisplayData[2]=ZF[(j%1000000)/100000];
        DisplayData[3]=ZF[(j%100000)/10000];
        DisplayData[4]=ZF[(j%10000)/1000];
        DisplayData[5]=ZF[(j%1000)/100];
        DisplayData[6]=ZF[(j%100)/10];
        DisplayData[7]=ZF[(j%10)/1];
}

void main(void)
{
        DUAN=0;WEI1=0;
        XSHCFZ(76543210);
        while(1)
        {
                DigDisplay();//显示
        }                               
}

好像和你的板子有点区别:两个锁存器的控制端接的口 不一样,你自己改一下试试。
回复

使用道具 举报

5#
ID:330582 发表于 2018-5-21 22:30 | 只看该作者
wulin 发表于 2018-5-21 15:14
想要数码管显示count=116788;要定义变量count为 long 类型,分解这么大的数在12MHz时钟条件下需要耗时约3ms ...

你好 我直接复制的代码运行到板子上是这个效果

IMG_4143.jpg (2.84 MB, 下载次数: 15)

IMG_4143.jpg
回复

使用道具 举报

6#
ID:330582 发表于 2018-5-21 22:32 | 只看该作者
wulin 发表于 2018-5-21 15:14
想要数码管显示count=116788;要定义变量count为 long 类型,分解这么大的数在12MHz时钟条件下需要耗时约3ms ...

这是最后效果 我直接复制的代码
回复

使用道具 举报

7#
ID:164602 发表于 2018-5-22 07:16 | 只看该作者
1sdaw123 发表于 2018-5-21 22:32
这是最后效果 我直接复制的代码

自己要改程序了,看到你的板子,才知道不是我的板子。但原理差不多。
好像你的573控制口和我的不一样哦。
回复

使用道具 举报

8#
ID:213173 发表于 2018-5-22 10:57 | 只看该作者
1sdaw123 发表于 2018-5-21 22:32
这是最后效果 我直接复制的代码

软件是建立在硬件的基础上的,首先要了解硬件电路,才能编写与其相适应的软件。没有包打天下的自适应软件。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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