STM32F030读取温湿度传感器SHT20的C程序源码(经实测实用过)

合集下载

基于STM32的温湿度数据采集系统

基于STM32的温湿度数据采集系统

目录目录I摘要IIAbstract II第一章绪论41.1温湿度传感器的背景及意义41.2温湿度传感器国内发展现状41.3温湿度传感器的发展趋势4第二章温湿度原理及相关技术6 2.1温湿度传感器62.1.1温度传感器62.1.2 湿度传感器62.1.3 温湿度传感器物理参数及定义7 2.2温湿度传感器的选型72.3 SHT21简述82.3.1 SHT21介绍82.3.2 SHT21通信原理9第三章系统硬件设计113.1 系统硬件设计主要框架113.2 STM32芯片的功能描述123.2.1接口133.2.2 STM32芯片接线图153.3 SHT21温湿度传感器153.4 LCD160显示屏163.4.1 参数及引脚定义163.4.2 LCD1602接线图193.5. 系统复位203.5.1系统复位功能作用203.5.2 系统复位工作原理203.6 电源模块21第四章系统软件设计214.1软件平台简述214.2系统软件程序流程框图234.3 主程序模块244.3.1 主函数244.3.2 显示函数254.3.3 计算函数254.4 SHT21传感器254.4.1 I2C协议函数264.4.2 延迟函数284.5 LCD1602显示屏284.5.1 写指令函数294.5.2 写数据函数304.5.3 温湿度值得显示函数304.5.4 延迟函数31第五章系统仿真315.1 仿真软件介绍315.2 电路仿真32第六章总结与展望34致谢34参考文献35附录错误!未定义书签。

摘要随着当代社会的快速的发展,人们把越来越多的科学技术应用于各个领域。

温湿度的采集是作为自动化科学中一个必须掌握的检测技术,也是一项比较实用的技术。

在温室大棚中确保农业高效生产的重要便是对温湿度、二氧化碳浓度等外部参数的实时与及时准确而精确的监测和协调与调节,同时在文物保护方面,文物对于温湿度非常敏感的,及时检测和对温湿度的变化做出正确的反应,也长久保护文物的一种必要手段。

基于单片机SHT温湿度传感器检测程序

基于单片机SHT温湿度传感器检测程序

基于51单片机SHT11温湿度传感器检测程序(含电路图)下面是原理图:F面是SHT11与MCU连接的典型电路:下面是源代码:#include <reg52.h>#include <intrins.h>/********************************************************宏定义********************************************************/ #define uint unsigned int#define uchar unsigned char#define noACK 0#define ACK 1#define STATUS_REG_W 0x06#define STATUS_REG_R 0x07#define MEASURE_TEMP 0x03#define MEASURE_HUMI 0x05#define RESET 0x1eenum?{TEMP,HUMI};typedef?union?//定义共用同类型(unsigned?int?i;float?f;} value;/******************************************************** 位定义********************************************************/ sbit lcdrs=P2八0;sbit lcdrw=P2」;sbit lcden=P2八2;sbit SCK = P「0;sbit DATA = P11;/******************************************************** 变量定义********************************************************/ uchar table2[]=〃SHT11 温湿度检测〃; uchar table3[]=〃温度为:℃";uchar table4[]=〃湿度为:〃;uchar table5[]=〃.〃;uchar wendu[6];uchar shidu[6];/******************************************************** 1ms延时函数********************************************************/ void?delay(int?z)(int?x,y;for(x=z;x>0;x--)for(y=125;y>0;y--);)/******************************************************** 50us延时函数********************************************************/ void?delay_50us(uint t)(uint j;for(;t>0;t--)for(j=19;j>0;j--);)/******************************************************** 50ms延时函数********************************************************/ void?delay_50ms(uint t)(uint j;for(;t>0;t--)for(j=6245;j>0;j--);)/******************************************************** 12864液晶写指令********************************************************/ void?write_12864com(uchar com)(lcdrs=0;delay_50us(1);P0=com;lcden=1;delay_50us(10);lcden=0;delay_50us(2);)/******************************************************** 12864液晶写数据********************************************************/ void?write_dat(uchar dat)(lcdrs=1;lcdrw=0;delay_50us(1);P0=dat;lcden=1;delay_50us(10);lcden=0;delay_50us(2);)/******************************************************** 12864液晶初始化********************************************************/ void?init128641cd(void)(delay_50ms(2);write_12864com(0x30);delay_50us(4);write_12864com(0x30);delay_50us(4);write_12864com(0x0f);delay_50us(4);write_12864com(0x01);delay_50us(240);write_12864com(0x06);delay_50us(10);write_12864com(0x0c);delay_50us(10);)/******************************************************** 12864液晶显示函数********************************************************/ void?display1(void)(uchar i;write_12864com(0x80);for(i=0;i<18;i++)(write_dat(table2[i]);delay_50us(1);))/******************************************************** 12864液晶显示函数********************************************************/ void?display2(void)(uchar i;write_12864com(0x90);for(i=0;i<18;i++)(write_dat(table3[i]);delay_50us(1);))/******************************************************** 12864液晶显示函数********************************************************/ void?display3(void)(uchar i;write_12864com(0x88);for(i=0;i<8;i++)(write_dat(table4[i]);delay_50us(1);))/******************************************************** 12864液晶显示函数********************************************************/ void?displaywendu(void)(uchar i;write_12864com(0x94);for(i=0;i<3;i++)(write_dat(wendu[i]);delay_50us(1);)for(i=0;i<1;i++)(write_dat(table5[i]);delay_50us(1);)for(i=4;i<5;i++)(write_dat(wendu[i]);delay_50us(1);))/******************************************************** 12864液晶显示函数********************************************************/ void?displayshidu(void)(uchar i;write_12864com(0x8C);for(i=0;i<3;i++)(write_dat(shidu[i]);delay_50us(1);)for(i=0;i<1;i++)(write_dat(table5[i]);delay_50us(1);)for(i=4;i<5;i++)(write_dat(shidu[i]);delay_50us(1);))/******************************************************** SHT11写字节程序********************************************************/char?s_write_byte(unsigned?char?value)(unsigned?char?i,error=0;for?(i=0x80;i>0;i>>=1)?//高位为 1,循环右移(if?(i&value) DATA=1;?//和要发送的数相与,结果为发送的位 else?DATA=0; SCK=1;_nop_();_nop_();_nop_();?//延时 3usSCK=0;)DATA=1;?//释放数据线SCK=1;error=DATA;?//检查应答信号,确认通讯正常_nop_();_nop_();_nop_();SCK=0;DATA=1;return?error;?//error=1 通讯错误)/******************************************************** SHT11读字节程序********************************************************/char?s_read_byte(unsigned?char?ack)(unsigned?char?i,val=0;DATA=1;?//释放数据线for(i=0x80;i>0;i>>=1)?//高位为 1,循环右移(SCK=1;if(DATA) val=(val|i);?//读一位数据线的值SCK=0;)DATA=!ack;?SCK=1;_nop_();_nop_();_nop_();?//延时 3usSCK=0;_nop_();_nop_();_nop_();DATA=1;?//释放数据线return?val;)/********************************************************SHT11启动传输********************************************************/void?s_transstart(void)(DATA=1; SCK=0;?//准备_nop_();SCK=1;_nop_();DATA=0;_nop_();SCK=0;_nop_();_nop_();_nop_();SCK=1;_nop_();DATA=1;_nop_();SCK=0;)/********************************************************SHT11连接复位********************************************************/void?s_connectionreset(void)(unsigned?char?i;DATA=1; SCK=0;?//准备for(i=0;i<9;i++)?//DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位(SCK=1;SCK=0;)s_transstart();?//启动传输)/******************************************************** SHT11温湿度检测********************************************************/char?s_measure(unsigned?char?*p_value, unsigned?char?*p_checksum, unsigned?charmode)(unsigned error=0;unsigned?int?i;s_transstart();?//启动传输switch(mode)?〃选择发送命令 (case?TEMP : error+=s_write_byte(MEASURE_TEMP);?break;?〃测量温度case?HUMI : error+=s_write_byte(MEASURE_HUMI);?break;?〃测量湿度default?:?break;)for?(i=0;i<65535;i++)?if(DATA==0)?break;?〃等待测量结束if(DATA) error+=1;?//如果长时间数据线没有拉低,说明测量错误 *(p_value) =s_read_byte(ACK);?//读第一个字节,高字节(MSB)*(p_value+1)=s_read_byte(ACK);?//读第二个字节,低字节(LSB) *p_checksum =s_read_byte(noACK);?//read CRC 校验码 return?error;?// error=1 通讯错误)/********************************************************SHT11温湿度值标度变换及温度补偿********************************************************/void?calc_sth10(float?*p_humidity ,float?*p_temperature) (const?float?C1=-4.0;?// 12位湿度精度修正公式const?float?C2=+0.0405;?// 12 位湿度精度修正公式const?float?C3=-0.0000028;?// 12 位湿度精度修正公式 const?float?T1=+0.01;?// 14位温度精度5V条件修正公式 const?float?T2=+0.00008;?// 14位温度精度5V条件修正公式float?rh=*p_humidity;?// rh: 12 位湿度float?t=*p_temperature;?// t: 14 位温度 float?rh_lin;?// rh_lin: 湿度linear 值 float?rh_true;?// rh_true: 湿度 ture 值 float?t_C;?// t_C :温度℃t_C=t*0.01 - 40;?//补偿温度rh_lin=C3*rh*rh + C2*rh + C1;?//相对湿度非线性补偿rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;?//相对湿度对于温度依赖性补偿if(rh_true>100)rh_true=100;?//湿度最大修正if(rh_true<0.1)rh_true=0.1;?//湿度最小修正*p_temperature=t_C;?//返回温度结果*p_humidity=rh_true;?//返回湿度结果)/********************************************************主函数********************************************************/ void?main(void)(unsigned?int?temp,humi;value humi_val,temp_val;?//定义两个共同体,一个用于湿度,一个用于温度unsigned?char?error;?//用于检验是否出现错误unsigned?char?checksum;?//CRCinit12864lcd();display1();display2();display3();s_connectionreset();?//启动连接复位while(1)(error=0;?//初始化error=0,即没有错误error+=s_measure((unsigned?char*)&temp_val.i,&checksum,TEMP);?//温度测量error+=s_measure((unsigned?char*)&humi_val.i,&checksum,HUMI);?//湿度测量if(error!=0) s_connectionreset();?////如果发生错误,系统复位else{ _humi_val.f=(float)humi_val.i;?//转换为浮点数temp_val.f=(float)temp_val.i;?//转换为浮点数calc_sth10(&humi_val.f,&temp_val.f);?//修正相对湿度及温度temp=temp_val.f*10;humi=humi_val.f*10;wendu[0]=temp/1000+'0';?//温度百位wendu[1]=temp%1000/100+'0';?//温度十位wendu[2]=temp%100/10+'0';//温度个位wendu[3]=0x2E;?//小数点wendu[4]=temp%10+'0';?//温度小数点后第一位displaywendu();shidu[0]=humi/1000+'0';?//湿度百位shidu[1]=humi%1000/100+'0';?//湿度十位shidu[2]=humi%100/10+'0';?//湿度个位shidu[3]=0x2E;?//小数点shidu[4]=humi%10+'0';?//湿度小数点后第一位displayshidu();)delay(800);//等待足够长的时间,以现行下一次转换) )相关手册资料及源码下载地址:。

