单片机在proteus上仿真时 四位数码管显示时不停闪烁移动,这是为什么? 5
这是程序#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint#defineCodeoutP2//...
这是程序
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define Codeout P2//定义段码输出口
#define Dsout P0 //定义数码管位选输出口
uchar Code[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //显示段码
uchar Dscode[] = {0xf7,0xef,0xdf,0xbf}; //显示位选表
sbit beep=P1^7; //定义蜂鸣器
sbit rled=P3^5; //定义发光二极管
sbit gled=P3^6;
sbit S1=P1^0; //定义按键
sbit S2=P1^1;
sbit S3=P1^2;
uint a=1000,ssnd;
/*************延迟子程序*****************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/****************LED和蜂鸣器报警*************/
void alarm()
{
uchar i;
if(ssnd<a)
{
gled=0;
rled=1;
}
else
{
rled=0;
gled=1;
for(i=0;i<10;i++)//喇叭发声的时间循环,改变大小可以改变发声时间长短
{
delay(20); //参数决定发声的频率,估算值,可以自行更改参数并
beep=~beep;
}
beep=1; //喇叭停止工作,间歇的时间,可更改
}
}
/*************浓度显示*************/
void display(uint nd)
{
P0=0xf7;
P2=Code[nd/1000]; //显示千位
delay(1);
P0=0xef;
P2=Code[nd%1000/100]; //显示百位
delay(1);
P0=0xdf;
P2=Code[nd%100/10]; //显示十位
delay(1);
P0=0xbf;
P2=Code[nd%10]; //显示个位
delay(1);
}
void main()
{
beep=1;
gled=0;
ssnd=999;
if(S2==0)
{delay(10);
a++;
}
if(S3==0)
{delay(10);
a--;
}
while(1)
{
display(ssnd);
alarm();
if(beep==0)
{ rled=1;
gled=0;
beep=~beep;
}
} 展开
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define Codeout P2//定义段码输出口
#define Dsout P0 //定义数码管位选输出口
uchar Code[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //显示段码
uchar Dscode[] = {0xf7,0xef,0xdf,0xbf}; //显示位选表
sbit beep=P1^7; //定义蜂鸣器
sbit rled=P3^5; //定义发光二极管
sbit gled=P3^6;
sbit S1=P1^0; //定义按键
sbit S2=P1^1;
sbit S3=P1^2;
uint a=1000,ssnd;
/*************延迟子程序*****************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/****************LED和蜂鸣器报警*************/
void alarm()
{
uchar i;
if(ssnd<a)
{
gled=0;
rled=1;
}
else
{
rled=0;
gled=1;
for(i=0;i<10;i++)//喇叭发声的时间循环,改变大小可以改变发声时间长短
{
delay(20); //参数决定发声的频率,估算值,可以自行更改参数并
beep=~beep;
}
beep=1; //喇叭停止工作,间歇的时间,可更改
}
}
/*************浓度显示*************/
void display(uint nd)
{
P0=0xf7;
P2=Code[nd/1000]; //显示千位
delay(1);
P0=0xef;
P2=Code[nd%1000/100]; //显示百位
delay(1);
P0=0xdf;
P2=Code[nd%100/10]; //显示十位
delay(1);
P0=0xbf;
P2=Code[nd%10]; //显示个位
delay(1);
}
void main()
{
beep=1;
gled=0;
ssnd=999;
if(S2==0)
{delay(10);
a++;
}
if(S3==0)
{delay(10);
a--;
}
while(1)
{
display(ssnd);
alarm();
if(beep==0)
{ rled=1;
gled=0;
beep=~beep;
}
} 展开
4个回答
展开全部
proteus 中数码管动态显示,不是很好使;改用硬件实验吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
看着像延时时间太长,你把显示程序的延时去了试试
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
应为扬声器SPEAKER的原因,你把SPEAKER去掉试一试
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询