热度 22
2016-1-5 17:16
4992 次阅读|
6 个评论
写在之后:排版有些混乱,见谅哈。转载请注明出处。 写在之后的之后: 我再放几张实物图哈哈,由于我之前在STM32F0移植的时候没有放照片,只能用现在用STM8S105的照片先拿上来,以飨读者。手头还有一些东西玩玩,就是手机控制LCD,这是目前的一部分。由于目前还没做出来,只是处于功能完善阶段,所以有些简陋。小弟就做个抛砖引玉。 首先感谢ST王先生给我一块STM32F0-Discovery,实话说,在此之前也没想到会拿到。EDN CHINA 诚不欺我哈哈,废话少说,今天给大家带来的是一款温湿度传感器DHT21(AM2301), 这是一款性能优良的温湿度监测传感器,最近公司要求在STM32F0上还有在STM8S105上面进行移植,为下一步项目做一些准备。Discovery 确实是一个很好的开发环境,集成了STLINK,很方便调试和下载,做工也堪称精炼。 在这里也感慨一下,由于本人走嵌入式这条路自己在网络上收益良多,在这里也感谢各位陌生而亲切的同行,也希望以此为契机,大家集思广益,共同建设EDN CHINA的大家庭。 有问题大家联系我,鄙人乐向哲,362245396@qq.com. 简单说一下,温湿度传感器DHT21(AM2301)是一款优良的温湿度传感器,具体的介绍在我的附件里面。 我附上的附件有以下三个 1,温湿度传感器DHT21(AM2301)的介绍,时序图,还有汇编,C51例程 2,温湿度传感器DHT21(AM2301) 在stm32F0上的移植 3,温湿度传感器DHT21(AM2301) 在stm8S105上面的移植 由于时间有限,我把重点的部分说一下 首先,温湿度传感器DHT21(AM2301)是单总线。 时序图入上所示,不知道为什么我的这边上传不了图片 简单说一下, 1,接线是简单的。如图1_1所示 图1_1 /****** 黑色: GND 红色: VCC 黄色: 接MCU的普通IO (注意不要接到特殊IO 如VSS VDD 等等) 第四线:NC *******/ 2,时序是: 空闲时总线为高电平,通讯开始时主机(MCU)拉低总线500us后释放总线,延时20-40us后主机开始检测从机(DHT21)的响应信号。从机的响应信号是一个80us左右的低电平,随后从机在拉高总线80us左右代表即 将进入数据传送。(要注意程序给主机一个下降沿) 如图2_1所示: 图2_1 如图2_2所示: 图2_2 3,引脚配置如下:这是重点! 这是重点! 这是重点! 重要的事情说四遍。。。 STM32F0版本 上拉输入是必须的!上拉输入是必须的!上拉输入是必须的! ***是中国的!***是中国的!***是中国的!***是中国的!说远了。。 stm32F0版本 void GPIO_Initializations(void) { GPIO_InitTypeDef GPIO_InitStructure; /* USART1_Tx/Rx Configuration *///USART1接口初始化 GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);//数据手册中有介绍 GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //PA9/10 alternate function GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3; //high speed GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//pushpull mode GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//可以没有上拉 GPIO_Init(GPIOA, &GPIO_InitStructure); /* GPIOB Configuration */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;//AM2301接口初始化 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//output mode GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;//high speed GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //上拉输入 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//pull up GPIO_Init(GPIOB, &GPIO_InitStructure); } STM8S105版本: #define SET_OUT_STATUS { PC_DDR |= (1 #define SET_IN_STATUS { PC_DDR &=~(1 } } C51 汇编见附件 《AM2301(DHT21)规格书》 4,“1” 和 “0”的区别:两者的区别在于 高电平时间的长短 “0” 如图 4_1所示 图4_1 “1” 如图 4_2所示 图4_2 5,关键程序演示和讲解 stm32F0版本 unsigned char AM23XX_Read(void)//读取温湿度 { unsigned char i, AM23XX_answerFlag=0; unsigned int cnt=0; AM23XX_OUT_SET;//IO设置为输出 AM23XX_OUT(0); //主机发开始信号, 单总线拉低(至少500us) delay_ms(1); AM23XX_OUT(1);//释放总线, 等待从机响应 delay_us(30);//延时(20~40us) AM23XX_IN_SET;//IO设置为输入 if(AM23XX_IN == 0)//检测从机响应信号 { cnt = 0; while(! AM23XX_IN)//等待低电平结束(80us) { = 100000) return 0; } cnt = 0; while(AM23XX_IN)//等待高电平结束 { = 100000) return 0; } for(i=0; i<5; i++) { AM_SensorData = AM23XX_Read_Byte(); } AM23XX_answerFlag = 1;//应答标志变量置位 } else { AM23XX_answerFlag = 0; } return AM23XX_answerFlag; } STM8S105版本: unsigned char Read_Temperature(void) //读温度 { unsigned char i; SET_OUT_STATUS; PB6(1); delay_us(10000); PB6(0); delay_us(600); asm("sim"); SET_IN_STATUS; EXTI_CR1 |= (1<<5)+(1<<4); //配置上下沿都可以 asm("rim"); RecvStatrFg=1; //开始接受标志位 RecvUselessBit=0; //第一个下降沿是没有意义的 RecvBytePot=0; //索引 RecvBit=0; //位索引 RecvTimeout =0; // 超时标志位 } 这个要与中断相联系。 #pragma vector = 7 //中断向量 __interrupt void PC_470Rx(void) { if(RecvStatrFg) { if(PC_IDR_IDR5==0)//下降沿 { RecvUselessBit++;//两者同时实现了i=i+1,但是++i返回值是i+1,而i++返回值是i. RecvTimeout=0; 1)//第一个下降沿不采用 { 2) { if(DataTime<10) { RecvData &= ~(1<<(7-RecvBit));//判断0 } else { RecvData |= (1<<(7-RecvBit)); //判断1 } RecvBit++; 7)//8位满清零 { RecvBytePot++; RecvBit=0; } } DataTime=0; } } } } C51版本和汇编版本在我发的附件里面 《AM2301(DHT21)规格书》里面 5,读数的话在《AM2301(DHT21)规格书》讲得很详细,还是上面的话,有问题大家一起探讨。 组合为:湿度高八位+湿度低八位+温度高八位+温度低八位+校验 6,效果照片展示 在示波器上的演示 明显看出 “1”与 “0” 3,在串口调试助手上的表示 在LCD(JLX12864G_086)上面的移植 关于JLX12864G_086的移植我在下一篇博客写写 最近在赶点东西哈 由于时间有限,有些混乱。大家要交流的可以联系我,很期待与大家的联系。转载请注明出处。