这是一个4位共阳数码管动态显示9999~1(每次变化值为1)。为什么不能点亮。求高手解答。C51单片机 C语言

//4位共阳数码管动态显示9999~1
# include "reg51.h" // 包含头文件
unsigned char code f[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~9共阳段码
void delay10ms(void) //延时10毫秒的函数
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=250;j>0;j--);
}
void disp4bit(unsigned char d1,d2,d3,d4) //4个数字d1,d2,d3,d4依次点亮10毫秒
{
P2=0xff;
P0=f[d1];
P2=0xfe;
delay10ms();

P2=0xff;
P0=f[d2];
P2=0xfd;
delay10ms();

P2=0xff;
P0=f[d3];
P2=0xfb;
delay10ms();

P2=0xff;
P0=f[d4];
P2=0xf7;
delay10ms();
}
void main (void) // 主函数
{
unsigned char i,j,b,d[4]; //数组元素d[0]~d[3]分别用于存放要显示的个、十、百、千位数字
for (i=9999;i>0;i--) // 依次显示9999~1
{
b=i; // 因i的值不允许修改,故将其存入临时变量b中
for(j=0;j<4;j++) //将4位十进制数i拆成个、十、百、千位4个数字,分别存入数组元素d[0]~d[3]中
{
d[j]=b%10; //请完善此处for语句中的循环体程序。(第1处)
b=b/10;
}
for(j=0;j<15;j++)
disp4bit(d[3],d[2],d[1],d[0]); //显示4位数i的个、十、百、千位数字15遍。请完善此处的一条语句。(第2处)
}
}

你既然用共阳数码管,那位码就应该是1有效,可是你的程序却是0有效。所以,显示子程序有问题。

更重要的问题出在主程序,主程序没有while(1)语句,肯定是错误的。主程序问题太多了,自己看吧。还有那两个计数i和b,计数到9999的要用整型的,才能计到9999,而你有char型的,最大才是255。

再看一下你的仿真图中的数码管,确定是共阳的吗。看下图中的4位一体的数码管元件的名称是什么,与你用的一样吗?

仿真图和修改后的显示子程序和主程序如下,其余部分没有修改的没有贴上来。特别 要对照一下仿真图。

void disp4bit(unsigned char d1,d2,d3,d4)  //4个数字d1,d2,d3,d4依次点亮10毫秒

{

    P2=0x08; //位码是1有效

    P0=f[d1];//个位

    delay10ms();


    P2=0x04; //位码是1有效

    P0=f[d2];//十位

    delay10ms();


    P2=0x02; //位码是1有效

    P0=f[d3];//百位

    delay10ms();


    P2=0x01; //位码是1有效

    P0=f[d4];//千位

    delay10ms();

}

void  main (void)      // 主函数

{

  unsigned char j,d[4];

  unsigned int i,b;      //必须是整型,才能有最大数9999

  while(1)

  {

 for(i=9999;i>0;i--)

 {

 b=i;

 for(j=0;j<4;j++)

 {

 d[j]=b%10;  //先取个位,最后取千位

 b=b/10;

 }

 for(j=0;j<15;j++)

 {

      disp4bit(d[0],d[1],d[2],d[3]);  //注意实参的顺序

 }

 }

  }

}

追问

还是一样·可以显示·只能显示1和0

追答

仿真图中数码管的4个公共端千万不要串联电阻呀,就是P2口上的4个电阻,是谁告诉你的,要串联电阻的?
你用是你自己的程序吗?

追问

仿真图没有问题。。。是程序有问题···我用这个程序调试就可以正常显示··但是那个程序只能修改两个地方。。。

温馨提示:内容为网友见解,仅供参考
第1个回答  2015-07-05
先得解决显示的问题,成功后,再琢磨怎么变化。
第2个回答  2015-07-04
确定是共阳?试一下共阳共阴有没有搞错!

...为什么不能点亮。求高手解答。C51单片机 C语言
你既然用共阳数码管,那位码就应该是1有效,可是你的程序却是0有效。所以,显示子程序有问题。更重要的问题出在主程序,主程序没有while(1)语句,肯定是错误的。主程序问题太多了,自己看吧。还有那两个计数i和b,计数到9999的要用整型的,才能计到9999,而你有char型的,最大才是255。再看一下...

