基于51单片机的GP2Y1014AU模块PM2.5监测+液晶LCD1602显示
程序源代码
/******************PM2.5监测+液晶LCD1602显示程序源代码********************
单片机型号:STC15W4K56S4,内部晶振:22.1184M。
功能:PM2.5监测+液晶LCD1602显示功能测试。
操作说明:
利用GP2Y1014AU传感器监测PM2.5浓度,并将PM2.5浓度数值显示在液晶LCD1602上
**************************************************************************/
#include "stc15.h"                                //包含头文件stc15.h
#include <intrins.h>        //包含头文件intrins.h
#define Busy 0x80        //LCD忙
#define ADC_POWER  0x80                          //将0x80宏定义成ADC_POWER #define ADC_FLAG    0x10        //将0x10宏定义成ADC_FLAG
#define ADC_START  0x08        //将0x08宏定义成ADC_START #define ADC_SPEEDLL 0x00        //将0x00宏定义成ADC_SPEEDLL #define ADC_SPEEDL  0x20        //将0x20宏定义成ADC_SPEEDL #define ADC_SPEEDH  0x40        //将0x40宏定义成ADC_SPEEDH #define ADC_SPEEDHH 0x60        //将0x60宏定义成ADC_SPEEDHH
sbit GP2Y1014AU_LED = P2^5;
sbit LCD_D0 = P0^0;                      //LCD_D0对应P0.0
sbit LCD_D1 = P0^1;                    //LCD_D1对应P0.1
sbit LCD_D2 = P0^2;                      //LCD_D2对应P0.2
sbit LCD_D3 = P0^3;                        //LCD_D3对应P0.3
sbit LCD_D4 = P0^4;                      //LCD_D4对应P0.4
sbit LCD_D5 = P0^5;                    //LCD_D5对应P0.5
sbit LCD_D6 = P0^6;                      //LCD_D6对应P0.6
sbit LCD_D7 = P0^7;                        //LCD_D7对应P0.7
sbit LCD_RS = P1^0;                      //LCD_RS对应P1.0
sbit LCD_RW = P1^1;                      //LCD_RW对应P1.1
sbit LCD_EN = P3^4;                      //LCD_EN对应P3.4
void delay(unsigned int t);        //delay延时函数
void delay_us(unsigned int t);          //delay_us延时函数
void delay_ms(unsigned int t);              //delay_ms延时函数
void Delay5Ms(void);        //5Ms延时函数
void GPIO_1602_Configuration(void);        //LCD1602液晶IO口初始化
void WriteDataLCD(unsigned char WDLCD);    //LCD写数据函数
void WriteCommandLCD(unsigned char WCLCD,BuysC);  //LCD写命令函数
unsigned char ReadDataLCD(void);    //LCD读数据函数
unsigned char ReadStatusLCD(void);    //LCD读状态函数
void LCDInit(void);    //LCD初始化
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
//LCD显示一个字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData); //LCD显示一个字符串
void GP2Y1014AU_INIT(void);    //AD初始化
unsigned char GetGP2Y1014AUResult(unsigned char ch);  //获取AD值
void Timer2_Init(void);    //定时器2初始化
unsigned char code welcome[]  = {"GP2Y1014AU"};
unsigned char code Space1[]  = {"                "}; //LCD显示内容空白unsigned char code GP2Y1014AU[] = {"PM2.5:  PPM"};    //LCD显示内容PM2.5:  PPM
u16 counter = 0;
u16 GP2Y1014AU_adcx;
float GP2Y1014AU_temp;
float GP2Y1014AU_tempA;
unsigned char GP2Y1014AU_disbuff[3]={0,0,0};
void delay(unsigned int t)            //delay延时函数
{while(t--);}
void delay_us(unsigned int t)            //delay_us延时函数
{
unsigned char i;
while(t--)
{i=3;while(i--)delay(1);}
}
void delay_ms(unsigned int t)                //delay_ms延时函数
{while(t--){delay_us(t);}}
void Delay5Ms(void)    //5ms延时函数
{unsigned int TempCyc = 3552;while(TempCyc--);}
void Timer2_Init(void)  //定时器2初始化
{
T2H  = 0xff;
T2L  = 0xee;
AUXR &= 0xef;  //定时器2停止工作
IE2  &= 0xfb;  //定时器2禁止中断
EA  =  1;
}
void GP2Y1014AU_INIT(void)      //AD初始化
{
P1ASF  = 0x10;          //P1.4作为AD
ADC_RES = 0;
ADC_CONTR = ADC_POWER|ADC_SPEEDLL;
P2M1 = P2M1&0xdf;
P2M0 = P2M0&0xdf;
}
unsigned char GetGP2Y1014AUResult(unsigned char ch)  //获取AD值
{
ADC_CONTR = ADC_POWER|ADC_SPEEDLL|ch|ADC_START;
delay(4);
while(!(ADC_CONTR&ADC_FLAG));
ADC_CONTR&=~ADC_FLAG;
return ADC_RES;
}
void GPIO_1602_Configuration(void)                    //LCD1602液晶IO口初始化{
P0M1 = P3M1&0x00;
P0M0 = P3M0&0x00;
P1M1 = P3M1&0xfc;
P1M0 = P3M0&0xfc;
P3M1 = P4M1&0xef;
P3M0 = P4M0&0xef;
}
unsigned char ReadStatusLCD(void)            //测试LCD忙碌状态
{
LCD_D7 = 1;        //LCD的D7置1
LCD_RS = 0;        //LCD管脚RS设置成低电平 LCD_RW = 1;        //LCD管脚RW设置成高电平 LCD_EN = 0;            //LCD管脚E设置成低电平
LCD_EN = 0;        //LCD管脚E设置成低电平
LCD_EN = 1;          //LCD管脚E设置成高电平
while(LCD_D7);          //检测忙信号
return(Busy);        //表示当前忙
}
void WriteCommandLCD(unsigned char WCLCD,BuysC)    //BuysC为0时忽略忙检测{
if(BuysC) ReadStatusLCD();                        //根据需要检测忙
LCD_EN = 0;                                        //LCD管脚E设置成低电平
_nop_(); //空操作,延时
_nop_();                                        //空操作,延时
_nop_();                                        //空操作,延时
_nop_();                                    //空操作,延时
_nop_();                                    //空操作,延时
_nop_();                                    //空操作,延时
_nop_();                                    //空操作,延时
_nop_();                                    //空操作,延时
LCD_RS = 0;    //LCD管脚RS设置成低电平 LCD_RW = 0; //LCD管脚RW设置成低电平 _nop_();    //空操作,延时
_nop_();                                          //空操作,延时
P0 = WCLCD;                                        //将数据送入P0口
_nop_();    //空操作,延时
_nop_();    //空操作,延时
_nop_();    //空操作,延时
_nop_();                                          //空操作,延时
LCD_EN = 1;                                        //E置高电平
_nop_();        //空操作,延时
_nop_();        //空操作,延时
_nop_();    //空操作,延时
_nop_();                                          //空操作,延时
LCD_EN = 0;
//当E由高电平跳变成低电平时,液晶模块开始执行命令
}
void WriteDataLCD(unsigned char WDLCD)    //LCD写数据函数
{
ReadStatusLCD(); //读取LCD状态
LCD_EN  = 0;                                  //LCD管脚E设置成低电平
_nop_(); //空操作,延时
_nop_();    //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_();    //空操作,延时
_nop_();    //空操作,延时
LCD_RS = 1;  //LCD管脚RS设置成高电平
LCD_RW = 0; //LCD管脚RW设置成低电平4k电影源代码
P0 = WDLCD;                                    //将数据送入P0口
_nop_();    //空操作,延时
_nop_();      //空操作,延时
_nop_();        //空操作,延时
_nop_();                                      //空操作,延时
LCD_EN = 1;                                    //E置高电平
_nop_();    //空操作,延时
_nop_(); //空操作,延时
_nop_();    //空操作,延时
_nop_();                                      //空操作,延时
LCD_EN = 0;
/
/当E由高电平跳变成低电平时,液晶模块开始执行命令
}
void LCDInit(void)                              //LCD初始化
{
WriteCommandLCD(0x38,0);                        //三次显示模式设置
Delay5Ms();
WriteCommandLCD(0x38,0);
Delay5Ms();
WriteCommandLCD(0x38,0);
Delay5Ms();
WriteCommandLCD(0x38,0);
WriteCommandLCD(0x08,1);                        //关闭显示
WriteCommandLCD(0x01,1);                        //显示清屏
WriteCommandLCD(0x06,1);                        //显示光标移动设置
WriteCommandLCD(0x0C,1);                  //显示开及光标设置
}
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;X &= 0xF;                        //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40;                          //当要显示第二行时地址码+0x40;
X |= 0x80;                                //算出指令码
WriteCommandLCD(X,0);                      //这里不检测忙信号,发送地址码
WriteDataLCD(DData); //发送数据
}
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) {
unsigned char ListLength;
ListLength = 0;
Y &= 0x1;X &= 0xF;                        //限制X不能大于15,Y不能大于1
while (DData[ListLength]>=0x20)            //若到达字串尾则退出
{
if (X <= 0xF)                            //X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。