#include <AT89X51.h>unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//定义数码管位选码
unsigned char code dispcod1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x70,0x76,0x5b,0x00};
unsigned char dispbuf[8]={0,0,0,0,0,0,0,0};//显示数码组。
unsigned char temp[8];//暂存数组unsigned char dispcount;// 扫描位的记录
unsigned char T0count;//计数次数
unsigned char timecount;// 定时器5ms中断的次数
bit flag;//定义标志位
unsigned long x,y;//定义变量用来存放频率值
/**********初始化模块**********/void chushihua(void)
{
TMOD=0x15;//定义定时器0为计数方式,定时器1为记时方式,均工作在方式1
TH0=0;//定时器0初值高8位为0
TL0=0;//定时器0初值低8位为
TH1=(65536-5000)/256;//定时器1初值高8位
TL1=(65536-5000)%256;//定时器1初值低8位,即定时5ms
TR1=1;//启动定时器1
TR0=1;//启动定时器0
ET0=1;//开定时器0中断
ET1=1;//开定时器1中断
EA=1;//开总中断
}
/**********初始化模块**********/
void main(void)
{
unsigned char i;
chushihua();
/**********信号频率测量**********/
while(1)
{
if(flag==1) //如果定时时间到了1s
{
flag=0;//标志位清零
x=T0count*65536+TH0*256+TL0;//获得整型的频率值。
y=x;
dispbuf[0]=12;
dispbuf[1]=11;
if(x>999)
{
dispbuf[0]=11;
dispbuf[1]=10;
}
if(x>499999)
{
x=888888;
dispbuf[0]=8;
dispbuf[1]=8;
}
/**********数码管显示**********/
for(i=0;i<8;i++)
{
temp[i]=0;//暂存缓冲区清零
}
i=2;while(x/10) //将频率值的每一位分离出来,存进temp数组,例如63239分离为6、3、2、3、9
{
temp[i]=x%10;
x=x/10;
i++;
}
temp[i]=x;
for(i=7;i>2;i--){
if(temp[i]==0)
{
temp[i]=13;
}
else break;
}
for(i=2;i<8;i++)
{
dispbuf[i]=temp[i];//将暂存数组的数据赋给显示数组
}
timecount=0;//记时清零
T0count=0;//计数清零
TH0=0;//定时器0初值清零
TL0=0;//定时器0初值清零
TR0=1;//重新启动定时器0,其实是作为计数器来用
}
}
}
void t0(void) interrupt 1
{
T0count++;//计数加一
}
void t1(void) interrupt 3
{
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;//重装初值
timecount++;
if(timecount==200) //当timecount=250时,即为1s
{
TR0=0;//关闭定时器0,为了读出定时器0计数个数
timecount=0;//timecount清零,重新计时
flag=1;//置标志位通知主程序1s已到
}
/**********数码管扫描部分**********/
P2=0xff;//先关闭所有数码管
P0=dispcode[dispbuf[dispcount]];//先确定相应数码管的段码,送入段码
P2=dispbit[dispcount];//送入位码
if(dispcount==5&&y>=1000)
{
P0=dispcod1[dispbuf[5]];
P2=dispbit[dispcount];
}
dispcount++;//下一次应该扫描下一位数码管所以要加一
if(dispcount==8) //因为共有8个数码管
{
dispcount=0;//扫描完第7个,回头扫描第0个
}
}
我把数码管换过来了,并且能成功显示,但是误差有点大,有什么办法可以解决吗?解决了会加分的!非常感谢
建议用定时器2给一秒定时,定时器2有自动重装功能,所以定时非常精确(其精确度与晶振有关)。
如需代码,留邮箱。这儿限制字数
记得采纳最佳答案就行,呵呵
邮箱:854512618@qq.com 一定会采纳最佳答案滴 要完整的代码哦
追答已发送
求各位帮帮忙!在proteus里仿真时只是闪烁移动不显示!
两种解决方法 方法一:把名为7SEG-MPX8-CA共阳极数码管换成名为7SEG-MPX8-CC的共阴极数码管。因为你的是共阴程序用共阳极数码管是不会正常显示的。方法二:把 ···\/***数码管扫描部分***\/ P2=0xff;\/\/先关闭所有数码管 P0=dispcode[dispbuf[dispcount]];\/\/先确定相应数码管的段码,送入段...
proteus仿真中数码管一直在闪
但一旦增大频率,1就是不停的闪现。这是调整不了的。这就是仿真的缺陷,很多现象是与实物有较大区别的。你这是6个共阴的数码管,想用138位选实现动态扫描显示的效果,对吧。想是对的,可现实是不行的。这种靠138来实现动态扫描显示,肯定是不行的,没有什么办法解决的。只能用单片机编程实现动态扫...
Proteus中为什么不显示输出?
1、首先第一步就是先打开proteus。2、接着就是要按照电路图,对元件进行布局和连线,完成电路图。3、然后就是进行点击如图,这时候开始仿真。4、最后一步就是因为选择LM311元件时,它没有仿真模型然后要点击暂停即可。
proteus仿真时数码管没显示是怎么回事?
1、打开proteus软件。2、这里用到74HC573锁存器,直接用P0口连接锁存器。3、可以实现位选,也可以位选,大大节省了IO,这里记得加上上拉电阻,否则不显示。4、选用6位共阴数码管。5、把位选和段选的线连接对应好。6、打开uVision2软件。7、共阴数码管的段编码如下{0x3f,0x06,0x5b,0x4f,0x66,0x...
Proteus仿真电路不亮,不知道哪里问题
首先,要确定仿真图所用的数码管是共阳的,还是共阴的,程序就必须按仿真图的数码管来写。如果程序与所用数码管不符就不会亮。说明仿真图用的是什么数码管,把程序发上来,帮你看一下。肯定是程序有问题。与复位电路无关,也不用加复位电路。看下图,就没有复位电路,也是正常显示的。
单片机在proteus上仿真时 四位数码管显示时不停闪烁移动,这是...
显然从你的图上看,你用的是动态显示,动态显示是每位的显示时间在1-2ms,如果你的时间大于此值就会出现闪烁。如果你的显示间隔时间没问题,那请不要纠结此事,因为在PROTEUS仿真中,如果你的计算机速度不够快,仿真的速度就慢了,即你看到的仿真动画是个慢动作的结果,它自然就是会闪烁,但用实物运行...
Proteus仿真,动态显示时数码管一闪一闪的,不稳定。
数码管动态显示,每个管间的延时时间以1-2ms为宜,如果是这个范围,显示是不会出现闪的。但是,你在PROTEUS仿真时,由于你的电脑速度或者你的仿真内容比较复杂,计算机的仿真的运行时间长实际的时间,因此我们可能看到了LED的闪烁。这个你可以不用管它,实际运行不会有这个问题。如果是这个情况,在运行时有信息提示,大意是...
proteus仿真出错,pc口不输出,一直警告?
proteus仿真出错,PC端口不输出并一直警告可能有以下几种原因:1. 电路图设计问题 可能是电路图设计的问题导致仿真出错,例如元件连接错误、元件参数设置错误、电压信号源设置错误等。请仔细检查电路图的每个元件是否正确连接、元件参数是否设置正确。2. 元器件模型设置问题 如果电路图设计无误,则可能是元...
proteus仿真1602无显示
原因就是把RS,RW,EN全接到P0就不行的,因P0口每个引脚都要加上拉电阻,而你没有加,所以,P0口就不能输出高电平,只有低电平,那个RS应该是高电平,为红点,可接到P0口是灰点,表示引脚处于悬空状态,因内部输出高电平,但实际上是悬空状态了。你的排电阻接到数据口P2上了,不用的,把排电阻...
proteus仿真为何不动了?
当Proteus仿真停滞不前时,可能是由于选择了LM311元件,该元件在Proteus的库中并未提供仿真模型。解决这个问题的步骤如下:首先,打开Proteus软件,确保软件环境已经正常启动。接着,根据电路设计的需要,细致地在Proteus的界面中放置元件,根据电路图布局,并连接相应的线路,构建出完整的电路图。然后,当电路...