标题:
用单片机+ADC0804实现电压的AD转换,LCD1602显示电压
[打印本页]
作者:
18896597781
时间:
2021-5-31 14:10
标题:
用单片机+ADC0804实现电压的AD转换,LCD1602显示电压
AD转换程序:
用ADC0804芯片实现对电压的采集;
用LCD1602显示电压值;
采集误差位0.05V;
附件包含完整程序和仿真实际;
文件中含有ADC0804芯片介绍。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
无标题.png
(54.15 KB, 下载次数: 67)
下载附件
仿真效果
2021-5-31 13:56 上传
单片机源程序如下:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define LCD_DB P1
#define DB P0
sbit LCD_RS=P2^0; //P2.2~lcd的RS
sbit LCD_RW=P2^1; //p2.1~lcd的RW
sbit LCD_E=P2^2; //p2.2~lcd的E
sbit AD_CS=P2^3; //P2.3~0804的CS
sbit AD_RD=P2^4; //P2.4~0804的RD
sbit AD_WR=P2^5; //P2.5~0804的WR
sbit AD_INTR=P3^2; //P3.2~O8O4的INTR,采用中断方式采集数据
void LCD_init(void); //LCD初始化函数
void LCD_write_command(uchar dat); //LCD写命令函数
void LCD_write_data(uchar dat); //LCD写数据函数
void display(ulong num);
uchar table[]="The Volt Is:"; //第一行提示字符串
//********延时函数***************
void delay_n40us(uint n)
{ uint i;
uchar j;
for(i=n;i>0;i--)
for(j=0;j<2;j++); //在这个延时循环函数中我只做了2次循环,
}
//*************LCD初始化函数************
void LCD_init(void)
{
LCD_write_command(0x38);//设置8位格式,2行,5x7
LCD_write_command(0x0c);//整体显示,关光标,不闪烁
LCD_write_command(0x06);//设定输入方式,增量不移位--------------
LCD_write_command(0x01);//清除屏幕显示----------------
delay_n40us(100);
}
//****************lcd写命令函数
void LCD_write_command(uchar dat)
{
LCD_DB=dat;
LCD_RS=0;
LCD_RW=0;
LCD_E=1;
LCD_E=0;
delay_n40us(1);
}
//**********lcd写数据函数************
void LCD_write_data(uchar dat)
{
LCD_DB=dat;
LCD_RS=1;
LCD_RW=0;
LCD_E=1;
LCD_E=0;
delay_n40us(1);
}
//************显示电压函数
void display(ulong num)
{
uchar ge,point,zhi;
zhi=(num*50+122)/255; //算出电压值,保留一位小数,误差0.5V
ge=zhi/10%10; //提取各位
point=zhi%10; //提取小数位
LCD_write_command(0x80+64+6); //从第二行第七个位置开始显示电压
LCD_write_data(0x30+ge); //显示个位
delay_n40us(1500);
LCD_write_data('.'); //显示小数点
delay_n40us(1500);
LCD_write_data(0x30+point); //显示小数
delay_n40us(1500);
LCD_write_data(0x30);
delay_n40us(1500);
LCD_write_data('V'); //显示单位V
delay_n40us(1500);
}
void in1t0_AD( ) interrupt 0 using 1 //当AD转换完成ITNR变0进入中断
{
ulong num;
EA=0; //关中断
AD_RD=1;
delay_n40us(1);
AD_RD=0; //读数据有效
delay_n40us(1);
num=DB; //读取0804AD转换的数据
delay_n40us(10);
AD_RD=1;
display(num); //显示电压
}
void main()
{
uchar i;
LCD_init();
DB=0xff;
P3=0xff;
LCD_write_command(0x80); //从第一行开始显示提示字符
for(i=0;i<12;i++)
{
LCD_write_data(table[i]);
}
DB=0xff;
P3=0xff;
EA=1; //开中断
EX0=1; //开中断0
IT0=1; //中断0下降沿有效
AD_INTR=1;
while(1)
{
EA=1;
AD_CS=1;
delay_n40us(1);
AD_CS=0; //选0804芯片
delay_n40us(2);
AD_WR=1;
delay_n40us(1);
AD_WR=0; //开始AD转换
delay_n40us(1);
AD_WR=1;
delay_n40us(1);
}
}
复制代码
所有资料51hei提供下载:
AD转换.zip
(1.03 MB, 下载次数: 96)
2021-5-31 14:08 上传
点击文件名下载附件
程序和仿真设计
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1