基于51单片机及PCF8591芯片的ADC电压检测加LCD1602显示程序
时间: 2023-12-02 15:06:02 浏览: 174
以下是基于51单片机及PCF8591芯片的ADC电压检测加LCD1602显示程序:
```
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^0; //RS引脚
sbit RW=P2^1; //RW引脚
sbit EN=P2^2; //EN引脚
sbit SDA=P1^1; //IIC数据线
sbit SCL=P1^0; //IIC时钟线
void delay(uint xms) //延时函数
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void LCD_WriteCom(uchar com) //写命令函数
{
RS=0;
RW=0;
P0=com;
EN=1;
_nop_();
EN=0;
delay(5);
}
void LCD_WriteData(uchar dat) //写数据函数
{
RS=1;
RW=0;
P0=dat;
EN=1;
_nop_();
EN=0;
delay(5);
}
void LCD_Init() //LCD初始化函数
{
delay(50);
LCD_WriteCom(0x38);
LCD_WriteCom(0x0c);
LCD_WriteCom(0x06);
LCD_WriteCom(0x01);
delay(5);
}
void IIC_Start() //IIC开始信号函数
{
SDA=1;
SCL=1;
delay(5);
SDA=0;
delay(5);
SCL=0;
}
void IIC_Stop() //IIC停止信号函数
{
SDA=0;
SCL=1;
delay(5);
SDA=1;
delay(5);
}
void IIC_SendByte(uchar dat) //IIC发送一个字节函数
{
uchar i;
for(i=0;i<8;i++)
{
if(dat&0x80)
SDA=1;
else
SDA=0;
SCL=1;
delay(5);
SCL=0;
dat<<=1;
}
SDA=1;
SCL=1;
delay(5);
SCL=0;
}
uchar IIC_ReadByte() //IIC读一个字节函数
{
uchar i,dat=0;
SDA=1;
for(i=0;i<8;i++)
{
dat<<=1;
SCL=1;
delay(5);
if(SDA)
dat|=0x01;
SCL=0;
delay(5);
}
return dat;
}
void PCF8591_Write(uchar dat) //写DAC函数
{
IIC_Start();
IIC_SendByte(0x90);
IIC_ReadByte();
IIC_SendByte(dat);
IIC_ReadByte();
IIC_Stop();
}
uchar PCF8591_Read() //读ADC函数
{
uchar dat;
IIC_Start();
IIC_SendByte(0x90);
IIC_ReadByte();
IIC_SendByte(0x00);
IIC_ReadByte();
IIC_Start();
IIC_SendByte(0x91);
IIC_ReadByte();
dat=IIC_ReadByte();
IIC_Stop();
return dat;
}
void main()
{
uchar dat;
LCD_Init();
while(1)
{
dat=PCF8591_Read();
LCD_WriteCom(0x80);
LCD_WriteData('V');
LCD_WriteData(':');
LCD_WriteData(dat/10+'0');
LCD_WriteData(dat%10+'0');
delay(100);
}
}
```
该程序主要实现了通过PCF8591芯片实现ADC电压检测,并将检测到的电压值显示在LCD1602上。其中,PCF8591_Read函数用于读取ADC芯片的电压值,PCF8591_Write函数用于写入DAC芯片的输出电压值,LCD_Init函数用于初始化LCD1602,LCD_WriteCom函数用于向LCD1602发送命令,LCD_WriteData函数用于向LCD1602发送数据。在主函数中,通过调用PCF8591_Read函数获取到电压值,然后将其显示在LCD1602上。
阅读全文