STM32温度报警传感器代码

STM32温度报警传感器代码

主函数、main.c#include "led.h"#include "delay.h"#include "sys.h"#include "usart.h"#include "lcd.h"#include "ds18b20.h"#include "key.h"#include <string.h>#include <stdio.h>#include <stdlib.h>int temp_low = 22;int temp_high = 32;int zanshi_low=0;int zanshi_hign=0;void TIM3_Int_Init(u16 arr,u16 psc){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值计数到5000为500msTIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值10Khz的计数频率TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位TIM_ITConfig( //使能或者失能指定的TIM中断TIM3, //TIM2TIM_IT_Update ,ENABLE //使能);NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器TIM_Cmd(TIM3, ENABLE); //使能TIMx外设}u8 flag=0;int main(void){u8 t = 0;u8 shuzu[20];u8 keyvalue=0;u8 gaibianshui=0;short temperature;delay_init(); //延时函数初始化uart_init(9600); //串口初始化为9600NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2LED_Init(); //初始化与LED连接的硬件接口TIM3_Int_Init(9999,7199);//10Khz的计数频率,计数到5000为500msLCD_Init();POINT_COLOR = RED; //设置字体为红色LCD_ShowString(0, 50, 200, 16, 16, "STM32 test");LCD_ShowString(0, 70, 200, 16, 16, "name: zhang qi qi ");//LCD_ShowString(0,90,200,16,16,"Max 32 C Min 26 C");memset(shuzu, 0, 20);sprintf(shuzu, "Max is %2d C,Min is %2d C", temp_high, temp_low);LCD_ShowString(0, 90, 200, 16, 16, shuzu);while (DS18B20_Init()) //DS18B20初始化{LCD_ShowString(0, 130, 200, 16, 16, "DS18B20 Error");delay_ms(200);LCD_Fill(0, 130, 239, 130 + 16, WHITE);delay_ms(200);}POINT_COLOR = BLUE; //设置字体为蓝色LCD_ShowString(0, 110, 260, 16, 16, "The temperature is: . C now ");LCD_ShowChar(0+25*8,110,',',16,0);LCD_ShowChar(0+29*8,110,'!',16,0);while (1){POINT_COLOR = BLUE; //设置字体为蓝色if (t % 10 == 0) //每100ms读取一次{t = 0;temperature = DS18B20_Get_Temp();if (temperature < 0){LCD_ShowChar(0 + 40, 150, '-', 16, 0); //显示负号temperature = -temperature; //转为正数}elseLCD_ShowChar(0 + 40, 150, ' ', 16, 0); //去掉负号memset(shuzu, 0, 20);sprintf(shuzu, "The temperature is:%3d.%1dC", temperature / 10, temperature % 10);LCD_ShowString(0, 110, 200, 16, 16, shuzu);}delay_ms(10);//判断温度zanshi_low=temp_low*10;zanshi_hign=temp_high*10;if((temperature<zanshi_low)||(temperature>zanshi_hign)) {if(temperature<zanshi_low){flag=1;printf("chaoxiaxian");}if(temperature>zanshi_hign){flag=2;printf("chaoshangxian");}}else{flag=0;LED0=1; //正常情况灯不亮LED1=1;}//获取温度时间控制tt++;//浏览开关KEY_Init();delay_ms(10);keyvalue=KEY_Scan(0);if(keyvalue!=0){if(keyvalue==3){gaibianshui=(gaibianshui+1)%3;}if(gaibianshui==1) //改变上限{if(keyvalue==2) //key1按下{temp_high++;memset(shuzu, 0, 20);sprintf(shuzu, "Max is %2d C,Min is %2d C", temp_high, temp_low);LCD_ShowString(0, 90, 200, 16, 16, shuzu);}if(keyvalue==1) //key0按下{temp_high--;memset(shuzu, 0, 20);sprintf(shuzu, "Max is %2d C,Min is %2d C", temp_high, temp_low);LCD_ShowString(0, 90, 200, 16, 16, shuzu);}}if(gaibianshui==2) //改变上限{if(keyvalue==2) //key1按下{temp_low++;memset(shuzu, 0, 20);sprintf(shuzu, "Max is %2d C,Min is %2d C", temp_high, temp_low);LCD_ShowString(0, 90, 200, 16, 16, shuzu);}if(keyvalue==1) //key0按下{temp_low--;memset(shuzu, 0, 20);sprintf(shuzu, "Max is %2d C,Min is %2d C", temp_high, temp_low);LCD_ShowString(0, 90, 200, 16, 16, shuzu);}}keyvalue=0;}}}void TIM3_IRQHandler(void) //TIM3中断{if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源{TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源//温度不正常处理灯if(flag==1){LED0 = !LED0;}if(flag==2){LED1 = !LED1;}}}LED 函数led.c#include "led.h"void LED_Init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Perip h_GPIOD, ENABLE); //使能PA,PD端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->PA.8 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHzGPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.8GPIO_SetBits(GPIOA,GPIO_Pin_8); //PA.8 输出高GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //LED1-->PD.2端口配置, 推挽输出GPIO_Init(GPIOD, &GPIO_InitStructure); //推挽输出,IO口速度为50MHzGPIO_SetBits(GPIOD,GPIO_Pin_2); //PD.2 输出高}温度代码s18b20.c#include "ds18b20.h"#include "delay.h"void DS18B20_Rst(void){DS18B20_IO_OUT(); //SET PA0 OUTPUTDS18B20_DQ_OUT=0; //拉低DQdelay_us(750); //拉低750usDS18B20_DQ_OUT=1; //DQ=1delay_us(15); //15US}//等待DS18B20的回应//返回1:未检测到DS18B20的存在//返回0:存在u8 DS18B20_Check(void){u8 retry=0;DS18B20_IO_IN();//SET PA0 INPUTwhile (DS18B20_DQ_IN&&retry<200){retry++;delay_us(1);};if(retry>=200)return 1;else retry=0;while (!DS18B20_DQ_IN&&retry<240){retry++;delay_us(1);};if(retry>=240)return 1;return 0;}//从DS18B20读取一个位//返回值:1/0u8 DS18B20_Read_Bit(void) // read one bit {u8 data;DS18B20_IO_OUT();//SET PA0 OUTPUTDS18B20_DQ_OUT=0;delay_us(2);DS18B20_DQ_OUT=1;DS18B20_IO_IN();//SET PA0 INPUTdelay_us(12);if(DS18B20_DQ_IN)data=1;else data=0;delay_us(50);return data;}//从DS18B20读取一个字节//返回值:读到的数据u8 DS18B20_Read_Byte(void) // read one byte {u8 i,j,dat;dat=0;for (i=1;i<=8;i++){j=DS18B20_Read_Bit();dat=(j<<7)|(dat>>1);}return dat;}//写一个字节到DS18B20//dat:要写入的字节void DS18B20_Write_Byte(u8 dat){u8 j;u8 testb;DS18B20_IO_OUT();//SET PA0 OUTPUT;for (j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if (testb){DS18B20_DQ_OUT=0;// Write 1delay_us(2);DS18B20_DQ_OUT=1;delay_us(60);}else{DS18B20_DQ_OUT=0;// Write 0delay_us(60);DS18B20_DQ_OUT=1;delay_us(2);}}}//开始温度转换void DS18B20_Start(void)// ds1820 start convert{DS18B20_Rst();DS18B20_Check();DS18B20_Write_Byte(0xcc);// skip romDS18B20_Write_Byte(0x44);// convert}//初始化DS18B20的IO口DQ 同时检测DS的存在//返回1:不存在//返回0:存在u8 DS18B20_Init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PORTA口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PORTA0 推挽输出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_2); //输出1DS18B20_Rst();return DS18B20_Check();}//从ds18b20得到温度值//精度:0.1C//返回值:温度值(-550~1250)short DS18B20_Get_Temp(void){u8 temp;u8 TL,TH;short tem;DS18B20_Start (); // ds1820 start convertDS18B20_Rst();DS18B20_Check();DS18B20_Write_Byte(0xcc);// skip romDS18B20_Write_Byte(0xbe);// convertTL=DS18B20_Read_Byte(); // LSBTH=DS18B20_Read_Byte(); // MSBif(TH>7){TH=~TH;TL=~TL;temp=0;//温度为负}else temp=1;//温度为正tem=TH; //获得高八位tem<<=8;tem+=TL;//获得底八位tem=(float)tem*0.625;//转换if(temp)return tem; //返回温度值else return -tem;}键盘代码key.c#include "key.h"#include "delay.h"//按键初始化函数//PA15和PC5 设置成输入void KEY_Init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPI OC,ENABLE);//使能PORTA,PORTC时钟GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;//PA15GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA15GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PC5GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC5GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PA0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0}//按键处理函数//返回按键值//mode:0,不支持连续按;1,支持连续按;//返回值://0,没有任何按键按下//KEY0_PRES,KEY0按下//KEY1_PRES,KEY1按下//WKUP_PRES,WK_UP按下//注意此函数有响应优先级,KEY0>KEY1>WK_UP!!u8 KEY_Scan(u8 mode){static u8 key_up=1;//按键按松开标志if(mode)key_up=1; //支持连按if(key_up&&(KEY0==0||KEY1==0||WK_UP==1)){delay_ms(10);//去抖动key_up=0;if(KEY0==0)return KEY0_PRES;else if(KEY1==0)return KEY1_PRES;else if(WK_UP==1)return WKUP_PRES;}else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;return 0;// 无按键按下}。

