问题是:我的把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;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>