找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

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

查看数: 2965 | 评论数: 7 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2018-5-21 10:01

正文摘要:

为什么单片机上程序效果不好使  我想要数码管显示这个数 #include<reg51.h> #define DataPort P0 sbit duso=P2^1; sbit weso=P2^2; unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66 ...

回复

ID:213173 发表于 2018-5-22 10:57
1sdaw123 发表于 2018-5-21 22:32
这是最后效果 我直接复制的代码

软件是建立在硬件的基础上的,首先要了解硬件电路,才能编写与其相适应的软件。没有包打天下的自适应软件。
ID:164602 发表于 2018-5-22 07:16
1sdaw123 发表于 2018-5-21 22:32
这是最后效果 我直接复制的代码

自己要改程序了,看到你的板子,才知道不是我的板子。但原理差不多。
好像你的573控制口和我的不一样哦。
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();//显示
        }                               
}

好像和你的板子有点区别:两个锁存器的控制端接的口 不一样,你自己改一下试试。
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:334868 发表于 2018-5-21 14:54
主函数中没有发现怎么以调用显示函数呀~~显示似乎没有执行吧??

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

Powered by 单片机教程网

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