当前位置:首页 > 基于单片机的室内甲醛检测仪的设计毕业设计
#define Busy 0x80 //用于检测LCM状态字中的Busy标识 sbit LCM_RW = P2^6; //读写控制输入端,LCD1602的第五脚 sbit LCM_RS = P2^5; //寄存器选择输入端,LCD1602的第四脚 sbit LCM_E = P2^7; //使能信号输入端,LCD1602的第6脚
//------------------蜂鸣器发声引脚定义-------------------------------------- sbit buzz=P0^4;
//**************函数声明*************************************** void WriteDataLCM (uchar WDLCM);//LCD模块写数据
void WriteCommandLCM (uchar WCLCM,BuysC); //LCD模块写指令 uchar ReadStatusLCM(void);//读LCD模块的忙标
void DisplayOneChar(uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置显示一个字符
void LCMInit(void);//LCD初始
void delayms(uint ms);//1MS基准延时程序 void delay(uchar i); //延时函数2
void DisplayListChar(uchar X,uchar Y,uchar delayms, uchar code *DData); void judge_xianshi(void);//显示处理程序 void baojing();//报警函数 void init();//系统初始化设置 void AD();//读取AD数据
uchar flag1;
//***********************主程序****************************** main() { uint temp;
init();//系统初始化设置 LCMInit(); while(1) {
AD(); if(AD_DATA[0]>102) baojing();
judge_xianshi(); delayms(100); } }
/********* 系统初始化 ***********/
void init() { buzz=0;
EA=1; //开总中断
TMOD=0x02; //设定定时器 T0工作方式 TH0=216; //利用T0中断产生CLK信号 TL0=216;
TR0=1; //启动定时器T0 ET0=1; STR=0; OE=0; }
void judge_xianshi() {
addata2=AD_DATA[0]*100;//把数据扩大100,为下面求取小数位后2位做准备 //DisplayListChar(0,1,0, \ Lixinguang\在液晶的第一行显示字符\ DisplayListChar(0,0,0, \在液晶的第二行第0位开始显示\ DisplayOneChar( 0, 3, AD_DATA[0]/100+0x30); //显示AD数据的百位 DisplayOneChar( 0, 4, AD_DATA[0]/10+0x30);//显示AD数据的十位 DisplayOneChar( 0, 5, AD_DATA[0]+0x30);//显示AD数据的各位 DisplayListChar(0,7,0, \在液晶的第二行第8位开始显示\//根据VIN=AD*5/256,求取IN3通到输入的电压
DisplayOneChar( 0, 11, AD_DATA[0]/51+0x30);//显示输入电压的整数位 DisplayListChar(0,12,0, \显示小数点
DisplayOneChar( 0, 13, addata2/51/10+0x30);//显示输入电压小数后1位 DisplayOneChar( 0, 14, addata2/51+0x30);//显示输入电压小树后2位 DisplayListChar(0,15,0, \ }
/************报警函数 *******/ void baojing() { int i;
for (i=0;i<3;i++) {buzz=1; delayms(200); buzz=0;
delayms(200); } buzz=0; }
/***********AD
转换函数 **********/ void AD() {
STR=0;
//ADDR这样如果不是通道0,可以在这边加一条其他地址的程序 delay(10);
STR=1; //启动AD转换 delay(10); STR=0;
while(0==EOC);//等待转换结束 OE=1;
AD_DATA[0]=adc0809_data; //读取AD数据,数据范围为0-255 OE=0; }
/***********T0 中断服务程序 ************/
void t0(void) interrupt 1 using 0 {
CLK=~CLK; }
/*==================================================================== 按指定位置显示一串字符:第 X 行,第 y列 注意:字符串不能长于16个字符
======================================================================*/
void DisplayListChar(uchar X,uchar Y,uchar ms, uchar code *DData) {
unsigned char ListLength;
ListLength = 0;
X &= 0x1;
Y &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]!='\\0') //若到达字串尾则退出 {
if (Y <= 0xF) //X坐标应小于0xF {
DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符 ListLength++; Y++; delayms(ms);//延时显示字符串
} else break;//跳出循环体 } }
/*======================================================================
LCM初始化
======================================================================*/
void LCMInit(void) {
LCM_Data = 0;
WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号 delayms(5);
WriteCommandLCM(0x38,0); delayms(5);
WriteCommandLCM(0x38,0); delayms(5);
WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号 WriteCommandLCM(0x08,1); //关闭显示 WriteCommandLCM(0x01,1); //显示清屏
WriteCommandLCM(0x06,1); // 显示光标移动设置 WriteCommandLCM(0x0C,1); // 显示开及光标设置 delayms(100); }
//==============================LCD1602显示子程序================================================ // 写数据函数: E =高脉冲 RS=1 RW=0
//======================================================================*/
void WriteDataLCM(uchar WDLCM) {
ReadStatusLCM(); //检测忙 LCM_Data = WDLCM; LCM_RS = 1; LCM_RW = 0;
LCM_E = 0; //若晶振速度太高可以在这后加小的延时 LCM_E = 0; //延时 LCM_E = 1; }
/*==================================================================== 写指令函数: E=高脉冲 RS=0 RW=0
======================================================================
共分享92篇相关文档