懂单片机的进来

来源:百度知道 编辑:UC知道 时间:2024/07/05 07:29:49
本人初学单片机,编了一个程序,功能是用数码管从小到大分别显示0000-9999。P0.0-P0.7分别接单片机的a,b,,c,d,e,f,g,dp。P2.3-2.0各通过一个1000欧的限流电阻和一个9012三极管接V1,V2,V3,V4。
编译并烧录到后能正常运行,但数码管不显示段不是完全关闭。如显示1234,在千位能隐约看到2,在百位能隐约看到3,在十位能隐约看到4,在个位也能隐约看到1;先用C语言编著,不该显示部分非常明显;后用汇编语言则没有那么明显。不知是编程的问题还是硬件的问题,请高手帮忙;
C程序为:
#include<at89x51.h>
void delay()
{
unsigned char j,k;
for(j=0;j<5;j++)
for(k=0;k<120;k++);
}
unsigned char code table[]={
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80,
0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e };

void main()
{
unsigned int count;
unsigned char i;
for(count=0;count<10000;count++)
{
for(i=50;i>0;i--)
{
P2_3=0;
P0=table[count%10];
delay();
P2_3=1;
P2_2=0;
P0=table[count/10%10];

for(count=0;count<10000;count++)
{
unsigned int a,b,c,d;
a=count%10;
b=count/10%10;
c=count/100%10;
d=count/1000;

for(i=50;i>0;i--)
{
P0=table[a]; //注意位置
P2_3=0; //可能有关
delay();
P2_3=1;

动态扫描法中,数码管个数,扫描频率对其都有影响。
以上只是提高了一些程序运行效率,因为像取余似的运算是很耗时的。
当然如果你再想想,上面计算abcd的方法还可以进一步优化。

你也可以试试调整一下delay时间

另外,在硬件方面的一点建议就是,由于数码管过多,可以加锁存器解决。
或者直接使用数码管驱动芯片,效果更好,例如 MAX7219 等等。

另外,另外,汇编都写出来了,你基础不错啊

编译链接中。。。。

数码管是共印记还共阳极啊?

应该是硬件问题,数码管没有完全被点亮,要看看数码管驱动怎么样,你查查电路上面数码管的限流电阻是多大的?电路接法要正确才行,我可以帮你看看硬件电路,程序的话,灯都能亮了应该没问题,有问题可以给我留言

2个数码管就能正常工作,四个就不行了 也有可能是驱动能力不够啊,汇编跟C结果不一样这个比较奇怪,原因得一点点排除。

原来程序的影响这么大,看来“程序的灵魂是算法”一点没错!