汤泽容
重庆工贸职业技术学院
摘要:电压表利用模数转换芯片ADC004经单片机处理之后,通过液晶1602显示出实际的电压值,本文介绍ADC0804芯片实现模数转换,量程为0~5V。
关键字:单片机,ADC0804,液晶1602
1、引言
单片机主要应用于自动控制领域,除数字量之外还会遇见模拟量,例如湿度、温度、电压等,它们都是模拟量。由于单片机只能处理数字量,因此就需要将模拟量转换成数字量,所以本文就利用ADC004实现电压的测量。
2、硬件组成
数字电压表实际是由51单片机最小系统、ADC0804外围电路、液晶1602构成,如下图所示。
3、软件编程
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define LCD_1602_PORT P0
#define ADC_0804_PORT P1
sbit rs_1602=P2^0;
sbit rw_1602=P2^1;
sbit e_1602=P2^2;
sbit cs_adc=P3^4;
sbit wr_adc=P3^6;
sbit rd_adc=P3^5;
sbit intr_adc=P3^7;
float v; uchar AD;
uchar read_adc_0804()
{
uchar ad,i;
cs_adc=0;
wr_adc =0;
wr_adc =0;//简短延时
wr_adc =1;
cs_adc =1;
while(intr==1)
{
i++;
if(i>220)
{
return 0;
}
}
cs_adc =0;
rd_adc =0;
rd_adc =0;
ad_adc =ADC_0804_PORT;
rd_adc =1;
cs_adc =1;
return (ad);
}
void write_add(uchar add)
{
uint x=300;
rw_1602=0;
rs_1602=0;
LCD_1602_PORT =add;
e_1602=1;
while(x--);
e_1602=0;
}
void write_data(uchar dat)
{
uint x=300;
rw_1602=0;
rs_1602=1;
LCD_1602_PORT =dat;
e_1602=1;
while(x--);
e_1602=0;
}
void LCD_drive(bit x,uchar d)
{
if(x==1)
{
write_data(d);
}
else
{
write_add(d);
}
}
void LCD1602_init()
{
uint x=10000;
LCD_drive(0,0x38);
LCD_drive(0,0x0c);
LCD_drive(0,0x06);
LCD_drive(0,0x01);
while(x--);
}
void show_data(uchar add,uint da)
{
LCD_drive(0,add);
LCD_drive(1,da/100+48);
LCD_drive(1,da%100/10+48);
LCD_drive(1,da%10+48);
}
uchar code as[]="0123456789";
void show_float(uchar add,float n)
{
uint vv;
vv=n*100;
LCD_drive(0,add);
LCD_drive(1,as[vv/1000]);
LCD_drive(1,as[vv%1000/100]);
LCD_drive(1,'.');//.
LCD_drive(1,as[vv%100/10]);
LCD_drive(1,as[vv%10]);
}
void main()
{
e=0;
LCD1602_init();
while(1)
{
AD=read_adc_0804();
v=AD*0.017;
show_data(0x81,AD);
show_float(0XC2,v);
}
}
4、结束
当编写好上述程序之后,对其使用编译软件进行编译,得到单片机能识别的二进制代码,然后再用编程器将二进制代码烧录到51单片机中,调节对应的电位器,就能看到液晶1602显示电压值以及相应的数字量。
参考文献:
[1] 谭浩强.C程序设计,北京:清华大学出版社,1991
[2] 郭天祥.51单片机C语言教程,北京:电子工业出版社,2010
[3] 余锡存等.单片机原理及接口技术,西安:西安电子科技大学出版社,2000