[技术问答]

M0516lbn读取DHT11程序分享

[复制链接]
2011|17
手机看帖
扫描二维码
随时随地手机跟帖
蔚飞|  楼主 | 2014-11-18 13:46 | 显示全部楼层 |阅读模式
pi, vr, CSR, ui
这两天调试了DHT11,单片机是M0516LBN,对着示波器调了两天没调处来,惭愧,左右找不出问题,无意中将P0_PIN改成P0_PIN的地址,居然成功了,在此分享代码,让后来者不要浪费时间。
#include "delay.h"

void delay_us(uint32_t unCnt)//delay_us(2)-->6US;delay_us(5)-->10US;delay_us(24);-->30US
{
        SYST_RVR = unCnt*12; //系统时钟频率 12MHz,计数一次1/12(us),所以乘以12
        SYST_CVR = 0;
        SYST_CSR |=1UL<<0;
        while((SYST_CSR & 1UL<<16)==0);
//        uint16_t i=0;
//        uint16_t j=0;
//        for(i=0;i<unCnt;i++)
//        {
//                j++;j++;j++;j++;       
//        }
}

void delay_ms(uint32_t unCnt)
{
        SYST_RVR = unCnt*12000; //系统时钟频率 12MHz
        SYST_CVR = 0;
        SYST_CSR |=1UL<<0;
        while((SYST_CSR & 1UL<<16)==0);
//        uint16_t i,j;
//        for(i=0;i<unCnt;i++)
//        {
//                for(j=0;j<1169;j++)
//                {}       
//        }
}

void delay_280us(void)
{
        uint16_t i;
        for(i=0;i<415;i++)
        {       
        }
}

void delay_20ms(void)
{
        uint16_t i,j;
        for(j=0;j<16800;j++)
        {}       
}

void delay_10us(void)
{
        uint16_t i;
        for(i=0;i<14;i++)
        {       
        }
}

void delay_5us(void)
{
        uint16_t i;
        for(i=0;i<6;i++)
        {       
        }
}

void delay_30us(void)
{
        uint16_t i;
        for(i=0;i<55;i++)
        {       
        }
}

void delay_40us(void)
{
        uint16_t i;
        for(i=0;i<65;i++)
        {       
        }
}
void delay_80us(void)
{
        uint16_t i;
        for(i=0;i<155;i++)
        {       
        }
}


#define DHT_OUT                  P0_PMD=P0_PMD&0XFFFC|0X0001
#define DHT_IN                 P0_PMD=P0_PMD&0XFFFC
#define DHT_IO                 P0_PMD=P0_PMD&0XFFFC|0X0003
#define DHT_OD                 P0_PMD=P0_PMD&0XFFFC|0X0002
#define DHT_H            P0_DOUT|=(1<<0)
#define DHT_L            P0_DOUT&=~(1<<0)
#define DHT_DATA    P0_PIN&0X01

uint8_t DHTSTA=1;

uint8_t DHT11_ReadDis(void)
{
        uint8_t i=0,j=0,dat1,dat2,dat3,dat4,dat5;
        DHT_IO;
        DHT_L;
        delay_20ms();
        DHT_H;
        delay_us(5);//延时10us
        //等待DHT11的低电平响应
        while(((*((volatile unsigned long *)0x50004010UL))&0X01));//((*((volatile unsigned long *)0x50004010UL)) --> P0_PIN,换成P0_PIN就不行,读不出数据了
        //DHT11响应80us的低电平后会有一个80us的高电平
        while(!((*((volatile unsigned long *)0x50004010UL))&0X01));//DHT11会拉高40~80us,等待高电平                       -_↓_----               
        //开始接收数据
        for(i=0;i<8;i++)
        {
                dat1<<=1;
                while(((*((volatile unsigned long *)0x50004010UL))&0X01)); //等待低电平
                while(!((*((volatile unsigned long *)0x50004010UL))&0X01));//等待高电平
                delay_30us();//30us之后还是高电平,那此位为1
                if((*((volatile unsigned long *)0x50004010UL))&0X01)
                {
                        dat1|=0x01;
                }
        }
        for(i=0;i<8;i++)
        {
                dat2<<=1;
                while(((*((volatile unsigned long *)0x50004010UL))&0X01));
                while(!((*((volatile unsigned long *)0x50004010UL))&0X01));delay_30us();
                if((*((volatile unsigned long *)0x50004010UL))&0X01)
                {
                        dat2|=0x01;
                }
        }
        for(i=0;i<8;i++)
        {
                dat3<<=1;
                while(((*((volatile unsigned long *)0x50004010UL))&0X01));
                while(!((*((volatile unsigned long *)0x50004010UL))&0X01));delay_30us();
                if((*((volatile unsigned long *)0x50004010UL))&0X01)
                {
                        dat3|=0x01;
                }
        }
        for(i=0;i<8;i++)
        {
                dat4<<=1;
                while(((*((volatile unsigned long *)0x50004010UL))&0X01));
                while(!((*((volatile unsigned long *)0x50004010UL))&0X01)); delay_30us();
                if((*((volatile unsigned long *)0x50004010UL))&0X01)
                {
                        dat4|=0x01;
                }
        }
        for(i=0;i<8;i++)
        {
                dat5<<=1;
                while(((*((volatile unsigned long *)0x50004010UL))&0X01));
                while(!((*((volatile unsigned long *)0x50004010UL))&0X01));
                delay_30us();
                if((*((volatile unsigned long *)0x50004010UL))&0X01)
                {
                        dat5|=0x01;
                }
        }
        //DHT响应完毕,准备接收数据       
        if(dat5==(dat1+dat2+dat3+dat4))
        {
                LCD3029_DisHZ16Num(216,223,111,126,&num[dat1%100/10][0],WHITE,BLACK);
                LCD3029_DisHZ16Num(224,231,111,126,&num[dat1%10][0],WHITE,BLACK);
                LCD3029_DisHZ16Num(216,223,130,145,&num[dat3%100/10][0],WHITE,BLACK);
                LCD3029_DisHZ16Num(224,231,130,145,&num[dat3%10][0],WHITE,BLACK);               
        }

        return        DHTSTA;
}
clyu| | 2014-11-18 18:11 | 显示全部楼层
多谢分享

