#include<reg52.h>
#include<intrins.h>
#include<stdio.h>
#define uchar unsigned char //宏定义
#define uint unsigned int //宏定义
uchar code table[]="Voltage Is:";
uchar code dis[]="CH1--1.2344V";
char str[6]; //定义一个6位的一维数组
float voltage; //定义ad_vo为浮点形数
uchar num;
sbit lcden=P3^4; // LCD 使能信号E
sbit lcdrs=P3^5; // LCD 数据/命令先择端 RS
sbit dula=P2^6;//数码管段选信号
sbit wela=P2^7; //数码管位选信号,Q7为ADC0804_CS片选信号
sbit adwr=P3^6; //AD0804 写信号位
sbit adrd=P3^7; //AD0804 读信号位
uchar get_ad(); //AD 读取子函数
void init();//初始化子函数
void write_com(uchar com); //LCD 写命令子函数
void write_dat(uchar dat); //LCD 写数据子函数
void delayms(uint xms); //延时子函数
void main()
{
init();
for(num=0;num<11;num++)
{
write_dat(table[num]); //写入第一行数据
delayms(10);
}
write_com(0x80+0x40);//数据指针初始化,换一行显示下面的数据(0x40)
for(num=0;num<5;num++)
{
write_dat(dis[num]);
delayms(10);
}
write_com(0x80+0x40+5);//数据指针初始化
voltage=(float)get_ad()*5.0/256.0;
sprintf(str,"%4f",voltage);//将浮点数转化为字符,并显示小数点后4位,并把这个字符串赋给str[6];
for(num=0;num<6;num++)
{
write_dat(str[num]);
delayms(10);
}
delayms(10);
write_com(0x80+0x40+11);//数据指针初始化
write_dat(dis[11]);
delayms(10);
while(1);
}
void init();
void write_com(uchar com); //LCD 写命令子函数
void write_dat(uchar dat); //LCD 写数据子函数
void delayms(uint xms); //延时子函数
uchar get_ad(); //AD 读取子函数
void init()
{
dula=0; //关数码管的段(因LCD与数码管都用P0口)
wela=0; //关数码管的位(因LCD与数码管都用P0口)
lcden=0;// LCD 使能信号E 设为低电平
write_com(0x38);// 显示模式设置,设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c);// 显示开/关设置即00001100,开显示且不显示光标
write_com(0x06);// 光标设置00000110,当读/写一个字符后地地指针加1,且光标加1,且整屏显示不移动
write_com(0x01);// 清屏指令,数据指针清零,所有显示清零。
write_com(0x80);// 数据指针初始化,指向0x00
}
void write_com(uchar com)//LCD 写命令子函数
{
lcdrs=0; // LCD 数据/命令先择端 RS设为低电平,即命令输入
P0=com; //把此命令赋给P0。即LCD的Data I/O 口。
delayms(5);
lcden=1; // LCD 使能信号E 设为高电平
delayms(5);
lcden=0; // LCD 使能信号E 设为低电平,一个高脉冲,LCD 读走命令。
}
void write_dat(uchar dat) //LCD 写数据子函数
{
lcdrs=1; // LCD 数据/命令先择端 RS设为低电平,即数据输入
P0=dat; //把此数据赋给P0。即LCD的Data I/O 口。
delayms(5);
lcden=1; // LCD 使能信号E 设为高电平
delayms(5);
lcden=0; // LCD 使能信号E 设为低电平,一个高脉冲,LCD 读走数据。
}
void delayms(uint xms) //延时子函数
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
uchar get_ad() //AD 读取子函数
{
uchar ad_val;
wela=1;
P0=0x7f; //将AD0804片选信号置0 (0111 1111=0x7f)
wela=0;
adwr=1;//关AD转换
_nop_();//等待一个机器周期
adwr=1;//开AD转换,将读到的值送入AD0804的锁存器中
_nop_();//等待一个机器周期
adwr=0;//关AD转换
P1=0xff; //P1口置高位
adrd=1;//关AD0804读信号脚
_nop_();
adrd=0;//开AD0804读信号脚,单片机读取AD0804的锁存器中的值到P1口
_nop_();
ad_val=P1;//将AD0804的锁存器中读到的值赋给voltage
adrd=1;//关AD0804读信号脚
return ad_val;//将变量voltage的值返回给要调用的AD读取子函数的函数
}
|