首页 >> 大全

29

2023-10-16 大全 29 作者:考证青年

功能介绍:采用stm32单片机作为主控,采用红外对射管来进行计数原理其实就是有物体从对射管中间经过,阻挡了红外光,导致红外接收传感器电平发生变化,单片机通过判断电平变化来判断当前是否有物体经过,通过这个原理可以采集人流量,以及各种计数相关的应用场景,OLED显示相关数据,蜂鸣器进行报警提醒等,文末有资料分享:

29-基于stm32单片机智能红外纸张计数器人流量统计(程序+原理图+PCB+元件清单全套资料)

程序部分展示,有中文注释,新手容易看懂
static void DHT11_Mode_Out_PP(void)
{GPIO_InitTypeDef GPIO_InitStructure;/*选择要控制的macDHT11_Dout_GPIO_PORT引脚*/															   GPIO_InitStructure.GPIO_Pin = macDHT11_Dout_GPIO_PIN;	/*设置引脚模式为通用推挽输出*/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   /*设置引脚速率为50MHz */   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;/*调用库函数,初始化macDHT11_Dout_GPIO_PORT*/GPIO_Init(macDHT11_Dout_GPIO_PORT, &GPIO_InitStructure);	 	 }/* * 从DHT11读取一个字节,MSB先行*/
static uint8_t DHT11_ReadByte ( void )
{uint8_t i, temp=0;for(i=0;i<8;i++)    {	 /*每bit以50us低电平标置开始,轮询直到从机发出 的50us 低电平 结束*/  while(macDHT11_Dout_IN()==Bit_RESET);/*DHT11 以26~28us的高电平表示“0”,以70us高电平表示“1”,*通过检测 x us后的电平即可区别这两个状 ,x 即下面的延时 */delay_us(40); //延时x us 这个延时需要大于数据0持续的时间即可	   	  if(macDHT11_Dout_IN()==Bit_SET)/* x us后仍为高电平表示数据“1” */{/* 等待数据1的高电平结束 */while(macDHT11_Dout_IN()==Bit_SET);temp|=(uint8_t)(0x01<<(7-i));  //把第7-i位置1,MSB先行 }else	 // x us后为低电平表示数据“0”{			   temp&=(uint8_t)~(0x01<<(7-i)); //把第7-i位置0,MSB先行}}return temp;}/** 一次完整的数据传输为40bit,高位先出* 8bit 湿度整数 + 8bit 湿度小数 + 8bit 温度整数 + 8bit 温度小数 + 8bit 校验和 */
uint8_t DHT11_Read_TempAndHumidity(DHT11_Data_TypeDef *DHT11_Data)
{  /*输出模式*/DHT11_Mode_Out_PP();/*主机拉低*/macDHT11_Dout_0;/*延时18ms*/delay_ms(18);/*总线拉高 主机延时30us*/macDHT11_Dout_1; delay_us(30);   //延时30us/*主机设为输入 判断从机响应信号*/ DHT11_Mode_IPU();/*判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行*/   if(macDHT11_Dout_IN()==Bit_RESET)     {/*轮询直到从机发出 的80us 低电平 响应信号结束*/  while(macDHT11_Dout_IN()==Bit_RESET);/*轮询直到从机发出的 80us 高电平 标置信号结束*/while(macDHT11_Dout_IN()==Bit_SET);/*开始接收数据*/   DHT11_Data->humi_int= DHT11_ReadByte();DHT11_Data->humi_deci= DHT11_ReadByte();DHT11_Data->temp_int= DHT11_ReadByte();DHT11_Data->temp_deci= DHT11_ReadByte();DHT11_Data->check_sum= DHT11_ReadByte();/*读取结束,引脚改为输出模式*/DHT11_Mode_Out_PP();/*主机拉高*/macDHT11_Dout_1;/*检查读取的数据是否正确*/if(DHT11_Data->check_sum == DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci)return SUCCESS;else return ERROR;}elsereturn ERROR;

下面是原理图和PCB展示:

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了