请教一个比较严重的问题
时间:10-02
整理:3721RD
点击:
用ADC0832测量电阻的电压并显示出来,显示出来的数字只有0.00-0.50,到0.6的时候数字又变为0.1了,然后,电压增加到1时,显示从0.40直接跳到1.00,然后1.00到1.50显示都对,实际电压到1.60时,显示又变为1.10了,又是到1.40,然后有直接跳到2.00,就好像是六进制数一样,只能显示0到5,还请高人多多赐教,帮小弟分析分析。下面是程序
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ch0 0x02
#define ch1 0x03
sbit ADC_CS=P3^7;
sbit ADC_CLK=P1^0;
sbit ADC_DO=P1^1;
sbit ADC_DI=P1^1;
sbit ACC0=ACC^0;
sbit ACC1=ACC^1;
sbit Dot=P0^7;
uchar shu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar xianshi[3]={0,0,0};
uchar temp;
void delay(int ms)
{
int i;
while(ms--)
{
for(i=0;i<250;i++)
{_nop_();_nop_();_nop_();_nop_();}
}
}
void start_ADC(void)
{
ADC_CS=1;
_nop_();
ADC_CLK=0;
_nop_();
ADC_CS=0;
_nop_();
ADC_DI=1;
_nop_();
ADC_CLK=1;
_nop_();
ADC_DI=0;
_nop_();
ADC_CLK=0;
_nop_();
}
uchar read_ADC(uchar mode)
{
uchar i;
start_ADC();
ACC=mode;
ADC_DI=ACC1;
ADC_CLK=1;
_nop_();
ADC_DI=0;
_nop_();
ADC_CLK=0;
_nop_();
ADC_DI=ACC0;
ADC_CLK=1;
_nop_();
ADC_DI=1;
_nop_();
ADC_CLK=0;
ADC_CLK=1;
ACC=0;
for(i=8;i>0;i--)
{
ADC_CLK=0;
ACC=ACC<<1;
ACC0=ADC_DO;
_nop_();
_nop_();
ADC_CLK=1;
}
ADC_CS=1;
return(ACC);
}
void chuli(uchar i)
{
xianshi[2]=i/51;
temp=i%51;
temp=temp*10;
xianshi[1]=temp/51;
temp=temp%51;
temp=temp*10;
xianshi[0]=temp/51;
}
void display(void)
{
uchar i,dis=0x20;
for(i=0;i<3;i++)
{
P0=shu[xianshi[i]];
if(i==0) Dot=0;
P2=dis;
delay(1);
P2=0x00;
dis=dis<<1;
}
}
void main(void)
{
uchar acq;
while(1)
{
acq=read_ADC(ch0);
chuli(acq);
display();
}
}
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ch0 0x02
#define ch1 0x03
sbit ADC_CS=P3^7;
sbit ADC_CLK=P1^0;
sbit ADC_DO=P1^1;
sbit ADC_DI=P1^1;
sbit ACC0=ACC^0;
sbit ACC1=ACC^1;
sbit Dot=P0^7;
uchar shu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar xianshi[3]={0,0,0};
uchar temp;
void delay(int ms)
{
int i;
while(ms--)
{
for(i=0;i<250;i++)
{_nop_();_nop_();_nop_();_nop_();}
}
}
void start_ADC(void)
{
ADC_CS=1;
_nop_();
ADC_CLK=0;
_nop_();
ADC_CS=0;
_nop_();
ADC_DI=1;
_nop_();
ADC_CLK=1;
_nop_();
ADC_DI=0;
_nop_();
ADC_CLK=0;
_nop_();
}
uchar read_ADC(uchar mode)
{
uchar i;
start_ADC();
ACC=mode;
ADC_DI=ACC1;
ADC_CLK=1;
_nop_();
ADC_DI=0;
_nop_();
ADC_CLK=0;
_nop_();
ADC_DI=ACC0;
ADC_CLK=1;
_nop_();
ADC_DI=1;
_nop_();
ADC_CLK=0;
ADC_CLK=1;
ACC=0;
for(i=8;i>0;i--)
{
ADC_CLK=0;
ACC=ACC<<1;
ACC0=ADC_DO;
_nop_();
_nop_();
ADC_CLK=1;
}
ADC_CS=1;
return(ACC);
}
void chuli(uchar i)
{
xianshi[2]=i/51;
temp=i%51;
temp=temp*10;
xianshi[1]=temp/51;
temp=temp%51;
temp=temp*10;
xianshi[0]=temp/51;
}
void display(void)
{
uchar i,dis=0x20;
for(i=0;i<3;i++)
{
P0=shu[xianshi[i]];
if(i==0) Dot=0;
P2=dis;
delay(1);
P2=0x00;
dis=dis<<1;
}
}
void main(void)
{
uchar acq;
while(1)
{
acq=read_ADC(ch0);
chuli(acq);
display();
}
}
现在实际电压为4.95v
这个应该是你数据处理的时候出错了,你直接将转换得到的数字信号显示出来,看看有没问题。
这样子显示吗?
void display(uchar i)
{
xianshi[0]=i/100;
i=i%100;
xianshi[1]=i/10;
xianshi[2]=i%10
}
这样显示比刚才还乱。
不处理 直接显示 然后自己手算。
话说是不是 uchar temp 有temp = temp *10,
你改成uint试试?
六楼说得有道理,可能是数据溢出就会出现你这种情况。直接显示还乱码?什么情况?
直接显示的,随便选取几个点
太感谢!确实改为uint就可以了!谢谢,谢谢各位。
改为uint型可以了,谢谢,谢谢各位