|
楼主 |
发表于 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);
}
} |
|