温湿度检测C源代码

温湿度检测C源代码
U8temp=0;
if(P2_0)U8temp=1;
U8FLAG=2;
while((P2_0)&amp;&amp;U8FLAG++);
//----------------------
//P2_1=0 ; //T
//P2_1=1 ; //T
//----------------------
sbit key_down=P2^6;
sbit key_ok=P2^7;
//----------------------------------------------//
//----------------定义区--------------------//
//----------------------------------------------//
//----------------------------------------------//
#define DataPort P1 //LCD1602数据端口
sbit LCM_RS=P2^2; //LCD1602命令端口
sbit LCM_RW=P2^1; //LCD1602命令端口
//-----湿度读取子程序 ------------
//--------------------------------
//----以下变量均为全局变量--------
//----温度高8位== U8T_data_H------
//----温度低8位== U8T_data_L------
//
#define uchar unsigned char
#define uint unsigned int

基于STM32F030的SHT20驱动(实测)

基于STM32F030的SHT20驱动(实测)
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
/**
* IIC SDA方向设置为输出函数
*/
void IIC_SDA_OUT(void)
}
/**
* IIC总线检查对应地址的设备是否存在
*/
unsigned char i2c_CheckDevice(unsigned char Address)
{
uint8_t reAck;
IIC_SDA_IN();//SDA配置成输入
IIC_SCL_IN();//SCL配置成输入
if ( IIC_READ_SDA() && IIC_READ_SCL())
{
value <<= 1;
IIC_SCL_HIGH();
i2c_Delay();
if ( IIC_READ_SDA())
{
value++;
}
IIC_SCL_LOW();
i2c_Delay();
}
IIC_SDA_OUT();//SDA配置成输出
return value;
}
/**
* IIC总线等待响应信号
* C++ DECLARATION WRAPPER
******************************************************************************/
#ifdef __cplusplus

基于STM32的温湿度角度测量

基于STM32的温湿度角度测量

目录1 绪论 (5)1.1 选题背景 (5)1.1.1 社会背景 (5)1.1.2 环境背景 (5)1.1.3 经济背景 (6)1.2 选题意义 (7)1.3 冷链温湿度监测系统的研究现状 (7)1.4 文献综述 (9)1.5 课题研究的内容及要求 (10)2 方案论证 (12)2.1 总体方案设计 (12)2.2 主控模块选型 (13)2.2.1 51单片机 (14)2.2.2 FPGA (16)2.2.3 PLC (17)2.2.4 DSP芯片 (17)2.2.5 STM32单片机 (18)2.3 显示模块的选择 (20)2.4 传感器的选择 (21)2.4.1 温湿度传感器的选型 (21)2.4.2 角度传感器的选型 (21)2.5 编程语言的选择 (22)2.5.1 汇编语言 (22)2.5.2 C语言 (22)3 电路的设计 (24)3.1 系统总体描述 (24)3.2 单片机 (24)3.3 温湿度传感器 (25)3.4 角度检测传感器 (27)3.5 LCD液晶显示模块 (28)3.6 按键设置模块 (29)3.7 报警模块 (30)4 系统硬件的设计 (31)4.1 电路原理图绘制 (31)4.2 软件设计 (31)4.2.1 Keil软件的简介 (31)4.3 主函数流程图 (32)4.4 按键子程序去抖 (33)5 系统调试 (35)总结 (41)致谢 (42)参考文献 (43)摘要随着我国高速公路以及科学技术的快速发展,人们对于物质消费提出了更高的要求,不仅要求能品尝到来自五湖四海的食品,还要求食品的保鲜度要高,另外现在许多药品也需要冷藏保存,所以对于这些食物和药品的运输问题丞待解决。

本课题通过查阅相关资料,发现在对上述物品进行冷链运输时,对于运输车冷库的温湿度信息要求极其严格,基于这个因素,开始了本文的基于STM32单片机的冷链系统温湿度监测系统,同时增加了角度监测模块。

STM32-内部温度传感器-串口显示-完整程序

STM32-内部温度传感器-串口显示-完整程序

STM32F103 内部温度传感器用串口传递到PC上显示程序如下:#include "stm32f10x.h"#include "stm32_eval.h"#include "stm32f10x_conf.h"#include <stdio.h>#define DR_ADDRESS ((uint32_t)0x4001244C) //ADC1 DR寄存器基地址USART_InitTypeDef USART_InitStructure; //串口初始化结构体声明ADC_InitTypeDef ADC_InitStructure; //ADC初始化结构体声明DMA_InitTypeDef DMA_InitStructure; //DMA初始化结构体声明__IO uint16_t ADCConvertedValue; // 在内存中声明一个可读可写变量用来存放AD的转换结果,低12 位有效void ADC_GPIO_Configuration(void);static void Delay_ARMJISHU(__IO uint32_t nCount){ for (; nCount != 0; nCount--);}int main(void){u16 ADCConvertedValueLocal;USART_ART_BaudRate = 115200;USART_ART_WordLength = USART_WordLength_8b;USART_ART_StopBits = USART_StopBits_1;USART_ART_Parity = USART_Parity_No;USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx;STM_EVAL_COMInit(COM1, &USART_InitStructure);/* Enable DMA1 clock */RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);DMA_DeInit(DMA1_Channel1); //开启DMA1的第一通道DMA_InitStructure.DMA_PeripheralBaseAddr = DR_ADDRESS; DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)&ADCConver tedValue;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //DMA 的转换模式为SRC模式,由外设搬移到内存DMA_InitStructure.DMA_BufferSize = 1; //DMA缓存大小,1个 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //接收一次数据后,设备地址禁止后移DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//关闭接收一次数据后,目标内存地址后移DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //定义外设数据宽度为16位 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //DMA搬移数据尺寸,HalfWord就是为16位DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //转换模式,循环缓存模式。

单片机控制的温度传感器C语言程序代码(WORD档)9页word

单片机控制的温度传感器C语言程序代码(WORD档)9页word

单片机控制的温度传感器C语言程序代码(WORD档)9页word#include#define DO P3_7#define SEG P0 //数码管自左至右依次为1234位#define MS2L 0x18 //1ms的延时参数#define MS2H 0xfc#define uchar unsigned char#define uint unsigned intuchar code comm[4] = {0x01,0x02,0x04,0x08};uchar code seg[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar code seg_add_dicimal[10] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};uchar code seg_dicimal[2] ={0xc0, 0x92};uchar k = 0;uchar temp_l = 0;uchar temp_h = 0;uchar tempsign = 0;uchar hundreds = 0;uchar tens = 0;uchar ones = 0;uchar low_four = 0;/*延时以ms为单位的t时间*/void Delay(uint t)uint i;while(t--)for(i=0; i<125; i++)/*us级延时,延时时间约4+2*i*/void Delayus(uchar i)while(--i);/*产生复位脉冲,等待应答信号*/void Resetpaulse()DO = 0; //拉低约600usDelayus(150);Delayus(150);DO = 1;//产生上升沿,延时约15~60us Delayus(30);while(~DO); //等待应答信号/*读取数据一位*/bit Readbit()uint i = 0;bit b = 0;DO = 0; //产生读时隙i++; //维持低电平至少1usDO = 1; //1us以上后拉高Delayus(2); //延时8us,DO下降沿15内ds18b20输出的数据才有效 b = DO; //读取数据Delayus(40); //每个读时隙至少持续60usreturn(b);/*读取一个字节*/uchar Readbyte()uchar byte_read = 0;uchar i, j;for(i=0; i<8; i++)j = Readbit();byte_read = (j<<="">return(byte_read);/*写一个字节*/void Writebyte(uchar byte_to_write)uchar i = 0;uchar j = 0;bit write_bit = 0;for(j=0; j<8; j++)write_bit = (byte_to_write & 0x01);if(write_bit == 1) //写1DO = 0; //产生写时隙Delayus(3); //延时15usDO = 1; //写1Delayus(40); //延时,写时隙不得低于60uselseDO = 0; //产生写时隙Delayus(50); //延时,保持低约60us~120usDO = 1;i++;byte_to_write = byte_to_write >> 1;/*配置ds18b20,9位分辨率 */void Configurate()EA = 0;Resetpaulse(); //发出复位脉冲,每次操作都从复位开始Delay(1);Writebyte(0xcc); //skip room命令Writebyte(0x4e);Writebyte(0x7f);Writebyte(0x80);Writebyte(0x1f);EA = 1;/*启动温度转换*/void StartConvert()Resetpaulse(); // 发出复位脉冲,每次操作都从复位开始Delay(1);EA = 0;Writebyte(0xcc); //skip room命令Writebyte(0x44); //启动温度转换命令EA = 1;/*读取温度值*/void ReadTempreture()EA = 0;Resetpaulse(); // 发出复位脉冲,每次操作都从复位开始Delay(1);Writebyte(0xcc); //skip room命令Writebyte(0xbe); //读取暂存器命令temp_l = Readbyte(); //存储温度低字节值(整数部分低四位和小数部分)temp_h = Readbyte(); //存储温度高字节值(其中高五位为符号位) EA = 1;/*数据转换*/void DigitalConvert()uchar total = 0;tempsign = (temp_h >> 7) & 0x01; //得出符号位if(tempsign == 0) //正数的处理方法total = ((temp_h << 4)&0xf0) | ((temp_l >> 4)&0x0f); //取整数。

