|
軟件部分:
#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轉(zhuǎn)換是否結(jié)束
//INTR=0; //結(jié)束后置為低電平
Data=AD_Read(); //把AD0804讀取的數(shù)據(jù)賦值給Data
Data=Data*196; //
D1=Data/10000;//整數(shù)部分(電壓表的量程是0-5V,所以整數(shù)部分只有一位)
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代表數(shù)字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;//關(guān)閉ADC0804
wr=1;//關(guān)閉寫
rd=1;//關(guān)閉讀
}
void AD_Start()//AD轉(zhuǎn)換開始
{
P1=0xff; //寫數(shù)據(jù)前關(guān)閉I/O口
cs=0;//開啟ADC0804
wr=0;//寫打開
delay_ms(1);
wr=1;//寫關(guān)閉
}
uchar AD_Read() //AD讀取數(shù)據(jù)
{
cs=0;//開啟ADC0804
rd=0;//讀打開
delay_ms(1);
outdata=P1;//讀取數(shù)據(jù)
rd=1;//讀關(guān)閉
// cs=1;//關(guān)閉ADC0804
return(outdata);//送出數(shù)據(jù)
}
|
|