51单片机实现lcd1602和sgp30二氧化碳检测程序
时间: 2023-09-22 08:08:15 浏览: 121
以下是51单片机实现LCD1602和SGP30二氧化碳检测程序的代码,需要使用Keil C编译器,并连接好LCD1602和SGP30模块:
```
#include<reg52.h>
#include<intrins.h>
#define LCD P2
sbit RS=P3^0;
sbit RW=P3^1;
sbit EN=P3^2;
unsigned int ppm; //存放二氧化碳浓度值
void delay(unsigned int i) //延时函数
{
unsigned int j;
for(;i>0;i--)
{
for(j=121;j>0;j--);
}
}
void sendcmd(unsigned char cmd) //发送指令函数
{
RS=0;
RW=0;
LCD=cmd;
EN=1;
delay(5);
EN=0;
}
void senddata(unsigned char dat) //发送数据函数
{
RS=1;
RW=0;
LCD=dat;
EN=1;
delay(5);
EN=0;
}
void init() //初始化函数
{
sendcmd(0x38); //16*2显示,5*7点阵,8位数据接口
sendcmd(0x0c); //显示开,光标关,闪烁关
sendcmd(0x06); //光标右移,字符不移动
sendcmd(0x01); //清屏
delay(5);
}
void read_ppm() //读取二氧化碳浓度值函数
{
unsigned char i=0;
unsigned char buf[9]={0};
unsigned char checksum=0;
unsigned char data_high=0;
unsigned char data_low=0;
unsigned char crc=0;
for(i=0;i<9;i++) //读取9个字节的数据
{
while(!SBUF); //等待接收数据
buf[i]=SBUF; //存储接收到的数据
while(!TI); //等待发送完毕
TI=0; //清除发送标志位
}
checksum=buf[0]; //获取校验和
data_high=buf[1]; //获取高位数据
data_low=buf[2]; //获取低位数据
crc=buf[8]; //获取CRC校验码
if(checksum==0xff && crc==0xff) //判断校验和和CRC校验码是否正确
{
ppm=(data_high<<8)|data_low; //计算二氧化碳浓度值
}
}
void main()
{
unsigned char i=0;
unsigned char cmd[4]={0x80,0x81,0x8f,0x8e}; //设置光标位置的指令
init(); //初始化LCD
TMOD=0x20; //设置定时器1为模式2
TH1=0xfd; //设置定时器1初值
TL1=0xfd;
TR1=1; //启动定时器1
SCON=0x50; //设置串口为模式1,8位数据,可变波特率
while(1)
{
for(i=0;i<4;i++) //在LCD上显示四个光标
{
sendcmd(cmd[i]);
senddata('*');
delay(100);
}
sendcmd(0x01); //清屏
SBUF=0xff; //发送读取命令
while(!TI); //等待发送完毕
TI=0; //清除发送标志位
while(!RI); //等待接收数据
RI=0; //清除接收标志位
read_ppm(); //读取二氧化碳浓度值
sendcmd(0x80); //设置光标位置为第一行第一列
senddata('CO2:'); //在LCD上显示CO2字样
senddata(ppm/1000+'0'); //在LCD上显示千位数
senddata(ppm/100%10+'0'); //在LCD上显示百位数
senddata(ppm/10%10+'0'); //在LCD上显示十位数
senddata(ppm%10+'0'); //在LCD上显示个位数
senddata('p'); //在LCD上显示p字母
senddata('p'); //在LCD上显示p字母
senddata('m'); //在LCD上显示m字母
senddata(' '); //在LCD上显示空格
senddata(' '); //在LCD上显示空格
senddata(' '); //在LCD上显示空格
senddata(' '); //在LCD上显示空格
sendcmd(0x8f); //设置光标位置为第二行第六列
senddata('By'); //在LCD上显示By字样
senddata(':)'); //在LCD上显示笑脸符号
delay(1000); //延时1秒
sendcmd(0x01); //清屏
delay(5);
}
}
```
在此程序中,我们使用P2口作为LCD1602SGP30的数据口,P3口的0、1、2三个引脚分别作为LCD1602SGP30的RS、RW、EN引脚,同时使用单片机自带的串口模块与SGP30通信。在初始化函数中,我们发送一系列指令来设置LCD1602SGP30的显示参数。在主函数中,我们使用定时器1定时读取SGP30模块的数据,并通过串口接收到单片机中,然后计算出二氧化碳浓度值并在LCD1602SGP30上显示。同时,我们在LCD1602SGP30上显示四个光标和一个笑脸符号,实现了一个简单的二氧化碳检测程序。
阅读全文