搜索
bottom↓
回复: 14

悼念舟曲 写的DHT11驱动 程序有详细注释CVAVR

[复制链接]

出0入0汤圆

发表于 2010-8-18 17:42:37 | 显示全部楼层 |阅读模式
当调出正常功能后,想听收音机所有的台内容都一样。
也取消听音乐的念头。
不能为他们做些什么。
送给有需要的人。
不知别人发过没有。
顺便说一下,CVAVR的定时非常好用,很准。

(原文件名:dhtsch.JPG)


(原文件名:IMG0375A.jpg)


(原文件名:IMG0378A.jpg)

点击此处下载 ourdev_575902.rar(文件大小:36K) (原文件名:dht11lcdtest0813.rar)

出0入0汤圆

 楼主| 发表于 2010-8-18 17:44:13 | 显示全部楼层
#include <delay.h>

void readh(void);
unsigned char stardht11(void);

unsigned char humidity, temperature, check_sum ;   

#define dhtport PORTC.3
#define dhtddr DDRC.3               

unsigned char stardht11(void)
{
   unsigned char flag;
   dhtddr = 1;
   dhtport = 0;
   delay_ms(18);  //触发开始
   dhtport = 1;   //释放总线
   delay_us(10);  //wait 20-40uS 此时不宜长,也可以上拉电阻上拉。
   dhtport = 1;   
   dhtddr = 0;    //改为输入
   delay_us(5);   //这个延时手册没有,但要加,否则检低电平有时检不到
   if(!PINC.3)
   {
      while((!PINC.3) && flag ++) //等待低电平80uS
         ;
      
      while((PINC.3) && flag ++)  //等待高电平80uS
         ;

      return(1);
   }
   else
   {
      return(0);
   }
}

void readh(void)
{
   unsigned char tem[5];     //读到的五个数
   unsigned char i, j, temp;
   if(stardht11())
   {
      for(i = 0; i < 5; i ++)
      {
         tem = 0;
         for(j = 0; j < 8; j ++)            
         {
            tem *= 2;    //不可用tem << 1 否则不移位
            temp = 2;       //
            delay_us(20);   //先延20uS 再检查30uS        
            while((!PINC.3) && temp ++)//避免死等
               if(temp == 2)
                  break;
            delay_us(32);   //高电平长于26-28uS为1否为0
            temp = 2;   
            if(PINC.3)
            {
               while(PINC.3 && temp ++) //当为1时等到低电平再进入下次循环。
                  if(temp == 2)
                     break;
               tem |= 0x01;
            }
            delay_us(5);
         }
      }
   }
   humidity = tem[0];
   temperature = tem[2];
   check_sum = tem[4];
}

/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.8d Professional
Automatic Program Generator
?Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 2010-8-13
Author  : fwluck                           
Company : guochao                           
Comments:


Chip type           : ATmega16L
Program type        : Application
Clock frequency     : 7.372800 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*****************************************************/

#include <mega16.h>
#include <delay.h>
#include <dht11.h>
// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>


flash char *chartabe = "0123456789ABCDEF";

#define coder PIND.7
#define codel PIND.6
#define codek PIND.5
            


void main(void)
{

   PORTA=0xff;
   DDRA=0xff;
   
   PORTB=0x00;
   DDRB=0x00;
   
   PORTC=0x00;
   DDRC=0x00;
   
   PORTD=0xe0;
   DDRD=0x00;
   
   TCCR0=0x00;
   TCNT0=0x00;
   OCR0=0x00;
   
   TCCR1A=0x00;
   TCCR1B=0x00;
   TCNT1H=0x00;
   TCNT1L=0x00;
   ICR1H=0x00;
   ICR1L=0x00;
   OCR1AH=0x00;
   OCR1AL=0x00;
   OCR1BH=0x00;
   OCR1BL=0x00;
   
   ASSR=0x00;
   TCCR2=0x00;
   TCNT2=0x00;
   OCR2=0x00;
   
   MCUCR=0x00;
   MCUCSR=0x00;
   
   TIMSK=0x00;
   
   ACSR=0x80;
   SFIOR=0x00;
   
   lcd_init(16);
   lcd_gotoxy(0,1);
   while (1)
   {
      readh();
      lcd_clear();
      lcd_gotoxy(0,0);
      lcd_putsf("HUM:");
      lcd_putchar(chartabe[humidity / 10]);
      lcd_putchar(chartabe[humidity % 10]);
      
      lcd_putsf("    ");
      lcd_putsf("TEM:");
      
      lcd_putchar(chartabe[temperature / 10]);
      lcd_putchar(chartabe[temperature % 10]);  
      
      lcd_putsf("SUM:");
      
      lcd_putchar(chartabe[check_sum / 10]);
      lcd_putchar(chartabe[check_sum % 10]);  
      delay_ms(1000);
   }
}

出0入0汤圆

发表于 2010-8-18 17:50:24 | 显示全部楼层
不错,温湿度检测。 CVAVR的确很好用。

出0入0汤圆

发表于 2010-9-12 19:39:34 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-18 15:22:05 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-21 11:46:27 | 显示全部楼层
本人需要认真学习研究,手头已有两只DHT11了

出0入0汤圆

发表于 2011-4-21 17:47:00 | 显示全部楼层
谢了
头像被屏蔽

出0入0汤圆

发表于 2012-4-28 17:35:28 | 显示全部楼层
这能用吗,MARK的人细心的看了程序没有啊。
前面的tem[5],后面用tem=0;这妮玛什么情况

出0入0汤圆

发表于 2012-6-3 16:14:03 | 显示全部楼层
我看过了。应该是数组元素tem[i
]

出0入0汤圆

发表于 2012-11-21 12:21:23 | 显示全部楼层
不错,支持

出0入0汤圆

发表于 2013-4-8 17:24:29 来自手机 | 显示全部楼层
谢谢楼主......

出0入0汤圆

发表于 2013-7-22 11:42:18 | 显示全部楼层
不错学习了

出0入8汤圆

发表于 2018-6-23 00:54:49 | 显示全部楼层
谢谢,参考学习
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 08:40

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表