微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 请教一个比较严重的问题

请教一个比较严重的问题

时间: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();
}
}


现在实际电压为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型可以了,谢谢,谢谢各位

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top