基于51单片机的简易数字电压表 30
不知道为什么数码管总是显示乱码,感觉其他的部分都比较正常#include<reg52.h>#defineucharunsignedchar#defineuintunsig...
不知道为什么数码管总是显示乱码,感觉其他的部分都比较正常
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code dis[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};
sbit ST=P3^0;
sbit eoc=P3^2;
sbit oe=P3^1;
sbit clk=P3^3;
uchar getdata;
uchar dis_ge,dis_fen,dis_bai;
long int i;
void init()
{
TMOD=0x12;//定时器1方式1,定时器0方式2
TH0=216;
TL0=216;
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
TR1=1;
TR0=1;
ET1=1;
ET0=1;
EA=1;
}
void main()
{
init();
while(1)
{
ST=0;
ST=1;
ST=0;
while(eoc==0);
oe=1;
getdata=P0;
oe=0;
i=getdata*196;
dis_ge=i/10000;
i=i%10000;
dis_fen=i/1000;
i=i%1000;
dis_bai=i/100;
ST=1;
ST=0;
}
}
void time0() interrupt 1
{
clk=~clk;
}
void time1() interrupt 3
{
uchar a;
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
P1=dis[dis_ge];
P2=0XFD;
for(a=0;a<100;a++);
P1=dis[dis_fen];
P2=0XFB;
for(a=0;a<100;a++);
P1=dis[dis_bai];
P2=0XF7;
for(a=0;a<100;a++);
}
请大家帮忙找下,主要是T1中断程序里面的显示程序,图是PROTEUS里的
我看了些网上的资料,现在仿真也成功了,不过有疑问的是,那些资料都是扫描8位数码管的,可是实际上只用了四位,是不是相当于 woshizzza 所说的延时呢,可是我加延时程序为什么不行呢?主要是这个问题,希望大家能帮忙下,谢谢
感谢大家的回答,可是感觉不是重点所在,我改了程序,把扫描四位改成扫描八位,另四位没有接数码管的也扫描,当然先忽略小数点,那样就行了,这中间到底是为什么呢
void main()
{
init();
while(1)
{
ST=0;
ST=1;
ST=0;
while(eoc==0);
oe=1;
getdata=P0;
oe=0;
i=getdata*196;
disbuf[5]=i/10000;
i=i%10000;
disbuf[6]=i/1000;
i=i%1000;
disbuf[7]=i/100;
ST=1;
ST=0;
}
}
void time0() interrupt 1
{
clk=~clk;
}
void time1() interrupt 3
{
uchar a,count;
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
P2=0xff;
P1=dis[disbuf[count]];
P2=disbit[count];
count++;
if(count==8)
count=0;
}
主函数改了变量,主要是显示部分改成了扫描八位的,这样就可以正常显示了,为什么呢 展开
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code dis[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};
sbit ST=P3^0;
sbit eoc=P3^2;
sbit oe=P3^1;
sbit clk=P3^3;
uchar getdata;
uchar dis_ge,dis_fen,dis_bai;
long int i;
void init()
{
TMOD=0x12;//定时器1方式1,定时器0方式2
TH0=216;
TL0=216;
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
TR1=1;
TR0=1;
ET1=1;
ET0=1;
EA=1;
}
void main()
{
init();
while(1)
{
ST=0;
ST=1;
ST=0;
while(eoc==0);
oe=1;
getdata=P0;
oe=0;
i=getdata*196;
dis_ge=i/10000;
i=i%10000;
dis_fen=i/1000;
i=i%1000;
dis_bai=i/100;
ST=1;
ST=0;
}
}
void time0() interrupt 1
{
clk=~clk;
}
void time1() interrupt 3
{
uchar a;
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
P1=dis[dis_ge];
P2=0XFD;
for(a=0;a<100;a++);
P1=dis[dis_fen];
P2=0XFB;
for(a=0;a<100;a++);
P1=dis[dis_bai];
P2=0XF7;
for(a=0;a<100;a++);
}
请大家帮忙找下,主要是T1中断程序里面的显示程序,图是PROTEUS里的
我看了些网上的资料,现在仿真也成功了,不过有疑问的是,那些资料都是扫描8位数码管的,可是实际上只用了四位,是不是相当于 woshizzza 所说的延时呢,可是我加延时程序为什么不行呢?主要是这个问题,希望大家能帮忙下,谢谢
感谢大家的回答,可是感觉不是重点所在,我改了程序,把扫描四位改成扫描八位,另四位没有接数码管的也扫描,当然先忽略小数点,那样就行了,这中间到底是为什么呢
void main()
{
init();
while(1)
{
ST=0;
ST=1;
ST=0;
while(eoc==0);
oe=1;
getdata=P0;
oe=0;
i=getdata*196;
disbuf[5]=i/10000;
i=i%10000;
disbuf[6]=i/1000;
i=i%1000;
disbuf[7]=i/100;
ST=1;
ST=0;
}
}
void time0() interrupt 1
{
clk=~clk;
}
void time1() interrupt 3
{
uchar a,count;
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
P2=0xff;
P1=dis[disbuf[count]];
P2=disbit[count];
count++;
if(count==8)
count=0;
}
主函数改了变量,主要是显示部分改成了扫描八位的,这样就可以正常显示了,为什么呢 展开
4个回答
展开全部
你把程序好像不全
如果是因为采集数据中有杂质而造成闪烁,那么你单纯的加延时是不起作用的,需要滤波
如果是因为采集数据中有杂质而造成闪烁,那么你单纯的加延时是不起作用的,需要滤波
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
中间加一些延时。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
扫描分为段扫描很位扫描 段有八段,位一般是四位
八段构成了一位 当需要哪位显示时就先讲段数据送出 然后将位扫描数据送出
八段构成了一位 当需要哪位显示时就先讲段数据送出 然后将位扫描数据送出
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
数码管显示程序,网上有很多,这样写恐怕不对
你可以参考一下,延时肯定要的
你可以参考一下,延时肯定要的
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询