建设门户网站都需要什么意思,网页设计的风格,安卓蓝牙app开发教程,绍兴做网站“智能检测#xff0c;精准把控。温湿度检测系统#xff0c;为您的生活带来全方位的健康保障。”#非标协议项目【下】#xff08;分文件编程#xff09; 前言预备知识1温湿度检测系统需求2.分文件编程核心思路3.分文件编程操作4利用分文件操作建立uart.c、lcd1602.c、dht11… “智能检测精准把控。温湿度检测系统为您的生活带来全方位的健康保障。”#非标协议项目【下】分文件编程 前言预备知识1温湿度检测系统需求2.分文件编程核心思路3.分文件编程操作4利用分文件操作建立uart.c、lcd1602.c、dht11.c、delay.c文件5.将串口的代码LCD1602代码DHT11代码延时代码整合到对应的C文件中5.1串口的代码5.2 LCD1602代码5.3 DHT11代码5.4延时代码 6.利用分文件操作建立uart.h、lcd1602.h、dht11.h、delay.h、io.h文件。6.1 uart.h 文件内容6.2 lcd1602.h 文件内容6.3 dht11.h 文件内容6.4 delay.h 文件内容6.5 io.h 文件内容 7.在主C文件中调用这些“.h”文件在uart.c、lcd1602.c、dht11.c、delay.c调用需要的“.h”文件7.1主C文件调用“.h”文件7.2 uart.c调用需要的“.h”文件7.3 lcd1602.c调用需要的“.h”文件7.4 dht11.c调用需要的“.h”文件7.5 delay.c调用需要的“.h”文件 8.在主C文件中保留主函数代码引入外部变量。8.1主C文件中保留主函数代码8.2 引入外部变量 9.完整程序代码截图9.1主C文件代码截图9.2 uart.c 代码截图9.3 lcd1602.c代码截图9.4 dht11.c代码截图9.5 delay.c代码截图9.6 uart.h 代码截图9.7 lcd1602.h代码截图9.8 dht11.h代码截图9.9 delay.h代码截图9.10 io.h代码截图 结束语 前言 本篇博文介绍的是用51单片机的非标准写协议项目温湿度检测系统【下】分文件编程包含温湿度检测系统需求分文件编程核心思路分文件编程操作利用分文件操作建立uart.c、lcd1602.c、dht11.c、delay.c文件将串口的代码LCD1602代码DHT11代码延时代码整合到对应的C文件中利用分文件操作建立uart.h、lcd1602.h、dht11.h、delay.h、io.h文件在主C文件中调用这些“.h”文件在uart.c、lcd1602.c、dht11.c、delay.c调用需要的“.h”文件在主C文件中保留主函数代码引入外部变量完整程序代码截图。看到这篇博文的朋友可以先赞再看吗
预备知识 一、基本电路标识识别和接线例如VCC,GND。 二、电脑基本操作复制粘贴 三、C头文件 四、C变量 五、基本输入输出 六、流程控制 七、函数 八、指针 九字符串 如果以上知识不清楚请自行学习后再来浏览。如果我有没例出的请在评论区写一下。谢谢啦
1温湿度检测系统需求
能够实时通过51单片机串口发送温湿度信息能够实时通过51单片机驱动LCD1602显示温湿度信息能够实现判断温度到达一定温度让LED亮也可以通过串口发送指令使LED亮灭采用分文件编程
2.分文件编程核心思路
分文件编程操作利用分文件操作建立uart.c、lcd1602.c、dht11.c、delay.c文件将串口的代码LCD1602代码DHT11代码延时代码整合到对应的C文件中。利用分文件操作建立uart.h、lcd1602.h、dht11.h、delay.h、io.h文件。在主C文件中调用这些“.h”文件在uart.c、lcd1602.c、dht11.c、delay.c调用需要的“.h”文件。在主C文件中保留主函数代码引入外部变量。 注此程序是基于温湿度检测系统_1602显示串口发送工程修改而来。
3.分文件编程操作
操作步骤
1.打开温湿度检测系统\_分文件编程工程 2.在Source Group 1 上右键在弹出的界面上选择第二项 3.在弹出的界面中我们可以添加C文件头文件等之后的操作都是如此。 4利用分文件操作建立uart.c、lcd1602.c、dht11.c、delay.c文件 5.将串口的代码LCD1602代码DHT11代码延时代码整合到对应的C文件中
5.1串口的代码
sfr AUXR 0x8e; //声明AUXR寄存器地址
sbit LED2 P3^6;char LEDStatus[12];void UartInit(void) //自己配
{//配置串口工作方式为方式1从只收不发改为能收能发SCON 0x50;//配置辅助寄存器减少电磁辐射稳定晶振频率 AUXR 0x01;//设置定时器工作方式为定时器1的8位自动重装TMOD 0x0F;TMOD | 0x20;//设置串口波特率为9600,0误差TH1 0xFD;TL1 0xFD;//打开定时器1TR1 1;//打开总中断EA 1;//打开串口中断ES 1;}void sendByte(char data_mas)
{SBUF data_mas;while(!TI);TI 0; //一定要软件置零不然会出现乱序
}void sendString(char *str)
{while(*str ! \0){sendByte(*str);str;}
}void UART_handler() interrupt 4
{static char i 0;//在串口中段函数中可以对发送接收中断标志进行处理if(RI 1){RI 0; //必须软件置零LEDStatus[i] SBUF;i;if(strstr(LEDStatus,开灯)){LED1 0;LED2 0;Delay1000ms();Delay1000ms();i 0;memset(LEDStatus,\0,12);}if(strstr(LEDStatus,关灯)){LED1 1;LED2 1;Delay1000ms();i 0;memset(LEDStatus,\0,12);}}if(TI);}5.2 LCD1602代码
//数据线定义
//D0到D7 -- P0.1到P0.7
#define dataBuffer P0//控制线定义
/*
RS--P1.0
RW--P1.1
EN--P1.4
*/
sbit RS P1^0;
sbit RW P1^1;
sbit EN P1^4;void checkBusy()
{char tmp 0x80;dataBuffer 0x80;while(tmp 0x80) //只要dataBuffer中的第8位为1就为忙因为BF为忙标志位高电平表示忙此时模块不能接收命令或者数据如果为低电平表示不忙。{RS 0; //根据手册中指令表可知RS0RW1RW 1; //RW1为读的操作所以需要配置读的时序图EN 0; //根据手册中的写时序图EN开始为低电平_nop_(); //执行空函数等待EN拉高EN 1; //根据手册中的读时序图EN被拉高_nop_(); //执行空函数等待tpw和tF高电平过程_nop_();tmp dataBuffer; //读取dataBuffer中的忙信号EN 0; //根据手册中的写时序图EN被拉低_nop_(); //根据手册中的写时序图让EN保持一段时间的低电平}
}void writeCmd(char cmd)
{ checkBusy(); //检测忙信号RS 0; //RS等于零是写指令操作RW 0; //RW在手册中写的时序图是可以全程低电平EN 0; //根据手册中的写时序图EN开始为低电平_nop_(); //执行空函数等待EN拉高dataBuffer cmd; //根据手册中的写时序图数据在EN还在低电平时就建立数据EN 1; //根据手册中的写时序图EN被拉高_nop_(); //执行空函数等待tpw和tF高电平过程_nop_();EN 0; //根据手册中的写时序图EN被拉低_nop_(); //根据手册中的写时序图让EN保持一段时间的低电平
}void weiteData(char cData)
{checkBusy(); //检测忙信号RS 1; //RS等于1是写数据操作RW 0; //RW在手册中写的时序图是可以全程低电平EN 0; //根据手册中的写时序图EN开始为低电平_nop_(); //执行空函数等待EN拉高dataBuffer cData; //根据手册中的写时序图数据在EN还在低电平时就建立数据EN 1; //根据手册中的写时序图EN被拉高_nop_(); //执行空函数等待tpw和tF高电平过程_nop_();EN 0; //根据手册中的写时序图EN被拉低_nop_(); //根据手册中的写时序图让EN保持一段时间的低电平
}void initLCD1602()
{
//1 延时 15msDelay15ms();
//2 写指令 38H(不检测忙信号)writeCmd(0x38);
//3 延时 5msDelay5ms();
//4 以后每次写指令读/写数据操作均需要检测忙信号
//5 写指令 38H显示模式设置writeCmd(0x38);
//6 写指令 08H显示关闭writeCmd(0x08);
//7 写指令 01H显示清屏writeCmd(0x01);
//8 写指令 06H显示光标移动设置writeCmd(0x06);
//9 写指令 0CH显示开及光标设置writeCmd(0x0C);
}void LCD1602ShowARow(char line,char column,char *str)
{switch(line) //选择哪行显示{case 1: //第一行显示writeCmd(0x80 column); //选择哪个位置显示因为位置地址的最高位必须为1所以0x80列数while(*str) //判断字符串指针变量不为空执行循环不用判断字符串结束标志{weiteData(*str); //发送字符串单个字符str; //字符串指针变量偏移}break;case 2: //第二行显示writeCmd(0x80 0x40 column); //选择哪个位置显示因为位置地址的最高位必须为1所以0x80列数又因为第二行的列从0x40开始while(*str) //所以是从0x80 0x40 列数特别注意{ weiteData(*str);str;}break;}
}5.3 DHT11代码
sbit Data P3^3; //把DHT11接在单片机的P3.3口char THdata[5]; //存放温湿度数据变量
char Temperature[9]; //定义温度字符数组
char Humidness[9]; //定义湿度字符数组void startDHT()
{Data 1;Data 0;//至少延时18ms那么延时30msDelay30ms();Data 1;//检测d点while(Data);//检测e点while(!Data);//检测f点while(Data);
}void readDHTData()
{char i; //轮次char j; //次数char flag;char tmp;//打开DHT11高速模式startDHT();for(i0; i5; i){for(j0; j8; j){//检测G点while(!Data);//根据传送1和0的时间不同0是26us1是70us。等待60us后如果Data 1,就传1Data 0;就传0//Delay60us(); 延时60微妙太长了可能在读0时读到下一个发送序列了延时40微妙Delay40us();if(Data 1){flag 1;while(Data); //传1的时间比较久所以要等传1结束}else{flag 0;}tmp tmp 1;tmp | flag;}THdata[i] tmp;}
}void THDataHandler()
{//湿度数据处理Humidness[0] H;Humidness[1] :;Humidness[2] THdata[0]/10 0x30;Humidness[3] THdata[0]%10 0x30;Humidness[4] .;Humidness[5] THdata[1]/10 0x30;Humidness[6] THdata[1]%10 0x30;Humidness[7] %;Humidness[8] \0;//温度处理Temperature[0] T;Temperature[1] :;Temperature[2] THdata[2]/10 0x30;Temperature[3] THdata[2]%10 0x30;Temperature[4] .;Temperature[5] THdata[3]/10 0x30;Temperature[6] THdata[3]%10 0x30;Temperature[7] C;Temperature[8] \0;
}5.4延时代码
void Delay15ms() //11.0592MHz
{unsigned char i, j;i 27;j 226;do{while (--j);} while (--i);
}void Delay5ms() //11.0592MHz
{unsigned char i, j;i 9;j 244;do{while (--j);} while (--i);
}void Delay30ms() //11.0592MHz
{unsigned char i, j; i 54;j 199;do{while (--j);} while (--i);
}void Delay40us() //11.0592MHz
{unsigned char i;_nop_();i 15;while (--i);
}void Delay1000ms() //11.0592MHz
{unsigned char i, j, k;_nop_();i 8;j 1;k 243;do{do{while (--k);} while (--j);} while (--i);
}6.利用分文件操作建立uart.h、lcd1602.h、dht11.h、delay.h、io.h文件。
6.1 uart.h 文件内容
这个文件的作用主要起到声明函数的作用。
void UartInit(void); //自己配void sendByte(char data_mas);void sendString(char *str);6.2 lcd1602.h 文件内容
这个文件的作用主要起到声明函数的作用。
void initLCD1602();void LCD1602ShowARow(char line,char column,char *str);6.3 dht11.h 文件内容
这个文件的作用主要起到声明函数的作用。
void readDHTData();void THDataHandler();6.4 delay.h 文件内容
这个文件的作用主要起到声明函数的作用。
void Delay15ms(); //11.0592MHzvoid Delay5ms(); //11.0592MHzvoid Delay30ms(); //11.0592MHzvoid Delay40us(); //11.0592MHzvoid Delay1000ms(); //11.0592MHz6.5 io.h 文件内容
这个文件的作用主要起到声明函数的作用。
sbit LED1 P3^7; //用尾定义声明LED17.在主C文件中调用这些“.h”文件在uart.c、lcd1602.c、dht11.c、delay.c调用需要的“.h”文件
7.1主C文件调用“.h”文件
#include reg52.h
#include intrins.h
#include delay.h
#include uart.h
#include lcd1602.h
#include dht11.h
#include io.h7.2 uart.c调用需要的“.h”文件
#include reg52.h
#include delay.h
#include io.h
#include string.h7.3 lcd1602.c调用需要的“.h”文件
#include reg52.h
#include intrins.h
#include delay.h7.4 dht11.c调用需要的“.h”文件
#include reg52.h
#include delay.h7.5 delay.c调用需要的“.h”文件
#include intrins.h8.在主C文件中保留主函数代码引入外部变量。
8.1主C文件中保留主函数代码
LED1 1; //一上电就让灯灭
Delay1000ms();
UartInit(); //初始化串口
initLCD1602(); //初始化LCD1602
Delay1000ms(); //等待DHT模块稳定
Delay1000ms();
while(1) //防止程序退出主函数导致LED1微弱闪烁
{Delay1000ms(); //间隔1秒读一次readDHTData(); //读取DHT11温湿度数据THDataHandler(); //将DHT11传回的数据装入温湿度字符数组//通过串口发送温湿度数据sendString(Humidness);sendString(\r\n);sendString(Temperature);sendString(\r\n);sendString(\r\n);LCD1602ShowARow(1,4,Humidness); LCD1602ShowARow(2,4,Temperature);
}8.2 引入外部变量
extern为引入外部变量标志
//引入DHT11.c内的全局变量
extern char THdata[5]; //存放温湿度数据变量 extern为引入外部变量标志
extern char Temperature[9]; //定义温度字符数组
extern char Humidness[9]; //定义湿度字符数组9.完整程序代码截图
9.1主C文件代码截图 9.2 uart.c 代码截图 9.3 lcd1602.c代码截图 9.4 dht11.c代码截图 9.5 delay.c代码截图 9.6 uart.h 代码截图 9.7 lcd1602.h代码截图 9.8 dht11.h代码截图 9.9 delay.h代码截图 9.10 io.h代码截图 结束语 很高兴您能看到这里点个赞再走呗。谢谢您啦