仅从文字表述, 分析可能的问题:
1. "1和11端连起来连到GND上"之前, "1和11"是否有上拉? 若没有则可能有干扰, 会引起不稳定
2. 锁存器输出与数码管的连接方式, 数码管的驱动方式(共阴/阳, 是否有限流电阻等)
3. 尝试改变时序(11"LE"先于1"/OE"接GND)
4. 研究一下锁存器的DATA SHEET.
你程序有点问题,用下面的程序就可以了,
问题一:延时时间太短,数码管刷新太快,有一直在闪的感觉
问题二:for(num=7;num=0;num--)这个for语句当执行到num=0时,依然成立,往后执行会在执行num--这句,但是已经超出了无符号整形的范围,程序会给num取得 一个补码,当判断num=0;依然成立,程序会进入死循环。
解答完毕,不知是否合理,请自行理解,谢谢!~!~
#includereg52.h
#define uint unsigned int
#define uchar unsigned char
uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar code table2[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
uint num;
void delay(uint z)
{
uint x,y;
for(x=z;x0;x--)
for(y=110;y0;y--);
}
void main()
{
while(1)
{
for(num=8;num0;num--)
{
P0=table2[num-1];
P2=table1[num-1];
delay(200);
P2=0xff;
P0=0xff;
}
}
}
你的显示是动态的,必须时时扫描,也就是循环送显示数据,否则就无法正常显示,
#includereg51.h
sbit a=P3^4;
sbit b=P3^5;
sbit c=P3^6;
sbit d=P3^7;
sbit e=P2^0;
sbit f=P2^1;
sbit g=P2^2;
sbit h=P2^3;
sbit i=P2^6;
sbit j=P2^7;
bit flag;
unsigned char flag;
unsigned char code dcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0xff} ;
unsigned char key;
unsigned char t;
unsigned char m,mm;
void delay1ms(unsigned int x){
unsigned char j;
while(x--){
for(j=0;j123;j++){;}
}
}
void t0isr() interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
flag=~flag;
if(flag){e=0;f=0;g=1;h=0;P0=dcode[key/10];}
else {e=0;f=0;g=0;h=1;P0=dcode[key%10];}
}
void main(void){
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
ET0=1;
EA=1;
while(1) {
P3=0xff;
a=0;
t=P3;
t=t0x0f;
if(t!=0x0f)
{ delay1ms(80);
if (t!=0x0f){
t=P3;
t=t0x0f;
if(t==0x0e){key=0;}
if(t==0x0d){key=1;}
if(t==0x0b){key=2;}
if(t==0x07){key=3;}
}
}
P3=0xff;
b=0;
t=P3;
t=t0x0f;
if (t!=0x0f)
{
delay1ms(80);
if (t!=0x0f){
t=P3;
t=t0x0f;
if(t==0x0e){key=4;}
if(t==0x0d){key=5;}
if(t==0x0b){key=6;}
if (t==0x07){key=7;}
}
}
P3=0xff;
c=0;
t=P3;
t=t0x0f;
if (t!=0x0f)
{
delay1ms(80);
if (t!=0x0f){
t=P3;
t=t0x0f;
if(t==0x0e){key=8;}
if(t==0x0d){key=9;}
if(t==0x0b){key=10;}
if (t==0x07){key=11;}
}
}
P3=0xff;
d=0;
t=P3;
t=t0x0f;
if (t!=0x0f)
{
delay1ms(80);
if (t!=0x0f){
t=P3;
t=t0x0f;
if(t==0x0e){key=12;}
if(t==0x0d){key=13;}
if(t==0x0b){key=14;}
if(t==0x07){key=15;}
}
}
}}
程序没有正常执行。要确认二极管和数码管是共阴还是共阳的,然后再决定IO口应该输出高电平还是低电平。
自己应该知道程序是怎么执行的吧?那就让程序步进执行,然后一一测试,看看IO口的变化是否正确,很快就可以知道问题了,应该是程序没有正常执行;再看看灯泡另外一端是否与电源端短路了,否则二极管始终处于截止的状态,所以要确认二极管和数码管是共阴还是共阳的,然后再决定IO口应该输出高电平还是低电平。
单片机数码管闪一下就黑了的介绍到此就结束了,感谢您耐心阅读,谢谢。
本文标签:单片机数码管闪一下就黑了