使用STM32F103C8T6最小系统,搭载DHT22温湿度传感器,显示屏用12864,测量数据和温度计的显示数值基本一致!
温湿度显示
对比温度计显示
单片机源程序如下:
- #include "humiture.h"
- #include "systick.h"
- char RHData_H_Temp,RHData_L_Temp,TData_H_Temp,TData_L_Temp,CheckData_Temp; //温湿度数据校验前存放位置
- char RHData_H,RHData_L,TData_H,TData_L,CheckData; //最终温湿度数据存放处
- char check_temp;
- void Humitureport_outputinit(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure_A; //声明一个结构体变量,用来初始化GPIO_A ; A PORT AS OUTPUT
-
- //SystemInit(); //system CLK initial
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //enable APB2 external clock
- /* 配置GPIO_A的模式和IO口 */
- GPIO_InitStructure_A.GPIO_Pin = Humiture_Port; //选择你要设置的IO口
- GPIO_InitStructure_A.GPIO_Mode = GPIO_Mode_Out_PP; //设置推挽输出模式
- GPIO_InitStructure_A.GPIO_Speed = GPIO_Speed_50MHz; //设置传输速率
- GPIO_Init(GPIOA,&GPIO_InitStructure_A); //init GPIOA port by GPIO_InitStructure structure
-
- }
- void Humitureport_inputinit(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure_A; //声明一个结构体变量,用来初始化GPIO_A ; A PORT AS OUTPUT
- //SystemInit(); //system CLK initial
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //enable APB2 external clock
- /* 配置GPIO_A的模式和IO口 */
- GPIO_InitStructure_A.GPIO_Pin = Humiture_Port; //选择你要设置的IO口
- GPIO_InitStructure_A.GPIO_Mode = GPIO_Mode_IPU; //设置为上拉输入模式
- GPIO_InitStructure_A.GPIO_Speed = GPIO_Speed_50MHz; //设置传输速率
- GPIO_Init(GPIOA,&GPIO_InitStructure_A); //init GPIOA port by GPIO_InitStructure structure
-
- }
- char Bit_Select(void)
- {
-
- uchar i,temp;
- uchar Byte_Data = 0; //存放每字节温湿度的数据
- // Byte_Data = 0;
- // Humitureport_inputinit();
- for(i=0;i<8;i++)
- {
- //FLAG=2;
- //while((!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12))&&FLAG++); //判断数据位是0还是1
- while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12)); //判断数据位是0还是1
- delay_us(30); //如果30微秒过后引脚还为高电平则为1
- if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12))
- temp = 1;
- else
- temp = 0;
- //FLAG=2;
- while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12));
-
- // if(FLAG == 1)break; //超时则跳出for循环
-
- Byte_Data<<=1;
- Byte_Data|= temp;
- }
- return Byte_Data;
- }
-
- /*******************************************************************************
- * 函 数 名 : HumitureRead
- * 函数功能 : 温湿度数据读取
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
-
- void HumitureRead(void)
- {
- Humitureport_outputinit(); //端口配置为输出模式
- GPIO_ResetBits(GPIOA,GPIO_Pin_12); //主机拉低18ms
- delay_ms(1);
- GPIO_SetBits(GPIOA,GPIO_Pin_12); //主机由上拉电阻拉高延时30us
- delay_us(30);
- Humitureport_inputinit(); //主机设为输入模式
-
- if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12)) //判断DHT22是否有响应信号输出
- {
- // FLAG=2;
- // while((!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12))&&FLAG++); //判断DHT22的80us响应信号是否结束
- // FLAG=2;
- // while((GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12))&&FLAG++); //判断DHT22是否发出80us高电平,如果是进入数据接受状态
- //FLAG=2;
- while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12)); //判断DHT22的80us响应信号是否结束
- //FLAG=2;
- while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12)); //判断DHT22是否发出80us高电平,如果是进入数据接受状态
- RHData_H_Temp = Bit_Select();
- RHData_L_Temp = Bit_Select();
- TData_H_Temp = Bit_Select();
- TData_L_Temp = Bit_Select();
- CheckData_Temp = Bit_Select();
-
- // GPIO_ResetBits(GPIOA,GPIO_Pin_12); //DHT22拉低总线50us
- delay_us(50);
- Humitureport_outputinit(); //端口配置为输出模式
- GPIO_SetBits(GPIOA,GPIO_Pin_12); //主机拉高总线
-
- check_temp = (RHData_H_Temp + RHData_L_Temp + TData_H_Temp + TData_L_Temp);
- if(check_temp == CheckData_Temp)
- {
- RHData_H = RHData_H_Temp;
- RHData_L = RHData_L_Temp;
- TData_H = TData_H_Temp;
- TData_L = TData_L_Temp;
- CheckData= CheckData_Temp;
- }
- }
-
- }
- /*******************************************************************************
- * 函 数 名 : Humitureoutput
- * 函数功能 : 温湿度数据输出
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void Humitureoutput(void)
- {
- HumitureRead();
- HumitureData[0] = RHData_H;
- HumitureData[1] = RHData_L;
- HumitureData[2] = TData_H;
- HumitureData[3] = TData_L;
- HumitureData[4] = CheckData;
- }
复制代码- #include "public.h" //公共函数头文件
- /****************************************************************************
- * Function Name : main
- * Description : Main program.
- * Input : None
- * Output : None
- * Return : None
- ****************************************************************************/
- char HumitureData[5] = {0}; //存放温湿度数据
- int main()
- {
- SystemInit();
- RCC_HSE_Configuration(); //自定义系统时间(可以修改时钟)
-
- lcd_init(); //lcd初始化
- display_word(); //显示”卡号“汉字
- while(1)
- {
- Humitureoutput();
- Humiture_display();
- delay_ms(1000); //Systick 计数最大值为0xFFFFFF
- delay_ms(1000);
- }
-
- }
复制代码
Keil代码下载:
代码.7z
(202.92 KB, 下载次数: 96)
|