基于STM32的温湿度监测..

基于STM32的温湿度监测..

基于STM32的温湿度监测..《物联网工程设计与实施》项目设计项目课题:基于STM32的温湿度检测院系:计算机科学与技术学院专业:物联网工程项目经理:于渊学号:123921043副经理:谢金光学号:123921024项目成员:李周恒学号:123921002项目成员:袁桃学号: 123921048 项目成员:颉涛学号: 123921054 项目成员肖青学号: 123921025 项目成员冯锦荣学号: 123921011 项目成员唐敏学号: 123921023 指导教师:2014 年 12月目录摘要 (9)Absract (11)一.设计目标 (13)二.设计方案 (13)三.实验所需器材 (13)四.设计内容 (13)4.1 STM32模块 (13)4.2 AM2302介绍 (15)4.2.1 产品概述 (15)4.2.2 应用范围 (16)4.2.3 产品亮点 (16)4.2.4 单总线接口定义 (16)4.2.5 传感器性能 (17)4.2.6 单总线通信 (18)4.3 Nokia 5110 介绍 (19)4.3.1 SPI接口时序写数据/命令 (19)4.3.2 显示汉字 (20)4.3.4 显示图形 (20)4.4 原理图设计 (20)4.5 PCB板设计 (21)五.实验软件设计 (22)5.1 温湿度传感器DHT22的程序 (22)5.2 湿度显示函数 (25)5.3主函数程序 (27)5.3.1显屏程序 (27)六.作品实物展示 (36)七.设计总结 (37)基于STM 32 的温湿度检测摘要随着现代社会的高速发展,越来越多的科学技术被应用于农业生产领域。

在温室大棚中对温湿度、二氧化碳浓度等外部参数的实时准确的测量和调节更是保证农业高效生产的重要前提。

本次课程设计中实现了一个基于STM32F103VET6的智能温湿度检测系统,目的是实现温湿度的采集和显示,温湿度的采集是作为自动化科学中一个必须掌握的检测技术,也是一项比较实用的技术。

基于STM32的温湿度数据采集系统

基于STM32的温湿度数据采集系统

目录目录I摘要IIAbstract II第一章绪论41.1温湿度传感器的背景及意义41.2温湿度传感器国内发展现状41.3温湿度传感器的发展趋势4第二章温湿度原理及相关技术6 2.1温湿度传感器62.1.1温度传感器62.1.2 湿度传感器62.1.3 温湿度传感器物理参数及定义7 2.2温湿度传感器的选型72.3 SHT21简述82.3.1 SHT21介绍82.3.2 SHT21通信原理9第三章系统硬件设计113.1 系统硬件设计主要框架113.2 STM32芯片的功能描述123.2.1接口133.2.2 STM32芯片接线图153.3 SHT21温湿度传感器153.4 LCD160显示屏163.4.1 参数及引脚定义163.4.2 LCD1602接线图193.5. 系统复位203.5.1系统复位功能作用203.5.2 系统复位工作原理203.6 电源模块21第四章系统软件设计214.1软件平台简述214.2系统软件程序流程框图234.3 主程序模块244.3.1 主函数244.3.2 显示函数254.3.3 计算函数254.4 SHT21传感器254.4.1 I2C协议函数264.4.2 延迟函数284.5 LCD1602显示屏284.5.1 写指令函数294.5.2 写数据函数304.5.3 温湿度值得显示函数304.5.4 延迟函数31第五章系统仿真315.1 仿真软件介绍315.2 电路仿真32第六章总结与展望34致谢34参考文献35附录错误!未定义书签。

摘要随着当代社会的快速的发展,人们把越来越多的科学技术应用于各个领域。

温湿度的采集是作为自动化科学中一个必须掌握的检测技术,也是一项比较实用的技术。

在温室大棚中确保农业高效生产的重要便是对温湿度、二氧化碳浓度等外部参数的实时与及时准确而精确的监测和协调与调节,同时在文物保护方面,文物对于温湿度非常敏感的,及时检测和对温湿度的变化做出正确的反应,也长久保护文物的一种必要手段。

STM32之SHT30温湿度传感器驱动代码

STM32之SHT30温湿度传感器驱动代码

STM32之SHT30温湿度传感器驱动代码最后发布:2019-04-12 15:08:19首发:2019-04-12 15:08:19 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https:///qq_34885669/article/details/89240092 展开第一部分:SHT30温湿度模块代码头文件(SHT30.h)1.#ifndef SHT30_H2.#define SHT30_H3.#include "delay.h"4.#include "sys.h"5.#include "stdio.h"6.#include "usart.h"7.#include "string.h"8.#include "sys.h"9.10.extern u8 humiture_buff1[20];11.extern u8 humiture_buff2[20];12.extern u8 Refresh_SHT30_Data;13.extern u8 send_data_fleg;14.extern u8 Temperature_L;15.extern u8 Humidity_L;16.extern u8 Temperature_H;17.extern u8 Humidity_H;18.19.void SHT30_Init(void);20.void IIC_ACK(void);21.void IIC_NACK(void);22.u8 IIC_wait_ACK(void);23.void IIC_Start(void);24.void IIC_Stop(void);25.void IIC_SendByte(u8 byte);26.u8 IIC_RcvByte(void);27.void SHT30_read_result(u8 addr);28.29.#endif30.第二部分:SHT30温湿度模块代码(SHT30.c)1.#include "SHT30.h"2.#include "wifi_esp8266.h"3.#include "oled.h"4.5.#define write 06.#define read 17.//IIC总线地址接口定义8.#define SCL PAout(4)9.#define SDA_OUT PAout(5)10.#define SDA_IN PAin(5)11.#define IIC_INPUT_MODE_SET() {GPIOA->CRL&=0xFF0FFFFF;GPIOA->CRL|=0x00800000;}12.#define IIC_OUTPUT_MODE_SET() {GPIOA->CRL&=0xFF0FFFFF;GPIOA->CRL|=0x00300000;}13.14.float humiture[4];15.u8 Refresh_SHT30_Data=0;16.u8 humiture_buff1[20];17.u8 humiture_buff2[20];18.19.u8 Temperature_L=15;20.u8 Humidity_L=50;21.u8 Temperature_H=30;22.u8 Humidity_H=80;23.24.void SHT30_Init(void)25.{26./*1.开时钟*/27.RCC->APB2ENR |= 1<<2;28./*2.设置GPIO模式*/29.GPIOA->CRL &= 0x0000FFFF;30.GPIOA->CRL |= 0x33330000;31./*3.设置GPIO空闲电平*/32.GPIOA->ODR |= 0xF<<4;33.//printf("SHT30_Init OK!\n");34.}35./*主机发送ACK*/36.void IIC_ACK(void)37.{38.IIC_OUTPUT_MODE_SET();40.DelayUs(2);41.SDA_OUT=0;42.DelayUs(2);43.SCL=1;44.DelayUs(2);45.SCL=0;46.DelayUs(1);47.}48./*主机不发送ACK*/49.void IIC_NACK(void)50.{51.IIC_OUTPUT_MODE_SET();52.SCL=0;53.DelayUs(2);54.SDA_OUT=1;55.DelayUs(2);56.SCL=1;57.DelayUs(2);58.SCL=0;59.DelayUs(1);60.}61./*主机等待从机的ACK*/62.u8 IIC_wait_ACK(void)63.{64.u8 t = 200;65.IIC_OUTPUT_MODE_SET();66.SDA_OUT=1;//8位发送完后释放数据线,准备接收应答位67.DelayUs(1);69.DelayUs(1);70.IIC_INPUT_MODE_SET();71.DelayUs(1);72.while(SDA_IN)//等待SHT30应答73.{74.t--;75.DelayUs(1);76.if(t==0)77.{78.SCL=0;79.return 1;80.}81.DelayUs(1);82.}83.DelayUs(1);84.SCL=1;85.DelayUs(1);86.SCL=0;87.DelayUs(1);88.return 0;89.}90./*************************************************** ****************91.功能:启动I2C总线,即发送I2C起始条件.92.**************************************************** ****************/93.void IIC_Start(void)94.{95.IIC_OUTPUT_MODE_SET();96.SDA_OUT=1;97.SCL=1;98.DelayUs(4);99.SDA_OUT=0;100.DelayUs(4);101.SCL=0;102.}103.104./*************************************************** ****************105.功能:结束I2C总线,即发送I2C结束条件.106.**************************************************** ****************/107.void IIC_Stop(void)108.{109.IIC_OUTPUT_MODE_SET();110.SCL=0;111.SDA_OUT=0;112.DelayUs(4);113.SCL=1;114.DelayUs(4);115.SDA_OUT=1;116.DelayUs(4);117.}118.119./*************************************************** ****************120.字节数据发送函数121.函数原型: void SendByte(UCHAR c);122.功能:将数据c发送出去,可以是地址,也可以是数据123.**************************************************** ****************/124.void IIC_SendByte(u8 byte)125.{126.u8 BitCnt;127.IIC_OUTPUT_MODE_SET();128.SCL=0;129.for(BitCnt=0;BitCnt<8;BitCnt++)//要传送的数据长度为8位130.{131.if(byte&0x80) SDA_OUT=1;//判断发送位132.else SDA_OUT=0;133.byte<<=1;134.DelayUs(2);135.SCL=1;136.DelayUs(2);137.SCL=0;138.DelayUs(2);139.}140.}141./*************************************************** ****************142.字节数据接收函数143.函数原型: UCHAR RcvByte();144.功能: 用来接收从器件传来的数据145.**************************************************** ****************/146.u8 IIC_RcvByte(void)147.{148.u8 retc;149.u8 BitCnt;150.retc=0;151.IIC_INPUT_MODE_SET();//置数据线为输入方式152.DelayUs(1);153.for(BitCnt=0;BitCnt<8;BitCnt++)154.{155.SCL=0;//置时钟线为低,准备接收数据位156.DelayUs(2);157.SCL=1;//置时钟线为高使数据线上数据有效158.retc=retc<<1;159.if(SDA_IN) retc |=1;//读数据位,接收的数据位放入retc 中160.DelayUs(1);161.}162.SCL=0;163.return(retc);164.}165./*************************************************** ****************166.温湿度获取函数167.函数原型: SHT30_read_result(u8 addr);168.功能: 用来接收从器件采集并合成温湿度169.**************************************************** ****************/170.void SHT30_read_result(u8 addr)171.{172.u16 tem,hum;173.u16 buff[6];174.float Temperature=0;175.float Humidity=0;176.177.IIC_Start();178.IIC_SendByte(addr<<1 | write);//写7位I2C设备地址加0作为写取位,1为读取位179.IIC_wait_ACK();180.IIC_SendByte(0x2C);181.IIC_wait_ACK();182.IIC_SendByte(0x06);183.IIC_wait_ACK();184.IIC_Stop();185.DelayMs(50);186.IIC_Start();187.IIC_SendByte(addr<<1 | read);//写7位I2C设备地址加0作为写取位,1为读取位188.if(IIC_wait_ACK()==0)189.{190.buff[0]=IIC_RcvByte();191.IIC_ACK();192.buff[1]=IIC_RcvByte();193.IIC_ACK();194.buff[2]=IIC_RcvByte();195.IIC_ACK();196.buff[3]=IIC_RcvByte();197.IIC_ACK();198.buff[4]=IIC_RcvByte();199.IIC_ACK();200.buff[5]=IIC_RcvByte();201.IIC_NACK();202.IIC_Stop();203.}204.205.tem = ((buff[0]<<8) | buff[1]);//温度拼接206.hum = ((buff[3]<<8) | buff[4]);//湿度拼接207.208./*转换实际温度*/209.Temperature= (175.0*(float)tem/65535.0-45.0) ;// T = -45 + 175 * tem / (2^16-1)210.Humidity= (100.0*(float)hum/65535.0);// RH = hum*100 / (2^16-1)211.212.if((Temperature>=-20)&&(Temperature<=125)&&(Humidity>=0)&&(Humidity<=1 00))//过滤错误数据213.{214.humiture[0]=Temperature;215.humiture[2]=Humidity;216.sprintf(humiture_buff1,"%6.2f*C %6.2f%%",Tempe rature,Humidity);//111.01*C 100.01%(保留2位小数)217.}218.printf("温湿度:%s\n",humiture_buff1);219.hum=0;220.tem=0;221.}。