跪求 共阳数码管4位8段动态显示。0-9999 从0加到9999.每秒加1. 用c写...
unsigned char g,s,b,q,;unsigned char code duan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};\/\/0~9共阳 void display();void time(){for(n=0;n<500;n++);} init(){ g=s=b=q=0;TMOD=0X01;TH0=(65536-46080)\/256;TL0=(65536-46080)%256;EA=1;TR0=...

重启电脑一直蓝屏不能开机是什么回事?求高手解决
1、更换或者添加硬件,出现硬件不兼容现象,卸下新加硬件。就是硬件兼容,也可能蓝屏,因为系统不能识别新添加的硬件,建议重装系统。2、电脑使用过久,内存、显卡的金手指氧化而引起接触不良,把内存、显卡,取下来用橡皮擦擦卡的金手指,可向卡槽内加入少量无水酒精 (清洗槽内氧化物),几分钟后,用...

利用51单片机,4个数码管设计一个计时器,要求在数码管上显示的数据从0开...
它是由秒信号发生器(时基电路)、小时分钟计数器及译码和驱动显示电路3部分组成,其基本工作过程是:时基电路产生精确周期的脉冲信号,经过分频器作用给后面的计数器输送1HZ的秒信号,最后由计数器及驱动显示单元按位驱动数码管时间显示,但是这样设计的电路比较复杂,使用也不灵活,而且价格比较高,故不采用此方案。 图2.1 方...

...该内存不能为“read”要终止程序...请问哪位知道怎么
这就是“动态内存分配”,内存地址也就是编程中的“光标”。内存不是永远都招之即来、用之不尽的,有时候内存分配也会失败。当分配失败时系统函数会返回一个0值,这时返回值“0”已不表示新启用的光标,而是系统向应用程序发出的一个通知,告知出现了错误。作为应用程序,在每一次申请内存后都应该检查返回值是否为0,...

为我家电脑玩dnf的时候会突然出现一个框框,上面显示***不能为***,然...
这就是“动态内存分配”,内存地址也就是编程中的“指针”。 内存不是永远都招之即来、用之不尽的,有时候内存分配也会失败。当分配失败时系统函数会返回一个0值,这时返回值“0”已不表示新启用的指针,而是系统向应用程序发出的一个通知,告知出现了错误。作为应用程序,在每一次申请内存后都应该检查返回值是否为0...

...不能交叉不能斜线,线不能盖过那个叉,急求高手解答
一个代数集合在(x,y)维度系统定义为y= 1\/x有一奇点(0,0),因为在此它不允许切线存在。几何学中的奇点:“几何意义上的奇点”,也是无限小且不实际存在的“点”。可以想象一维空间(如线),或二维空间(如面),或三维空间,当它无限小时,取极限小的最后的一“点”,这一个不存在的点,...

...写着错误代码和内存不能为read,哪位高手解答一下是怎么回事_百度知 ...
4 0x0004 系统无法开启档案。5 0x0005 拒绝存取。6 0x0006 无效的代码。7 0x0007 储存体控制区块已毁。8 0x0008 储存体空间不足,无法处理这个指令。9 0x0009 储存体控制区块位址无效。10 0x000a 环境不正确。11 0x000b 尝试载入一个格式错误的程式。12 0x000c 存取码错误。13 0x000d 资料...

请问各位 怎么点亮数码管的小数点拜托各位了 3Q
当某一字段的阳极为低电平时,相应字段就不亮。 【数码管的驱动方式】 数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。 ① 静态显示驱动:静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码...

求统计学高手帮忙解答一个题目呀~~谢谢!!!
这句话不对,不符合似然函数的定义。似然函数是将总体参数当做一个变量来看待,然后据此来计算所观测到的样本值出现的似然值,再根据其中的出现最大似然值所对应的参数值作为总体参数的最大似然估计值。比如,如果我们抽出一个男性人群样本,调查发现吸烟率为50%。那么按照似然函数,我们首先假设男性人群(...

相似回答