这是上周学习ARM做的基于stm32 温度采集系统
利用到串口 中断 外设等知识,实现对led控制 蜂鸣器 从而实现温度采集的功能。
请多指教。
单片机源程序如下:
- #include "dht11.h"
- #include "dida.h"
- //初始化DHT11引脚函数
- void dht11_init(void)
- {
- GPIO_InitTypeDef GPIOInitType;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
-
- GPIOInitType.GPIO_Mode = GPIO_Mode_Out_PP;
-
- GPIOInitType.GPIO_Pin = GPIO_Pin_7;
-
- GPIOInitType.GPIO_Speed = GPIO_Speed_50MHz;
-
- GPIO_Init(GPIOA,&GPIOInitType);
- //将7号引脚置一
- GPIO_SetBits(GPIOA,GPIO_Pin_7);
-
- }
- //初始化推挽输出
- void mode_output(void)
- {
- GPIO_InitTypeDef GPIOInitMode;
-
- GPIOInitMode.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIOInitMode.GPIO_Pin = GPIO_Pin_7;
- GPIOInitMode.GPIO_Speed = GPIO_Speed_50MHz;
-
- GPIO_Init(GPIOA,&GPIOInitMode);
- }
- //初始化上拉输入
- void mode_input(void)
- {
- GPIO_InitTypeDef GPIOInitMode;
- GPIOInitMode.GPIO_Mode = GPIO_Mode_IPU;
- GPIOInitMode.GPIO_Pin = GPIO_Pin_7;
- GPIOInitMode.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA,&GPIOInitMode);
- }
- //一次输出八位数据
- uint8_t output_8bit(void)
- {
- uint8_t i, temp=0;
- for(i=0;i<8;i++)
- {
-
- //每位以50us低电平标志开始,直到发出的50us低电平结束
- while(Bit_RESET == GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7));
- /*DHT11 以26~28us的高电平表示“0”,以70us高电平表示“1”,
- *通过检测 x us后的电平即可区别这两个状 ,x 即下面的延时
- */
- //延时x us 这个延时需要大于数据0持续的时间即可
- Delay_us(30);
-
- // 30us后仍为高电平表示数据“1”
- if(Bit_SET == GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7))
- {
- while(Bit_SET == GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7));// 等待数据1的高电平结束
- temp|=(uint8_t)(0x01<<(7-i)); //把第7-i位置1,,MSB先行,0x01<<(7-i)是向右移动(7-i)位
- }
- else // 30 us后为低平表示数据“0”
- {
- temp&=(uint8_t)~(0x01<<(7-i)); //把第7-i位置0,MSB先行,~取反
- }
- }
- return temp;
- }
- //输出所有的温度值,遵循高位先出原则
- uint8_t DHT11_Read_data(DHT11_Data_TypeDef *DHT11_Data)
- {
- mode_output();//输出模式//
-
- GPIO_ResetBits(GPIOA,GPIO_Pin_7);//主机拉低,开始输出为0
- Delay_ms(18); //延时18ms
- GPIO_SetBits(GPIOA,GPIO_Pin_7); //总线拉高 主机延时30us
- Delay_us(30); //延时30us
- mode_input();//主机设为输入 判断从机响应信号
- /*判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行*/
- if(Bit_RESET ==GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7))
- {
- /*轮询直到从机发出 的80us 低电平 响应信号结束*/
- while(Bit_RESET == GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7));
- /*轮询直到从机发出的 80us 高电平 标置信号结束*/
- while(Bit_SET == GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7));
- /*开始接收数据*/
- DHT11_Data->humidness_int= output_8bit();
- DHT11_Data->humidness_deci=output_8bit();
- DHT11_Data->T_int= output_8bit();
- DHT11_Data->T_deci= output_8bit();
- DHT11_Data->text_sum= output_8bit();
- /*读取结束,引脚改为输出模式*/
- mode_output();
- /*主机拉高*/
- GPIO_SetBits(GPIOA,GPIO_Pin_7);
- /*检查读取的数据是否正确*/
- if(DHT11_Data->text_sum == DHT11_Data->humidness_int + DHT11_Data->humidness_deci + DHT11_Data->T_int+ DHT11_Data->T_deci)
- return SUCCESS;
- else
- return ERROR;
- }
- else
- return ERROR;
-
- }
-
-
复制代码
所有资料51hei提供下载:
温度采集系统.7z
(192.43 KB, 下载次数: 48)
|