中科因仑“3+1”工程特种兵精英论坛
标题:
基于ATmega16的DHT11温湿度检测-数码管显示
[打印本页]
作者:
lxe
时间:
2014-7-31 11:14
标题:
基于ATmega16的DHT11温湿度检测-数码管显示
本帖最后由 lxe 于 2014-7-31 11:18 编辑
程序调试了好久,昨天终于发现了一个关键点。。多了一个分号。
细节决定成败! 大家懂的。。。
结果虽然出来了,,但个人感觉偏差有点大,而且温度范围是0~55,但用一杯开水测试的时候超出了。。。怎么破?望大虾们指导指导。。
/******************************************************
//文件名称:
//作 者:LXE
//版 本:
//日 期:2017-7-31
//说 明:
//修改记录:
//时钟频率:8M
*******************************************************/
#include <iom161v.h>
#include <macros.h>
#define CLK_H() PORTA |= BIT(1) //595时钟线拉高PA1
#define CLK_L() PORTA &= ~BIT(1) //595时钟线拉低PA1
#define RCK_H() PORTA |= BIT(2) //595锁存线拉高PA2
#define RCK_L() PORTA &= ~BIT(2) //595锁存线拉低PA2
#define DATA_H() PORTA |= BIT(3) //595时钟线拉高PA3
#define DATA_L() PORTA &= ~BIT(3) //595数据线拉低PA3
#define DHT_OUT() DDRA |= BIT(7) //DHT11数据线输出设置PA7
#define DHT_IN() DDRA &= ~BIT(7) //DHT11数据线输入设置PA7
#define DHT_H() PORTA |= BIT(7) //DHT11数据线拉高PA7
#define DHT_L() PORTA &= ~BIT(7) //DHT11数据线拉低PA7
#define DHT PINA &= BIT(7) //DHT11寄存器数据读取PA7
#define uchar unsigned char
#define uint unsigned int
uchar RH=0,RL=0,TH=0,TL=0;
uchar seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //断码表
uchar table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码表
uchar buf[]={0,0,0,0,0,0,0,0}; //数据缓存区
/*******************************************************
//函数名称:
//函数功能:1ms延时子程序
//输入参数:
//返回参数:
********************************************************/
void delay_ms(uint ms)
{
uint i ;
while(ms--)
{
for(i = 0;i<990;i++) ;
}
}
/*******************************************************
//函数名称:
//函数功能:10us延时子程序
//输入参数:
//返回参数:
********************************************************/
void delay_us(uchar us)//10us延时子程序
{
uchar i;
while(us--)
{
for(i = 0;i < 11;i++);
}
}
/*******************************************************
//函数名称:
//函数功能:
//输入参数:
//返回参数:
********************************************************/
void Sent_col_data(uchar dat)
{
uchar i;
for(i = 0;i < 8;i++)
{
CLK_L();
if((dat & 0x80) == 0x80) DATA_H();
if((dat & 0x80) == 0x00) DATA_L();
CLK_H();
dat <<= 1 ;
}
}
/*******************************************************
//函数名称:
//函数功能:
//输入参数:
//返回参数:
********************************************************/
void Sent_col(uchar dat1,uchar dat2)
{
Sent_col_data(dat1);
Sent_col_data(dat2);
RCK_L();
RCK_H();
}
/*******************************************************
//函数名称:
//函数功能:
//输入参数:
//返回参数:
********************************************************/
uchar receive_byte(void) //接收一个字节
{
uchar i,data=0;
uchar flag = 0; //超时标志
for(i = 0;i < 8;i++)
{
data <<= 1; //将数据左移
flag = 2;
while((!(DHT))&&(flag++)); //等待低电平结束
if(flag == 1) {break;} //超时跳出
delay_us(3); //延时30us
if(DHT) {data |= 0x01;} //判断高低数据
flag = 2;
while((DHT)&&(flag++)); //等待高电平结束
//if(flag == 1) {break;} //超时跳出
}
return data;
}
/*******************************************************
//函数名称:
//函数功能:
//输入参数:
//返回参数:
********************************************************/
void receive(void)//接收数据
{
uchar T_H,T_L,R_H,R_L,R_T;
uchar i;
uchar flag = 0;
/*************起始信号************/
DHT_OUT();DHT_L(); //
delay_ms(20); //>18ms
DHT_OUT();DHT_H(); //
delay_us(2); //延时20us
/*************读取数据************/
DHT_IN();
if(!(DHT)) //读取DHT11响应信号
{
flag = 2;
while((!(DHT))&&(flag++)); //等待DHT11低电平结束
flag = 2;
while((DHT)&&(flag++)); //等待DHT11高电平结束
R_H = receive_byte();
R_L = receive_byte();
T_H = receive_byte();
T_L = receive_byte();
R_T = receive_byte();
DHT_OUT(); //拉高释放总线
DHT_H();
if((R_H+T_H) == R_T)
{
RH = R_H;
TH = T_H;
}
}
/*******数据转换***********/
buf[7] = RH / 10;
buf[6] = RH % 10;
buf[3] = TH / 10;
buf[2] = TH % 10;
}
/*******************************************************
//函数名称:
//函数功能:
//输入参数:
//返回参数:
********************************************************/
void timer0_Init(void)
{
TCNT0 = 0x4E; //赋初值2ms定时
TCCR0 = 0x03; //设置TC0为CLK/256分频,启动TC0
TIMSK = 0x01; //设置定时计数器的屏蔽寄存器
SEI(); //使能全局中断
}
/*******************************************************
//函数名称:
//函数功能:
//输入参数:
//返回参数:
********************************************************/
#pragma interrupt_handler timer0_ovf_isr:10 //定时器0溢出2ms中断
void timer0_ovf_isr(void) //数码管显示
{
static uchar i = 0;
if(i == 0) {Sent_col(~table[i],0x58);} //显示c
else if(i == 4) {Sent_col(~table[i],0x50);} //显示r
else if(i==1||i ==5){Sent_col(0x00,0x00);} //消去无用位
else {Sent_col(~table[i],seg[buf[i]]);} //显示数据
if(++i > 8)i = 0;
}
/*******************************************************
//函数名称:
//函数功能:
//输入参数:
//返回参数:
********************************************************/
int main(void)
{
DDRA = 0x0F; //PA口初始化
PORTA = 0xFF; //PA口上拉
receive(); //接收数据
timer0_Init(); //定时器初始化
while(1)
{
receive(); //接收数据
//delay_ms(500); //延时500ms再采集数据
}
return 0;
}
复制代码
作者:
jerryzhai
时间:
2014-7-31 11:18
楼主高深莫测,在下佩服!
作者:
还你一世界
时间:
2014-7-31 12:20
为什么注释行里函数名称,参数都是空滴呢
作者:
lxe
时间:
2014-7-31 13:51
还你一世界 发表于 2014-7-31 12:20
为什么注释行里函数名称,参数都是空滴呢
。。这个我没写。。
作者:
lucky80204
时间:
2014-7-31 14:43
大腿啊,快来抱啊,我抱~~~
作者:
liliuyang
时间:
2014-7-31 15:14
高手领教了
作者:
张衍波
时间:
2014-8-3 09:04
高手,,,,
欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/)
Powered by Discuz! X3.4