STM32F030读取温湿度传感器SHT20的C程序源码(经实测实用过)

STM32F030读取温湿度传感器SHT20的C程序源码(经实测实用过)

****************************************************************************** * @file HTU20‎.x* @brief‎ HTU20‎funct‎i on* @cpu STM32‎F051* @compi‎l er KeiluVisi‎o n V5.01* @autho‎r Hanne‎y* @copyr‎i ght* @versi‎o n V1.0.1* @date 18-Sept-2015* @modif‎y date‎20-Sept-2015****************************************************************************** * @atten‎t ion*///STM32‎F051 模拟IIC‎//#inclu‎d e "board‎A PI.h"//#inclu‎d e "stm32‎f0xx.h"//#inclu‎d e "HTU20‎.h"//#inclu‎d e "uart.h"//#inclu‎d e "delay‎.h"#inclu‎d e "stm32‎f0xx.h"#inclu‎d e "stm32‎l ib.h"#defin‎e HTU20‎_CLK RCC_A‎H BPer‎i ph_G‎P IOB#defin‎e HTU20‎_SDA_‎P ORT GPIOB‎#defin‎e HTU20‎_SCL_‎P ORT GPIOB‎#defin‎e HTU20‎_SDA_‎P IN GPIO_‎P in_1‎1#defin‎e HTU20‎_SCL_‎P IN GPIO_‎P in_1‎0#defin‎e RESOL‎U TION‎_11b 0x81 //RH 11 TH 11#defin‎e RESOL‎U TION‎_12b 0x01 //RH 8 TH 12#defin‎e RESOL‎U TION‎_13b 0x80 //RH 10 TH 13#defin‎e RESOL‎U TION‎_14b 0x00 //RH 12 TH 14#defin‎e OTP_d‎isEN 0x02 //不能启动O‎P T加载#defin‎e OTP_E‎N0x00 //启动OPT‎加载#defin‎e RESh 16 //湿度解析度‎#defin‎e RESt 16 //温度解析度‎#defin‎e Measu‎r eDel‎a y12 //解析延时时‎间单位mstyped‎e f unsig‎n ed char BYTE;typed‎e f unsig‎n ed int WORD;BYTE Delay‎m s;GPIO_‎I nitT‎y peDe‎f GPIO_‎I nitS‎t ruct‎u re;voiddelay‎m s(BYTE ms);/*** @brief‎ Start‎HTU GPIO port CLK* @retva‎l None*/voidHTUIn‎i t(void){RCC_A‎H BPer‎i phCl‎o ckCm‎d(HTU20‎_CLK, ENABL‎E);}/*================================================================ IIC addre‎s s================================================================*/ #defin‎e SHT20‎A DDR 0x80/*================================================================ ACK and NACK defin‎a tion‎================================================================*/ #defin‎e ACK 0#defin‎e NACK 1/*================================================================ HTU20‎D Comma‎n d Code================================================================*/ /*Comma‎n d Code Comme‎n tTrigg‎e r Tempe‎r atur‎e Measu‎r emen‎t 0xe3 Hold maste‎rTrigg‎e r Humid‎i ty Measu‎r emen‎t 0xe5 Hold maste‎rTrigg‎e r Tempe‎r atur‎e Measu‎r emen‎g 0xf3 No Hold maste‎rTrigg‎e r Humid‎i ty Measu‎r emen‎t 0xf5 No Hold maste‎rWrite‎user regis‎t er 0xe6Read user regis‎t er 0xe7Soft Reset‎0xfe*/#defin‎e SOFT_‎R ESET‎0xfe#defin‎e READ_‎R EGIS‎T ER 0xe7#defin‎e WRITE‎_REGI‎S TER 0xe6#defin‎e TRIGG‎E R_TE‎M P 0xf3#defin‎e TRIGG‎E R_HU‎M I 0xf5/*================================================================ HTU20‎opera‎t e inter‎f ace================================================================*/#defin‎e HTU20‎_SCL GPIO_‎R eadI‎n putD‎a taBi‎t(HTU20‎_SCL_‎P ORT,HTU20‎_SCL_‎P IN) #defin‎e HTU20‎_SDA GPIO_‎R eadI‎n putD‎a taBi‎t(HTU20‎_SDA_‎P ORT,HTU20‎_SDA_‎P IN)/*** @brief‎ Set SDA pin dirca‎t e as outpu‎t* @retva‎l None*/void HTU20‎_SDA_‎O UT(){GPIO_‎S truc‎t Init‎(&GPIO_‎I nitS‎t ruct‎u re);GPIO_‎I nitS‎t ruct‎u re.GPIO_‎P in = HTU20‎_SDA_‎P IN;GPIO_‎I nitS‎t ruct‎u re.GPIO_‎M ode =GPIO_‎M ode_‎O UT;GPIO_‎I nitS‎t ruct‎u re.GPIO_‎O Type‎= GPIO_‎O Type‎_OD;GPIO_‎I nitS‎t ruct‎u re.GPIO_‎S peed‎= GPIO_‎S peed‎_Leve‎l_2;GPIO_‎I nitS‎t ruct‎u re.GPIO_‎P uPd =GPIO_‎P uPd_‎N OPUL‎L;GPIO_‎I nit(HTU20‎_SDA_‎P ORT, &GPIO_‎I nitS‎t ruct‎u re);}/*** @brief‎ Set SDA pin dirca‎t e as intpu‎t* @retva‎l None*/void HTU20‎_SDA_‎I N(){GPIO_‎S truc‎t Init‎(&GPIO_‎I nitS‎t ruct‎u re);GPIO_‎I nitS‎t ruct‎u re.GPIO_‎P in = HTU20‎_SDA_‎P IN;GPIO_‎I nitS‎t ruct‎u re.GPIO_‎M ode =GPIO_‎M ode_‎I N;GPIO_‎I nitS‎t ruct‎u re.GPIO_‎S peed‎= GPIO_‎S peed‎_Leve‎l_2;GPIO_‎I nitS‎t ruct‎u re.GPIO_‎P uPd =GPIO_‎P uPd_‎N OPUL‎L;GPIO_‎I nit(HTU20‎_SDA_‎P ORT, &GPIO_‎I nitS‎t ruct‎u re);}/*** @brief‎Set SDA pin as high* @retva‎l None*/void HTU20‎_SDA_‎1(){GPIO_‎S etBi‎t s(HTU20‎_SDA_‎P ORT,HTU20‎_SDA_‎P IN);}/*** @brief‎Set SDA pin as low* @retva‎l None*/void HTU20‎_SDA_‎0(){GPIO_‎R eset‎B its(HTU20‎_SDA_‎P ORT,HTU20‎_SDA_‎P IN); }/*** @brief‎ Set SCL pin dirca‎t e as outpu‎t* @retva‎l None*/void HTU20‎_SCL_‎O UT(){GPIO_‎S truc‎t Init‎(&GPIO_‎I nitS‎t ruct‎u re);GPIO_‎I nitS‎t ruct‎u re.GPIO_‎P in = HTU20‎_SCL_‎P IN; GPIO_‎I nitS‎t ruct‎u re.GPIO_‎M ode =GPIO_‎M ode_‎O UT; GPIO_‎I nitS‎t ruct‎u re.GPIO_‎O Type‎= GPIO_‎O Type‎_OD; GPIO_‎I nitS‎t ruct‎u re.GPIO_‎S peed‎= GPIO_‎S peed‎_Leve‎l_2; GPIO_‎I nitS‎t ruct‎u re.GPIO_‎P uPd =GPIO_‎P uPd_‎N OPUL‎L; GPIO_‎I nit(HTU20‎_SCL_‎P ORT, &GPIO_‎I nitS‎t ruct‎u re);}/*** @brief‎Set SCL pin as high* @retva‎l None*/void HTU20‎_SCL_‎1(){GPIO_‎S etBi‎t s(HTU20‎_SCL_‎P ORT,HTU20‎_SCL_‎P IN);}/*** @brief‎Set SCL pin as low* @retva‎l None*/void HTU20‎_SCL_‎0(){GPIO_‎R eset‎B its(HTU20‎_SCL_‎P ORT,HTU20‎_SCL_‎P IN);}/*================================================================ Simul‎a tion‎I2C Funct‎i on================================================================*//*** @brief‎ A short‎delay‎ for iic synch‎r oniz‎a tion‎* @param‎t us* @retva‎l None*/void I2CDe‎l ay (BYTE t){while‎(t--){__nop‎(); __nop‎(); __nop‎(); __nop‎(); __nop‎();__nop‎(); __nop‎(); __nop‎(); __nop‎(); __nop‎();__nop‎(); __nop‎(); __nop‎(); __nop‎(); __nop‎();__nop‎(); __nop‎(); __nop‎(); __nop‎(); __nop‎();__nop‎(); __nop‎(); __nop‎(); __nop‎(); __nop‎();__nop‎(); __nop‎(); __nop‎(); __nop‎(); __nop‎();__nop‎(); __nop‎(); __nop‎(); __nop‎(); __nop‎();}}/*** @brief‎I2Cinit* @retva‎l None*/void I2CIn‎i t(void){HTUIn‎i t();HTU20‎_SDA_‎O UT();HTU20‎_SCL_‎O UT();HTU20‎_SDA_‎1();I2CDe‎l ay(1);HTU20‎_SCL_‎1();I2CDe‎l ay(1);}/*** @brief‎ IIC start‎signa‎l* @comme‎n t SCL、SDA同为‎高,SDA跳变‎成低之后,SCL跳变‎成低* @retva‎l None*/void I2CSt‎a rt(void){HTU20‎_SDA_‎O UT();HTU20‎_SDA_‎1();HTU20‎_SCL_‎1();I2CDe‎l a y(5); //大于4.7usHTU20‎_SDA_‎0();I2CDe‎l a y(5); //大于4us‎HTU20‎_SCL_‎0();I2CDe‎l ay(5);}/*** @brief‎ IIC Stop Signa‎l* @comme‎t SCL、SDA同为‎低,SCL跳变‎成高之后,SDA跳变‎成高 * @retva‎l None*/void I2CSt‎o p(void){HTU20‎_SDA_‎O UT();HTU20‎_SDA_‎0();HTU20‎_SCL_‎0();I2CDe‎l ay(5);HTU20‎_SCL_‎1();I2CDe‎l ay(5);HTU20‎_SDA_‎1();I2CDe‎l ay(5);}/*** @brief‎ simu IIC write‎byte* @param‎W rite‎_Byte‎: data* @retva‎l None*/BYTE I2C_W‎r ite_‎B yte(BYTE Write‎_Byte‎){BYTE i;HTU20‎_SDA_‎O UT();for(i = 0; i < 8; ++i){if(Write‎_Byte‎& SHT20‎A DDR){HTU20‎_SDA_‎1();}else{HTU20‎_SDA_‎0();}I2CDe‎l ay(1);HTU20‎_SCL_‎1(); //输出SDA‎稳定后拉高‎S CL,从机检测到‎后采样I2CDe‎l a y(5); //保证足够长‎锁定时间,确保从机采‎样成功HTU20‎_SCL_‎0();I2CDe‎l ay(1);Write‎_Byte‎<<= 1;}I2CDe‎l ay(4);HTU20‎_SDA_‎1(); //8位发送完‎后释放数据‎线,准备接受应‎答信号HTU20‎_SCL_‎1(); //再次拉高S‎C L,告诉从机发‎送完毕,等待应答I2CDe‎l a y(5); //原来是5HTU20‎_SDA_‎I N();i = 100;do{if(HTU20‎_SDA == 0) break‎;i--;I2CDe‎l a y(4); //原来是5}while‎(i>0);HTU20‎_SCL_‎0();if(i) retur‎n ACK;else retur‎n NACK;// if(HTU20‎_SDA == 1) //SDA为高‎,收到NAC‎K// retur‎n NACK;// else //SDA为低‎,收到ACK‎// retur‎n ACK;// HTU20‎_SCL_‎0();// I2CDe‎l ay(15);}/*** @brief‎simu read byte form IIC* @param‎* @retva‎l None*/BYTE I2C_R‎e ad_B‎y te(BYTE AckVa‎l ue)//recei‎v ebyt‎e{BYTE i, RDByt‎e = 0;HTU20‎_SCL_‎0(); /*后改的程序‎*/HTU20‎_SDA_‎O UT();// HTU20‎_SCL_‎0();HTU20‎_SDA_‎1(); //释放总线,并置数据线‎为输入HTU20‎_SDA_‎I N();for (i = 0; i < 8; ++i){HTU20‎_SCL_‎1(); //拉高SCL‎期间,采样I2CDe‎l ay(2);RDByt‎e<<= 1;if(HTU20‎_SDA == 1){RDByt‎e |= 0x01;}else{RDByt‎e&= 0xfe;}I2CDe‎l ay(1);HTU20‎_SCL_‎0(); //下降沿告知‎从机发送下‎一位I2CDe‎l ay(6);}HTU20‎_SDA_‎O UT(); //接受完一个‎字节,发送ACK‎or NACK if(AckVa‎l ue == 1){HTU20‎_SDA_‎1();}else{HTU20‎_SDA_‎0();}I2CDe‎l ay(3);HTU20‎_SCL_‎1();I2CDe‎l ay(5);HTU20‎_SCL_‎0(); //清时钟线I2CDe‎l ay(15);//HTU20‎_SDA_‎1();retur‎n RDByt‎e;}/*** @brief‎soft reset‎by trans‎m it reset‎comma‎n d* @retva‎l None*/voidSoftR‎e set(void){I2CIn‎i t();I2CSt‎a rt();I2C_W‎r ite_‎B yte(SHT20‎A DDR & 0xfe); //I2C addre‎s s + write‎I2C_W‎r ite_‎B yte(SOFT_‎R ESET‎); //soft reset‎I2CSt‎o p();}/*** @brief‎ SET HTU20‎D resol‎u tion‎by write‎regis‎t er* @retva‎l None*/voidSET_R‎e solu‎t ion(void){I2CSt‎a rt();if(I2C_W‎r ite_‎B yte(SHT20‎A DDR & 0xfe) == ACK) //I2C addre‎s s + write‎+ ACK{if(I2C_W‎r ite_‎Byte(WRITE‎_REGI‎S TER)==ACK) //写用户寄存‎器{if(I2C_W‎r ite_‎Byte(0x83)==ACK); //设置分辨率‎11bit‎RH% 测量时间:12ms(typ.)} // 11bit‎T℃测量时间:9ms(typ.)}I2CSt‎o p();}/*** @brief‎ read sht20‎'s conve‎r ted resul‎t* @param‎T empO‎r Humi‎C MD: opera‎t ion comma‎n d for tempe‎r atur‎e or humid‎i ty* @retva‎l None*/float‎ReadS‎h t20(char TempO‎r Humi‎C MD){float‎temp;BYTE MSB,LSB;float‎Humid‎i ty, Tempe‎r atur‎e;SET_R‎e solu‎t ion();I2CSt‎a rt();if(I2C_W‎r ite_‎B yte(SHT20‎A DDR & 0xfe) == ACK) //I2C addre‎s s + write‎+ ACK{if(I2C_W‎r ite_‎B yte(TempO‎r Humi‎C MD) == ACK) //comma‎n d{// delay‎m s(Measu‎r eDel‎a y); /*这两行由下‎面屏蔽了的‎两行改到上‎面来的*/// I2CSt‎a rt();do{delay‎m s(Measu‎r eDel‎a y);I2CSt‎a rt();} while‎(I2C_W‎r ite_‎B yte(SHT20‎A DDR | 0x01) == NACK); //I2C addre‎s s + read + NACKMSB = I2C_R‎e ad_B‎y te(ACK);LSB = I2C_R‎e ad_B‎y te(ACK);I2C_R‎e ad_B‎y te(NACK); //Check‎s um + NACKI2CSt‎o p();LSB &= 0xfc; //Data (LSB) 的后两位在‎进行物理计‎算前前须置‎0temp = (MSB << 8) + LSB;if (TempO‎r Humi‎C MD == ((char)TRIGG‎E R_HU‎M I)){/*-- calcu‎l ate relat‎i ve humid‎i ty [%RH] --*///equat‎i on: RH% = -6 + 125 * SRH/2^REShHumid‎i ty = (temp * 125) / 65536‎- 6;retur‎n Humid‎i ty;}else{/*-- calcu‎l ate tempe‎r atur‎e [°C] --*///equat‎i on:T = -46.85 + 175.72 * ST/2^REStTempe‎r atur‎e = (temp * 175.72) / 65536‎- 46.85;retur‎n Tempe‎r atur‎e;}}}retur‎n 0;}voiddelay‎m s(BYTE ms){BYTE t;for(t=0;t<100;t++){I2CDe‎l ay(10);}// Delay‎m s = ms;// while‎(Delay‎m s);}////////////////////////////////////////////////////////////////////////////////////////////////////#defin‎e TRIGG‎E R_TE‎M P 0xf3#defin‎e TRIGG‎E R_HU‎M I 0xf5void I2CIn‎i t(void);voidSoftR‎e set(void);voidSET_R‎e solu‎t ion(void);float‎ReadS‎h t20(char TempO‎r Humi‎C MD);。

