ADC0808采集数据给1602显示的数据处理问题

2020-01-30 13:35发布

问题是:我的把ADC检测的电压数据通过单片机处理给LCD显示,电压数据严重不匹配,就5V和怎么都搞不好?多种算法试了还是不行,难道是其他地方有问题??
下面是我的代码:请大神看看,指教一下:(主要看数据处理部分,检测的是0-5V电压)
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar getdata;//从adc0809读取的数据

/*ADC引脚定义---------------------*/

sbit ST =P2^0;
sbit EOC=P2^1;
sbit OE =P2^2;
sbit CLK=P3^0;

//蜂鸣器控置
sbit speak=P2^3;

/*延时函数1ms*/
void Delay(uchar delay_ms)
{
        for(delay_ms=0;delay_ms<100;delay_ms++);       
}
/*
void ADC_Init()//AD初始化
{
        P1=0xff;
        EOC=1;
        OE =0;
        ST =0;
}
*/
void ReadData (void)//读取转换后的数据
{       
        ST=0;
        ST=1;
   Delay(1);
        ST=0;
        while (!EOC); //EOC为1时,转换结束
        OE  =1;
        Delay(1);
        getdata=P1;
        OE=0;
}

/*LCD控制端定义*/
sbit Lcden=P3^4;
sbit RS   =P3^5;
sbit RW   =P3^6;
sbit duan =P2^6;
sbit wei  =P2^7;

uchar code table[]="0123456789.UVIA=";

//显示读取的数处理
uint date1,date2,date3,date4;
void DataProcessing()
{
                uint temp1;
                temp1=getdata;
                date1=(temp1*500/255)/100;//个位
                date2=(temp1*500/255)%100/10;//小数点后一位
                date3=(temp1*500/255)%10;//小数的后二位
}


void Lcd_write_com (uchar com)  //根据硬件时序图写
{
        RS=0;
        P0=com;
        Delay(3);
        Lcden=1;
        Delay(2);
        Lcden=0;
}
void Lcd_write_date (uchar date)
{
        RS=1;
        P0=date;
        Delay(3);
        Lcden=1;
        Delay(2);
        Lcden=0;       
}
void Lcd_Init()
{
        duan =0;
        wei  =0;
        Lcden=0;
        RS   =0;
        RW   =0;
        Lcd_write_com(0x38);//设置16x2显示,5x7点阵,8位数据接口
        Delay(1);
        Lcd_write_com(0x0f);//开显示,光标,光标闪烁       
        Delay(1);
        Lcd_write_com(0x06);//读或写一个字符地址指针加一,光标加一
        Delay(1);
        Lcd_write_com(0x01);//显示清屏,数据指针和所有显示清零
        Delay(1);
        Lcd_write_com(0x80);//数据指针初始化       
}
void Display()
{  
        Lcd_write_com(0x80+1);
//        Delay(1);
        Lcd_write_date(table[11]);
//        Delay(1);
        Lcd_write_com(0x80+2);
//        Delay(1);
        Lcd_write_date(table[15]);
//        Delay(1);;
        Lcd_write_com(0x80+3);
//        Delay(1);
        Lcd_write_date(table[date1]);
//        Delay(1);
        Lcd_write_com(0x80+4);
//        Delay(1);
        Lcd_write_date(table[10]);
//        Delay(1);
        Lcd_write_com(0x80+5);
//        Delay(1);
        Lcd_write_date(table[date2]);
//        Delay(1);
        Lcd_write_com(0x80+6);
//        Delay(2);
        Lcd_write_date(table[date3]);
//        Delay(2);
        Lcd_write_com(0x80+7);
//        Delay(2);
        Lcd_write_date(table[12]);
//        Delay(2);
}

//定时器0初始化
void Timer0Init(void)
{
        TMOD=0x02;//定时器0工作于模式2
        TH0=0xfb;//定时5us
        TL0=0xfb;
        TR0=1;//启动定时器0
        ET0=1;//打开定时器0中断
        EA=1;//开总中断
}


void main()
{       
//        ADC_Init();//初始化
        Lcd_Init();
        Timer0Init();
        while(1)
        {       
                ReadData ();//adc读取数据
                DataProcessing();//数据处理便于显示
                Display();//数据显示
                if(date1=5)
                speak=1;
                else
                speak=0;
               
        }
       
       
}
void Timer0() interrupt 1
{       
        CLK=~CLK;

}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
chensheng00
1楼-- · 2020-01-30 15:57
顶顶
chensheng00
2楼-- · 2020-01-30 19:19
 精彩回答 2  元偷偷看……
chensheng00
3楼-- · 2020-01-30 23:16
搜了半天有关资料,终于看到一个信息,原理ADC0808的数据接口与单片机接口顺序相反的!!希望有同样遇到次情况的同学看到了能够了解问题所在!不要纠结程序了

一周热门 更多>