使用特权

评论回复
598330983| | 2014-11-19 09:47 | 显示全部楼层
真给力,回头我试试看。

使用特权

评论回复
hxjlm| | 2015-4-3 10:34 | 显示全部楼层
谢谢分享!

使用特权

评论回复
稳稳の幸福| | 2015-4-3 13:11 | 显示全部楼层
谢谢楼主分享,楼主直接玩的寄存器啊?怎么不用库函数操作啊。那样看起来更方便。

使用特权

评论回复
734774645| | 2015-10-22 09:58 | 显示全部楼层
正找这程序呢,楼主就送来了,太感谢了。

使用特权

评论回复
734774645| | 2015-10-22 11:48 | 显示全部楼层
有没有用库函数写的?我想用库函数做。

使用特权

评论回复
643757107| | 2015-10-22 21:57 | 显示全部楼层
   while(!((*((volatile unsigned long *)0x50004010UL))&0X01));
这怎么直接用地址了啊

使用特权

评论回复
643757107| | 2015-10-27 07:14 | 显示全部楼层
void delay_ms(uint32_t unCnt) {         SYST_RVR = unCnt*12000; //系统时钟频率 12MHz         SYST_CVR = 0;         SYST_CSR |=1UL<<0;         while((SYST_CSR & 1UL<<16)==0); //        uint16_t i,j; //        for(i=0;i<unCnt;i++) //        { //                for(j=0;j<1169;j++) //                {}         //        }  }  void delay_280us(void) {         uint16_t i;         for(i=0;i<415;i++)         {                 } }  void delay_20ms(void) {         uint16_t i,j;         for(j=0;j<16800;j++)         {}         }  void delay_10us(void) {         uint16_t i;         for(i=0;i<14;i++)         {                 } }  void delay_5us(void) {         uint16_t i;         for(i=0;i<6;i++)         {                 } }  void delay_30us(void) {         uint16_t i;         for(i=0;i<55;i++)         {                 } }  void delay_40us(void) {         uint16_t i;         for(i=0;i<65;i++)         {                 } } void delay_80us(void) {         uint16_t i;         for(i=0;i<155;i++)         {                 } }  

使用特权

评论回复
wahahaheihei| | 2015-10-27 08:54 | 显示全部楼层
void delay_30us(void)
{
         uint16_t i;
         for(i=0;i<55;i++)
         {        
         }
}

这种延时靠谱吗

使用特权

评论回复
捉虫天师| | 2015-10-27 09:11 | 显示全部楼层
虽然功能实现了,不过看起来代码写的不够老练锕

使用特权

评论回复
yiy| | 2017-8-26 17:14 | 显示全部楼层
真不错,这几天有人问呢,我转发给他看看

使用特权

评论回复
huangcunxiake| | 2017-10-4 11:37 | 显示全部楼层
正在找这个传感器的操作方式。

使用特权

评论回复
稳稳の幸福| | 2017-10-4 21:41 | 显示全部楼层
这个系列官方提供延时函数没,自己写会不会太浪费

使用特权

评论回复
玛尼玛尼哄| | 2017-10-5 21:46 | 显示全部楼层
怎么不调用库函数里的delay啊。

使用特权

评论回复
玛尼玛尼哄| | 2017-10-5 21:47 | 显示全部楼层
void TIMER_Delay(TIMER_T *timer, uint32_t u32Usec);
官方提供了这个函数。

使用特权

评论回复
稳稳の幸福| | 2017-10-6 22:03 | 显示全部楼层
用的什么接口的显示器啊,看起来不错呀

使用特权

评论回复
huahuagg| | 2020-2-17 22:19 | 显示全部楼层
MARK ,明天测试一下,然后修改修改用库函数延时。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

13

帖子

1

粉丝