|
软件部分:
#include<reg51.h>
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit RS=P0^0;
sbit RW=P0^1;
sbit E=P0^2;
sbit cs=P0^7; //AD0804片选
sbit rd=P0^6;
sbit wr=P0^5;
sbit INTR=P3^2;//中断请求信号
void delay_ms(uint z);
uchar Lcd1602_ReadBusy();
void Lcd1602_WriteCom(uchar com);
void Lcd1602_WriteData(uchar dat);
void Lcd1602_init();
void display(uchar qian,uchar bai,uchar shi,uchar ge);
void AD_Init();
void AD_Start();
uchar AD_Read();
uchar outdata;
uint D1,D2,D3,D4;
uint Data;
void main()
{
Lcd1602_WriteCom(0x01);//清屏操作
Lcd1602_init(); //LCD初始化
AD_Init(); //AD初始化
while(1)
{ cs=0;
AD_Start();
while(INTR==1);//AD转换是否结束
//INTR=0; //结束后置为低电平
Data=AD_Read(); //把AD0804读取的数据赋值给Data
Data=Data*196; //
D1=Data/10000;//整数部分(电压表的量程是0-5V,所以整数部分只有一位)
Data=Data%10000;
D2=Data/1000;//十分位
Data=Data%1000;
D3=Data/100;//百分位
Data=Data%100;
D4=Data/10;//千分位
display(D1,D2,D3,D4);//显示LCD1602
}
}
void delay_ms(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
uchar Lcd1602_ReadBusy()
{
uchar temp;
RS=0;
RW=1;
_nop_();
P2=0xff;
_nop_();
E=1;
_nop_();
temp=P2;
_nop_();
E=0;
return (temp&0x80);
}
void Lcd1602_WriteCom(uchar com)
{
while(Lcd1602_ReadBusy());
RS=0;
RW=0;
_nop_();
P2=com;
_nop_();
E=1;
_nop_();
_nop_();
E=0;
_nop_();
_nop_();
}
void Lcd1602_WriteData(uchar dat)
{
while(Lcd1602_ReadBusy());
RS=1;
RW=0;
_nop_();
P2=dat;
_nop_();
E=1;
_nop_();
_nop_();
E=0;
_nop_();
_nop_();
}
void Lcd1602_init()
{
delay_ms(15);
Lcd1602_WriteCom(0x38);
delay_ms(5);
Lcd1602_WriteCom(0x38);
delay_ms(5);
Lcd1602_WriteCom(0x38);
Lcd1602_WriteCom(0x0c);
Lcd1602_WriteCom(0x01);
Lcd1602_WriteCom(0x06);
}
void display(uchar qian,uchar bai,uchar shi,uchar ge) //显示LCD1602
{
Lcd1602_WriteCom(0x80+0x02);
Lcd1602_WriteData('V');
Lcd1602_WriteCom(0x80+0x04);
Lcd1602_WriteData('O');
Lcd1602_WriteCom(0x80+0x06);
Lcd1602_WriteData('L');
Lcd1602_WriteCom(0x80+0x08);
Lcd1602_WriteData('T');
Lcd1602_WriteCom(0x80+0x0a);
Lcd1602_WriteData('A');
Lcd1602_WriteCom(0x80+0x0c);
Lcd1602_WriteData('G');
Lcd1602_WriteCom(0x80+0x0e);
Lcd1602_WriteData('E');
Lcd1602_WriteCom(0x80+0x45);
Lcd1602_WriteData(0x30+qian);//0x30代表数字0
Lcd1602_WriteCom(0x80+0x46);
Lcd1602_WriteData('.');
Lcd1602_WriteCom(0x80+0x47);
Lcd1602_WriteData(0x30+bai);
Lcd1602_WriteCom(0x80+0x48);
Lcd1602_WriteData(0x30+shi);
Lcd1602_WriteCom(0x80+0x49);
Lcd1602_WriteData(0x30+ge);
Lcd1602_WriteCom(0x80+0x4b);
Lcd1602_WriteData('V');
}
void AD_Init()//AD初始化
{
cs=1;//关闭ADC0804
wr=1;//关闭写
rd=1;//关闭读
}
void AD_Start()//AD转换开始
{
P1=0xff; //写数据前关闭I/O口
cs=0;//开启ADC0804
wr=0;//写打开
delay_ms(1);
wr=1;//写关闭
}
uchar AD_Read() //AD读取数据
{
cs=0;//开启ADC0804
rd=0;//读打开
delay_ms(1);
outdata=P1;//读取数据
rd=1;//读关闭
// cs=1;//关闭ADC0804
return(outdata);//送出数据
}
|
|