轻松玩转STM32微控制器讲义 - 第13节-基于SHT20的温湿度采集与显示实验

轻松玩转STM32微控制器讲义 - 第13节-基于SHT20的温湿度采集与显示实验

SDA
12
五、技术点详解(3) I2C模块实现-写字节(时序图)
1us T0 T1 SCL MSB LSB ACK/NOACK 5us 1us1us T2 T3 T4 5us 1us1us T5 T6 T7 1us 20us
Tm Tm+1Tm+2 Tm+3 Tm+4
SDA
在Tm+2读取 响应信号
注意:较粗的SDA线由传感器控制、普通的SDA线由MCU控制
18
五、技术点详解(6) SHT20温湿度传感器接口定义和应用电路
19
开始 等待15ms
五、技术点详解(7) SHT20温湿度读写数据流程图
发送起始信号 发送7位设备地 址和1位SDA 方向位(写) 接收SHT2x 响应信号 发送测量命令 接收SHT2x 响应信号 发送起始信号 发送响应信号 发送7位设备地 址和1位SDA 方向位(读) 读取校验和数据 发送响应信号 读取高字节数据 发送响应信号 读取低字节数据
4
四、技术点大纲
I2C串行总线概述 I2C串行总线数据传输 I2C模块实现 SHT20温湿度模块简介 SHT20温湿度传感器性能 SHT20温湿度传感器接口定义和应用电路 SHT20温湿度读写数据流程图 SHT20两种通讯模式 SHT20温湿度读写数据时序图 SHT2x模块接口简介 SHT2x模块应用
15
五、技术点详解(3) I2C模块实现-读字节(代码)
u8 I2CReadByte(EnumI2cAck ack) { u8 i; u8 val = 0;
SetSdaIn(); //输入状态 for( i = 0x80; i > 0; i /= 2 ) { SCL1; //T0、T3、... DelayNus(5); if (READ_SDA) //T1、T4、... { val=(val | i); /读数据 } SCL0; //T2、T5、... DelayNus(1); } 待续...

STM32 湿度传感器程序

STM32 湿度传感器程序

湿度传感器程序以下是C文件#include <stm32f10x_lib.h>#include "dht11.h"//复位DHT11void DHT11_Rst(void){DHT11_IO_OUT(); //SET OUTPUTDHT11_DQ_OUT=0; //拉低DQdelay_ms(20); //拉低至少18msDHT11_DQ_OUT=1; //DQ=1delay_us(30); //主机拉高20~40us}//等待DHT11的回应//返回1:未检测到DHT11的存在//返回0:存在u8 DHT11_Check(void){u8 retry=0;DHT11_IO_IN();//SET INPUTwhile (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us{retry++;delay_us(1);};if(retry>=100)return 1;else retry=0;while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us {retry++;delay_us(1);};if(retry>=100)return 1;return 0;}//从DHT11读取一个位//返回值:1/0u8 DHT11_Read_Bit(void){u8 retry=0;while(DHT11_DQ_IN&&retry<100)//等待变为低电平{retry++;delay_us(1);}retry=0;while(!DHT11_DQ_IN&&retry<100)//等待变高电平{retry++;delay_us(1);}delay_us(40);//等待40usif(DHT11_DQ_IN)return 1;else return 0;}//从DHT11读取一个字节//返回值:读到的数据u8 DHT11_Read_Byte(void){u8 i,dat;dat=0;for (i=0;i<8;i++){dat<<=1;dat|=DHT11_Read_Bit();}return dat;}//从DHT11读取一次数据//temp:温度值(范围:0~50°)//humi:湿度值(范围:20%~90%)//返回值:0,正常;1,读取失败u8 DHT11_Read_Data(u8 *temp,u8 *humi){u8 buf[5];u8 i;DHT11_Rst();if(DHT11_Check()==0){for(i=0;i<5;i++)//读取40位数据{buf[i]=DHT11_Read_Byte();}if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]){*humi=buf[0];*temp=buf[2];}}else return 1;return 0;}//初始化DHT11的IO口DQ 同时检测DHT11的存在//返回1:不存在//返回0:存在u8 DHT11_Init(void){RCC->APB2ENR|=1<<2; //使能PORTA口时钟GPIOA->CRH&=0XFFFF0FFF; //PA11 推挽输出GPIOA->CRH|=0X00003000;GPIOA->ODR|=1<<11; //输出1DHT11_Rst();return DHT11_Check();}//湿度显示void Humidity_display(void){uchar table0[]={"Temp:00.00C "};uchar table1[]={"Humi:00.00% "};u8 t=0;u8 temperature,tem;u8 humidity,hum;int num;if(t%10==0)//每100ms读取一次{DHT11_Read_Data(&temperature,&humidity); //读取温湿度值//显示温度值table0[5]=temperature/10+0x30;table0[6]=temperature%10+0x30;tem=temperature*100;table0[8]=tem/10%10+0x30;table0[9]=tem%10+0x30;//显示湿度值table1[5]=humidity/10+0x30;table1[6]=humidity%10+0x30;hum=humidity*100;table1[8]=hum/10%10+0x30;table1[9]=hum%10+0x30;write_1602_com(0x80);for(num=0;num<16;num++){write_1602_dat(table0[num]);delay_ms(8);}write_1602_com(0x80+0x40);for(num=0;num<16;num++){write_1602_dat(table1[num]);delay_ms(8);}}delay_ms(10);t++;if(t==10){t=0;}}以下是H文件#ifndef __DHT11_H#define __DHT11_H#include "sys.h"#define uint unsigned int#define uchar unsigned char//IO方向设置#define DHT11_IO_IN() {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=8<<12;} #define DHT11_IO_OUT() {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=3<<12;}////IO操作函数#define DHT11_DQ_OUT PAout(11) //数据端口PA11#define DHT11_DQ_IN PAin(11) //数据端口PA11u8 DHT11_Init(void);//初始化DHT11u8 DHT11_Read_Data(u8 *temp,u8 *humi);//读取温湿度u8 DHT11_Read_Byte(void);//读出一个字节u8 DHT11_Read_Bit(void);//读出一个位u8 DHT11_Check(void);//检测是否存在DHT11 void DHT11_Rst(void);//复位DHT11void Humidity_display(void);//湿度显示#endif。

基于STM32的远程温湿度数据采集器无线通信功能实现

基于STM32的远程温湿度数据采集器无线通信功能实现

基于STM32的远程温湿度数据采集器无线通信功能实现发布时间:2021-12-28T03:03:43.178Z 来源:《中国科技人才》2021年第25期作者:崔浩[导读] 本文介绍了一种多平台多端远程控制的温湿度数据采集端的无线通讯功能实现。

武汉晴川学院湖北武汉 430000摘要:本文介绍了一种多平台多端远程控制的温湿度数据采集端的无线通讯功能实现。

其中温湿度数据采集器以STM32F103RBT6单片机作为主控芯片,编写驱动实现了SHT30温湿度传感器的数据采集功能。

采集器通过WiFi模块向多个平台的主控端发送数据并接收控制指令。

本文研究了WiFi模块ESP8266的工作原理,通过使用AT指令集,设计了一种多采集端、多主控端的WiFi无线通信流程,实现了多个数据采集端向主控端远程发送数据及接收控制指令的功能。

关键字:ESP8266;TCP/UDP协议;远程控制0 引言随着单片机性能的不断提升,芯片产品的性价比不断提升并处于一个合理的水平。

笔者前期设计并实现了一种基于STM32F103RBT6单片机和ESP8266无线WiFi模块的远程数据采集终端。

具体部署中,以此终端为节点,需在一定区域内布设多个数据采集器并连接网络。

本文研究了WiFi模块ESP8266的工作原理,并以此模块为基础,配合AT指令集的使用,编写了远程数据接收并处理的代码,实现了远端节点向多种控制端进行数据发送及对控制端命令进行响应的功能。

1、系统结构分析远程温湿度数据采集系统,主要由数据采集端(STM32F103)和控制端(PC、安卓、Linux、ARM)两大部分构成,其中数据采集端的设计和实现已于前期完成,只需实现针对TCP或UDP协议的部分代码即可实现数据传输和命令响应功能。

而采集终端的功能可划分为几个模块进行分别设计,包括数据传输、命令响应、现场显示等几个模块开发。

2、数据传输功能实现STM32单片机配合WiFi模块ESP8266进行温湿度数据采集及数据传输、控制命令接收等功能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

****************************************************************************** * @file HTU20.x* @brief HTU20 function* @cpu STM32F051* @compiler Keil uVision V5.01* @author Hanney* @copyright* @version V1.0.1* @date 18-Sept-2015* @modifydate 20-Sept-2015****************************************************************************** * @attention*///STM32F051 模拟IIC//#include "boardAPI.h"//#include "stm32f0xx.h"//#include "HTU20.h"//#include "uart.h"//#include "delay.h"#include "stm32f0xx.h"#include "stm32lib.h"#define HTU20_CLK RCC_AHBPeriph_GPIOB#define HTU20_SDA_PORT GPIOB#define HTU20_SCL_PORT GPIOB#define HTU20_SDA_PIN GPIO_Pin_11#define HTU20_SCL_PIN GPIO_Pin_10#define RESOLUTION_11b0x81//RH 11 TH 11#define RESOLUTION_12b0x01//RH 8 TH 12#define RESOLUTION_13b0x80//RH 10 TH 13#define RESOLUTION_14b0x00//RH 12 TH 14#define OTP_disEN0x02//不能启动OPT加载#define OTP_EN0x00//启动OPT加载#define RESh16//湿度解析度#define RESt16//温度解析度#define MeasureDelay12//解析延时时间单位mstypedef unsigned char BYTE;typedef unsigned int WORD;BYTE Delayms;GPIO_InitTypeDef GPIO_InitStructure;void delayms(BYTE ms);/*** @brief Start HTU GPIO port CLK* @retval None*/void HTUInit(void){RCC_AHBPeriphClockCmd(HTU20_CLK, ENABLE);}/*================================================================IIC address================================================================*/ #define SHT20ADDR 0x80/*================================================================ACK and NACK defination================================================================*/ #define ACK 0#define NACK 1/*================================================================HTU20D Command Code================================================================*/ /*Command Code Comment Trigger Temperature Measurement 0xe3 Hold master Trigger Humidity Measurement 0xe5 Hold master Trigger Temperature Measuremeng 0xf3 No Hold master Trigger Humidity Measurement 0xf5 No Hold master Write user register 0xe6Read user register 0xe7Soft Reset 0xfe*/#define SOFT_RESET 0xfe#define READ_REGISTER 0xe7#define WRITE_REGISTER 0xe6#define TRIGGER_TEMP 0xf3#define TRIGGER_HUMI 0xf5/*================================================================HTU20 operate interface================================================================*/#define HTU20_SCL GPIO_ReadInputDataBit(HTU20_SCL_PORT,HTU20_SCL_PIN) #define HTU20_SDA GPIO_ReadInputDataBit(HTU20_SDA_PORT,HTU20_SDA_PIN)/*** @brief Set SDA pin dircate as output* @retval None*/void HTU20_SDA_OUT(){GPIO_StructInit(&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = HTU20_SDA_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(HTU20_SDA_PORT, &GPIO_InitStructure);}/*** @brief Set SDA pin dircate as intput* @retval None*/void HTU20_SDA_IN(){GPIO_StructInit(&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = HTU20_SDA_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(HTU20_SDA_PORT, &GPIO_InitStructure);}/*** @brief Set SDA pin as high* @retval None*/void HTU20_SDA_1(){GPIO_SetBits(HTU20_SDA_PORT,HTU20_SDA_PIN);}/*** @brief Set SDA pin as low* @retval None*/void HTU20_SDA_0(){GPIO_ResetBits(HTU20_SDA_PORT,HTU20_SDA_PIN); }/*** @brief Set SCL pin dircate as output* @retval None*/void HTU20_SCL_OUT(){GPIO_StructInit(&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = HTU20_SCL_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(HTU20_SCL_PORT, &GPIO_InitStructure);}/*** @brief Set SCL pin as high* @retval None*/void HTU20_SCL_1(){GPIO_SetBits(HTU20_SCL_PORT,HTU20_SCL_PIN);}/*** @brief Set SCL pin as low* @retval None*/void HTU20_SCL_0(){GPIO_ResetBits(HTU20_SCL_PORT,HTU20_SCL_PIN);}/*================================================================Simulation I2C Function================================================================*//*** @brief A short delay for iic synchronization* @param t us* @retval None*/void I2CDelay (BYTE t){while(t--){__nop(); __nop(); __nop(); __nop(); __nop();__nop(); __nop(); __nop(); __nop(); __nop();__nop(); __nop(); __nop(); __nop(); __nop();__nop(); __nop(); __nop(); __nop(); __nop();__nop(); __nop(); __nop(); __nop(); __nop();__nop(); __nop(); __nop(); __nop(); __nop();__nop(); __nop(); __nop(); __nop(); __nop();}}/*** @brief I2C init* @retval None*/void I2CInit(void){HTUInit();HTU20_SDA_OUT();HTU20_SCL_OUT();HTU20_SDA_1();I2CDelay(1);HTU20_SCL_1();I2CDelay(1);}/*** @brief IIC start signal* @comment SCL、SDA同为高,SDA跳变成低之后,SCL跳变成低* @retval None*/void I2CStart(void){HTU20_SDA_OUT();HTU20_SDA_1();HTU20_SCL_1();I2CDelay(5); //大于4.7usHTU20_SDA_0();I2CDelay(5); //大于4usHTU20_SCL_0();I2CDelay(5);}/*** @brief IIC Stop Signal* @commet SCL、SDA同为低,SCL跳变成高之后,SDA跳变成高* @retval None*/void I2CStop(void){HTU20_SDA_OUT();HTU20_SDA_0();HTU20_SCL_0();I2CDelay(5);HTU20_SCL_1();I2CDelay(5);HTU20_SDA_1();I2CDelay(5);}/*** @brief simu IIC write byte* @param Write_Byte: data* @retval None*/BYTE I2C_Write_Byte(BYTE Write_Byte){BYTE i;HTU20_SDA_OUT();for(i = 0; i < 8; ++i){if(Write_Byte & SHT20ADDR){HTU20_SDA_1();}else{HTU20_SDA_0();}I2CDelay(1);HTU20_SCL_1(); //输出SDA稳定后拉高SCL,从机检测到后采样I2CDelay(5); //保证足够长锁定时间,确保从机采样成功HTU20_SCL_0();I2CDelay(1);Write_Byte <<= 1;}I2CDelay(4);HTU20_SDA_1(); //8位发送完后释放数据线,准备接受应答信号HTU20_SCL_1(); //再次拉高SCL,告诉从机发送完毕,等待应答I2CDelay(5);//原来是5HTU20_SDA_IN();i = 100;do{if(HTU20_SDA == 0) break;i--;I2CDelay(4);//原来是5}while(i>0);HTU20_SCL_0();if(i) return ACK;else return NACK;// if(HTU20_SDA == 1) //SDA为高,收到NACK// return NACK;// else //SDA为低,收到ACK// return ACK;// HTU20_SCL_0();// I2CDelay(15);}/*** @brief simu read byte form IIC* @param* @retval None*/BYTE I2C_Read_Byte(BYTE AckValue)//receivebyte{BYTE i, RDByte = 0;HTU20_SCL_0();/*后改的程序*/HTU20_SDA_OUT();// HTU20_SCL_0();HTU20_SDA_1(); //释放总线,并置数据线为输入HTU20_SDA_IN();for (i = 0; i < 8; ++i){HTU20_SCL_1(); //拉高SCL期间,采样I2CDelay(2);RDByte <<= 1;if(HTU20_SDA == 1){RDByte |= 0x01;}else{RDByte &= 0xfe;}I2CDelay(1);HTU20_SCL_0(); //下降沿告知从机发送下一位I2CDelay(6);}HTU20_SDA_OUT(); //接受完一个字节,发送ACK or NACK if(AckValue == 1){HTU20_SDA_1();}else{HTU20_SDA_0();}I2CDelay(3);HTU20_SCL_1();I2CDelay(5);HTU20_SCL_0(); //清时钟线I2CDelay(15);//HTU20_SDA_1();return RDByte;}/*** @brief soft reset by transmit reset command* @retval None*/void SoftReset(void){I2CInit();I2CStart();I2C_Write_Byte(SHT20ADDR & 0xfe); //I2C address + writeI2C_Write_Byte(SOFT_RESET); //soft resetI2CStop();}/*** @brief SET HTU20D resolution by write register* @retval None*/void SET_Resolution(void){I2CStart();if(I2C_Write_Byte(SHT20ADDR & 0xfe) == ACK) //I2C address + write + ACK{if(I2C_Write_Byte(WRITE_REGISTER)==ACK) //写用户寄存器{if(I2C_Write_Byte(0x83)==ACK); //设置分辨率11bit RH% 测量时间:12ms(typ.)} // 11bit T℃测量时间:9ms(typ.)}I2CStop();}/*** @brief read sht20's converted result* @param TempOrHumiCMD: operation command for temperature or humidity* @retval None*/float ReadSht20(char TempOrHumiCMD){float temp;BYTE MSB,LSB;float Humidity, Temperature;SET_Resolution();I2CStart();if(I2C_Write_Byte(SHT20ADDR & 0xfe) == ACK) //I2C address + write + ACK{if(I2C_Write_Byte(TempOrHumiCMD) == ACK) //command{//delayms(MeasureDelay);/*这两行由下面屏蔽了的两行改到上面来的*/// I2CStart();do{delayms(MeasureDelay);I2CStart();} while(I2C_Write_Byte(SHT20ADDR | 0x01) == NACK); //I2C address + read + NACKMSB = I2C_Read_Byte(ACK);LSB = I2C_Read_Byte(ACK);I2C_Read_Byte(NACK); //Checksum + NACKI2CStop();LSB &= 0xfc; //Data (LSB) 的后两位在进行物理计算前前须置0temp = (MSB << 8) + LSB;if (TempOrHumiCMD == ((char)TRIGGER_HUMI)){/*-- calculate relative humidity [%RH] --*///equation: RH% = -6 + 125 * SRH/2^REShHumidity = (temp * 125) / 65536 - 6;return Humidity;}else{/*-- calculate temperature [°C] --*///equation:T = -46.85 + 175.72 * ST/2^REStTemperature = (temp * 175.72) / 65536 - 46.85;return Temperature;}}}return 0;}void delayms(BYTE ms){BYTE t;for(t=0;t<100;t++){I2CDelay(10);}//Delayms = ms;//while(Delayms);}////////////////////////////////////////////////////////////////////////////////////////////////////#define TRIGGER_TEMP 0xf3#define TRIGGER_HUMI 0xf5void I2CInit(void);void SoftReset(void);void SET_Resolution(void);float ReadSht20(char TempOrHumiCMD);。

相关文档
最新文档