51单片机c语言问题,麻烦各位大哥大姐帮帮忙。。。
我想让七段数码管每隔一秒由0加到9999,程序如下,已经可以显示了,就是数码管显示不清楚,会模糊的出现下一个数字的轮廓,麻烦各位帮忙一下。。真的谢谢了,分剩下不多了,抱歉...
我想让七段数码管每隔一秒由0加到9999,程序如下,已经可以显示了,就是数码管显示不清楚,会模糊的出现下一个数字的轮廓,麻烦各位帮忙一下。。真的谢谢了,分剩下不多了,抱歉。。。
#include <reg52.h>
#include <intrins.h>
#define uc unsigned char
void delayus(uc);
void delayms(uc);
void display(int,int,int,int);
char code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x8e};
unsigned int jnum=0;
uc num=0;
sbit oe=P2^7;
void main()
{
IE=0x82;
ET0=1;
TMOD=0x01;
TH0=0x1f;
TL0=0x00;
delayus(1);
TR0=1;
while(1)
{
if(num==32)
{
num=0;
if(jnum==9999)
jnum=0;
jnum++;
display(jnum/1000,jnum%1000/100,jnum%1000/10,jnum%10);
while(num!=32)
{
display(jnum/1000,jnum%1000/100,jnum%1000/10,jnum%10);
}
}
}
}
void int1() interrupt 1
{
TH0=0x1f;
TL0=0x00;
num++;
}
void display(int qian,int bai,int shi,int ge)
{
int s[4];
char i,temp;
s[3] = qian ;
s[2] = bai;
s[1] = shi;
s[0] = ge;
temp=0x77;
for(i=0;i<4;i++)
{
P0=temp;
WR=0;
delayus(1);
WR=1;
P0=0xff;
delayus(1);
P0=duan[s[3-i]];
delayus(10000);
temp=_cror_(temp,1);
}
}
void delayus(uc k)
{
uc z;
for(z=0;z<k;z++);
}
好像都不行,不过还是谢谢前面三位朋友,我想补充一下就是这个七段数码管位选在锁存器的右边,段选在锁存器左边,我想是不是怎么写程序都会影响到数码管的啊? 因为视频教程的段选和位选在不同的锁存器右边的。感觉这样就没问题了、、、 展开
#include <reg52.h>
#include <intrins.h>
#define uc unsigned char
void delayus(uc);
void delayms(uc);
void display(int,int,int,int);
char code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x8e};
unsigned int jnum=0;
uc num=0;
sbit oe=P2^7;
void main()
{
IE=0x82;
ET0=1;
TMOD=0x01;
TH0=0x1f;
TL0=0x00;
delayus(1);
TR0=1;
while(1)
{
if(num==32)
{
num=0;
if(jnum==9999)
jnum=0;
jnum++;
display(jnum/1000,jnum%1000/100,jnum%1000/10,jnum%10);
while(num!=32)
{
display(jnum/1000,jnum%1000/100,jnum%1000/10,jnum%10);
}
}
}
}
void int1() interrupt 1
{
TH0=0x1f;
TL0=0x00;
num++;
}
void display(int qian,int bai,int shi,int ge)
{
int s[4];
char i,temp;
s[3] = qian ;
s[2] = bai;
s[1] = shi;
s[0] = ge;
temp=0x77;
for(i=0;i<4;i++)
{
P0=temp;
WR=0;
delayus(1);
WR=1;
P0=0xff;
delayus(1);
P0=duan[s[3-i]];
delayus(10000);
temp=_cror_(temp,1);
}
}
void delayus(uc k)
{
uc z;
for(z=0;z<k;z++);
}
好像都不行,不过还是谢谢前面三位朋友,我想补充一下就是这个七段数码管位选在锁存器的右边,段选在锁存器左边,我想是不是怎么写程序都会影响到数码管的啊? 因为视频教程的段选和位选在不同的锁存器右边的。感觉这样就没问题了、、、 展开
4个回答
展开全部
三种可能,
1、如果是多个数码管都很亮的话,是数码管的驱动电流太大,这种情况可串接一个小电阻实现。
2、是显示子程序里面的延时时间太长,一般5MS就够了。
3、也可能是因为你定义int s[4];是局部变量,当这个子程序执行结束后,变量释放,数值是随机的。虽然说单片机的程序的执行速度很快能够弥补这一点,但还是有可能会出问题的。建议把int s[4];定义为全局变量来试试。
不会有大问题的。加油!
我不知道你的整体电路时怎么实现的。你补充的很对,单片机的输出的控制信号应接到锁存器的输入端,锁存器的输出信号应与数码管的控制引脚相连接,这样才有锁存的意义,锁存器的输入输出如果弄反了,肯定不能工作的。如果还不行,建议你先试试把数码管的位选和段选直接接到单片机的IO来试一试,看程序本身有没有问题。程序没问题的话,那就是电路的问题了。
1、如果是多个数码管都很亮的话,是数码管的驱动电流太大,这种情况可串接一个小电阻实现。
2、是显示子程序里面的延时时间太长,一般5MS就够了。
3、也可能是因为你定义int s[4];是局部变量,当这个子程序执行结束后,变量释放,数值是随机的。虽然说单片机的程序的执行速度很快能够弥补这一点,但还是有可能会出问题的。建议把int s[4];定义为全局变量来试试。
不会有大问题的。加油!
我不知道你的整体电路时怎么实现的。你补充的很对,单片机的输出的控制信号应接到锁存器的输入端,锁存器的输出信号应与数码管的控制引脚相连接,这样才有锁存的意义,锁存器的输入输出如果弄反了,肯定不能工作的。如果还不行,建议你先试试把数码管的位选和段选直接接到单片机的IO来试一试,看程序本身有没有问题。程序没问题的话,那就是电路的问题了。
展开全部
刷的速度太慢了。你改一改delayus(10000);里的参数,改小一点就好了,试一下。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
数码管是一位一位的显示,是靠人的视觉暂留和数码管的余晖作用使人看到清晰的数字,人眼的视觉暂留大约是0.1秒,因此对各个数码管一遍扫描下来的总时间不能超过0.1秒!我一般使用8位数码管各个位显示间隔5毫秒就已经很清晰了 。
还有就是调用显示程序的时间间隔太大的话也会导致显示不清晰
还有就是调用显示程序的时间间隔太大的话也会导致显示不清晰
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你定义的num是unsigned char 类型,单片机里面对应无符号8位数据,所以num最大也就是256,你后面的判断条件num==9999 是不会成立的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询