2022年温湿度检测程序 .pdf
华北水利水电学院毕业设计1 附录三:系统源程序代码#include /头文件#include /*#define uchar unsigned char/定义一下方便使用#define uint unsigned int/定义一下方便使用#define ulong unsigned long/定义一下方便使用#define TEMP_ML 0 x03/00000011温度命令#define HUMI_ML 0 x05/00000101温度命令sbit k1=P30;/定义 I/O 口 P1.1,连接按键 1,传感器开始工作sbit k2=P31;/定义 I/O 口 P1.2,连接按键 2,进入设置温度上下限状态sbit kTH=P32;/定义 I/O 口 P3.2,连接按键 kTH,设置上限值sbit KTL=P33;/定义 I/O 口 P3.3,连接按键 kTL,设置下限值sbit k5=P34;/定义标志位 flag sbit k6=P36;sbit k7=P37;/unsigned char error;/全局错误变量unsigned char ack;/全局应答变量unsigned char temp_h;/全局应答变量unsigned char temp_LL;/全局应答变量unsigned char temp_zi;/全局应答变量unsigned char humi_zi;/全局应答变量unsigned char ml;unsigned char flag;/全局应答变量unsigned int xianzhi_t=0;/温度显值unsigned int xianzhi_h=0,z;/湿度显值int TH=400;/上限值,初始化为40 int TL=100;/下限值,初始化为10 int HH=800;int HL=200;unsigned char BZ_flag=0;/蜂鸣器扫描函数speaker()的启动/关闭标志,为1则启动,为 0 则关闭unsigned char RT_flag=0;/读取与转换温度函数ReadTemperature()的启动/关名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 11 页 -华北水利水电学院毕业设计2 闭标志,为 1 则启动,为 0 则关闭unsigned char SHT11_flag;/SHT11的工作标志,当按键按下,该变量为1 sbit DATA=P20;/数据sbit SCK=P21;/时钟sbit gwei=P26;/个位sbit beep=P07;/定义 I/O 口 P1.7,连接蜂鸣器,低电平启动蜂鸣器报警sbit swei=P25;/十位sbit bwei=P24;/百位sbit qwei=P23;/千位sbit blueled=P03;/定义 I/O 口 P1.3,连接蓝灯,温度传感器工作状态灯sbit greenled=P04;/定义 I/O 口 P1.4,连接绿灯,设置温度灯sbit redled=P05;/定义 I/O 口 P1.5,连接红灯,温度超过设置报警值的最大值的报警灯sbit yellowled=P06;/定义 I/O 口 P1.5,连接绿灯,温度超过设置报警值的最小值的报警灯sbit led=P02;unsigned char code dispcode=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90;/共阳/*基本驱动程/*函数功能:外部中断 0 服务程序,设置报警上限值入口参数:出口参数:*/void INT0ISR(void)interrupt 0 using 3 if(flag=1&xianzhi_t500)xianzhi_t=(xianzhi_t+10);if(flag=254&xianzhi_h500)xianzhi_t=500;/设置的上限最高为99/else if(xianzhi_h900)xianzhi_h=900;/else if(xianzhi_t0)xianzhi_t=0;/设置的下限最低为0/else if(xianzhi_h0)xianzhi_t=(xianzhi_t-10);if(flag=254&xianzhi_h100)xianzhi_h=(xianzhi_h-10);/if(xianzhi_t10)/xianzhi_t=0;/设置的下限最低为0/if(xianzhi_h0;x-)for(y=110;y0;y-);/*函数功能:按键扫描程序入口参数:出口参数:*/void button(void)if(k1=0)blueled=0;/除了 SHT11 的工作灯(黄灯)亮之外,其余灯灭greenled=1;RT_flag=1;/启动温度读取与转换函数ReadTemperature()BZ_flag=1;/启动蜂鸣器扫描函数speaker()SHT11_flag=1;/SHT11 标志位为 1 EX0=0;/关外部中断 0 EX1=0;/关外部中断 1 if(k2=0)delay(300);if(k2=0)greenled=0;/除了设置报警值时的状态灯(绿灯)亮之外,其余灯灭blueled=1;RT_flag=0;BZ_flag=0;xianzhi_t=200;/进入设置报警值时,初始显示30 xianzhi_h=500;EX0=1;/开外部中断 1 EX1=1;/开外部中断 1 if(k5=0)名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 11 页 -华北水利水电学院毕业设计5 delay1(100);if(k5=0)while(!k5);delay(50);while(!k5);flag=flag;if(k6=0)delay1(50);if(k6=0)while(!k6);delay1(50);while(!k6);if(flag=1&xianzhi_t600)xianzhi_t=(xianzhi_t+10);TH=xianzhi_t;if(flag=254&xianzhi_h0)xianzhi_t=(xianzhi_t-10);TL=xianzhi_t;名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 11 页 -华北水利水电学院毕业设计6 if(flag=254&xianzhi_h100)xianzhi_h=(xianzhi_h-10);HL=xianzhi_h;/TL=xianzhi_t;/HL=xianzhi_h;/else/return;/*函数功能:蜂鸣器扫描程序入口参数:B_flag 出口参数:*/void speaker(unsigned char B_flag)if(B_flag)/xianzhi_t=30;TH=25;xianzhi_h=20;HL=30;if(xianzhi_tTH)beep=0;redled=0;/温度大于上限值,启动蜂鸣器,红灯亮,报警if(xianzhi_hHH)beep=0;redled=0;if(xianzhi_tTL)beep=0;yellowled=0;if(xianzhi_h0;i/=2)/位移 8 位 SCK=1;/上升沿读入if(DATA)val=(val|i);/确定值SCK=0;DATA=0;/读应答信号,有应答为1,为应答为 0 通过 CPU 下拉为应答SCK=1;/第 9 个脉冲_nop_();_nop_();_nop_();/pulswith approx.5 us 延时SCK=0;DATA=1;/释放数据总线temp_h=val;val=0;/低 8 位/DATA=1;/释放数据总线for(i=0 x80;i0;i/=2)/位移 8 位 SCK=1;/上升沿读入if(DATA)val=(val|i);/确定值SCK=0;DATA=1;/0;/不需要应答通过 CPU 下拉为应答SCK=1;/第 9 个脉冲_nop_();_nop_();_nop_();/pulswith approx.5 us SCK=0;DATA=1;/释放数据总线temp_LL=val;return val;/char write(unsigned char value)/写一个字节返回应答信号/-unsigned char i;ack=0;for(i=0 x80;i0;i/=2)/释放数据总线 if(i&value)DATA=1;/写入值else DATA=0;SCK=1;/上升沿写入名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 11 页 -华北水利水电学院毕业设计8 _nop_();_nop_();_nop_();/延时SCK=0;DATA=1;/释放数据总线SCK=1;/第 9 个脉冲if(DATA=1)ack=1;/读应答信号SCK=0;return ack;/error=1 表示没有应答/void start_sht11(void)/启动/-DATA=1;SCK=0;/数据为 1,SCK=0 _nop_();SCK=1;/第一个脉冲_nop_();DATA=0;/数据跌落_nop_();SCK=0;/完成一个脉冲_nop_();_nop_();_nop_();SCK=1;/再一个脉冲_nop_();DATA=1;/数据变为 1 _nop_();SCK=0;/完成该脉冲/void sht_rest(void)/复位 unsigned char i;DATA=1;SCK=0;/数据为 1 时钟为 0 for(i=0;i9;i+)/9 个脉冲为复位 SCK=1;SCK=0;start_sht11();/启动/名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 11 页 -华北水利水电学院毕业设计9/测量温度或者是湿度,返回校验值text_a(unsigned char ml)unsigned char i;start_sht11();/启动write(ml);/写入测温度if(ack=1)sht_rest();/复位write(ml);/写入测温度 DATA=1;/释放数据总线/判断是否处于忙for(i=0;i255;i+)if(DATA=0)break;else xianshi();read();/读温度/温湿度处理/*void text_jishuan_temp11(unsigned int R_flag)float aa=0,bb=0,humi_zi,temp_zi;if(R_flag=1)/error=0;if(SHT11_flag)sht_rest();/复位text_a(TEMP_ML);aa=(float)temp_h*256+(float)temp_LL;/温度计算temp_zi=0.01*aa-40;if(temp_zi250)|(temp_zi250)/温补 dd=(temp_zi/10-25);ff=(0.01+8*cc/100000);ff=dd*ff+aa;ff=ff*10;xianzhi_h=(int)ff;xianzhi_h=(xianzhi_h-40);/显示处理/xianshi()int abcd;abcd=xianzhi_h;gwei=1;swei=1;bwei=1;qwei=1;P1=dispcodeabcd/100;qwei=0;delay(800);qwei=1;abcd=abcd%100 ;P1=dispcodeabcd/10;bwei=0;delay(800);bwei=1;名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 11 页 -华北水利水电学院毕业设计11 abcd=xianzhi_t;P1=dispcodeabcd/100;swei=0;delay(800);swei=1;abcd=abcd%100;P1=dispcodeabcd/10;gwei=0;delay(800);gwei=1;/void main()flag=1;EX0=0;/初始化外部中断 0 和外部中断 1 EX1=0;IT0=1;/中断触发类型选择下降沿触发IT1=1;EA=1;/开全局中断while(1)button();/调用按键扫描函数text_jishuan_temp11(RT_flag);/测温湿度xianshi();/显示speaker(BZ_flag);名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 11 页 -