中科因仑“3+1”工程特种兵精英论坛
标题:
为什么会没用...战友帮忙找问题啊..是温湿度的程序
[打印本页]
作者:
lucky80204
时间:
2014-8-11 14:24
标题:
为什么会没用...战友帮忙找问题啊..是温湿度的程序
#include <reg51.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define disdata P0 //数码管段输入口
#define discan P2 //数码管位输入口
sfr AUXR = 0x8E; //特殊寄存器的地址
sfr P0M1 = 0x93;
sfr P0M0 = 0x94; //P0端口推挽输出设置地址
sbit DQ = P1^7; //DHT11的输入输出端口
/***********温湿度的整数位*******************/
uchar code dis_7[]=
{
0x3f, //"0"的字形表,0B00111111
0x06, //"1"的字形表,0B00000110
0x5B, //"2"的字形表,0B01011011
0x4f, //"3"的字形表,0B01001111
0x66, //"4"的字形表,0B01100110
0x6D, //"5"的字形表,0B01101101
0x7D, //"6"的字形表,0B01111101
0x07, //"7"的字形表,0B00000111
0x7F, //"8"的字形表,0B01111111
0x6F, //"9"的字形表,0B01101111
0x00, // 全灭消隐
0x40, //"-"的字形表,0B01000000
};
uchar code scan_con[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //列扫描控制字
uchar data display[]={0x00,0x00,0x0A,0x0A,0x00,0x00,0x0A,0x0A}; //存取缓存区
uchar RH,TH; //温湿度的整数存取
/***********************************************************************
//函数名称:delay(uint t)
//函数功能:延时程序 1*t us 系统时钟工作在12MHZ下,机器周期为1/12 us
_nop_()运行所需要时间为1个机器周期。do while函数占1个机器周期
t--占1个机器周期,10个_nop_()占10机器周期,共占12个机器周期
//入口参数:所要延时的时间 t t=n 就延时n us
//返回参数:无
***********************************************************************/
void delay(uint t)
{
do{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();
}while(t--);
}
/*********************************************************************
//函数名称:delay20ms()
//函数功能:软件延时20ms
//入口参数:无
//返回参数:无
*********************************************************************/
void delay20ms() //@12.000MHz
{
int j,k;
for(j=400;j>0;j--)
for(k=600;k>0;k--);
}
/*********************************************************************
//函数名称:display_data()
//函数功能:数码管显示温湿度
//入口参数:无
//返回参数:无
*********************************************************************/
void display_data(void)
{
uchar k;
disdata=dis_7[display[k]]; //输入段选
discan=scan_con[k]; //位扫描
if(++k>=8)
k=0;
}
/*********************************************************************
//函数名称:tm0_init()
//函数功能:定时器0的初始设置
//入口参数:无
//返回参数:无
*********************************************************************/
void tm0_init(void) //2毫秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x30; //设置定时初值
TH0 = 0xF8; //设置定时初值
ET0 = 1;
EA = 1;
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
/*********************************************************************
//函数名称:receive_byte()
//函数功能:接受DHT11的8位数据
//入口参数:无
//返回参数:value
*********************************************************************/
uchar receive_byte(void)
{
uchar i,value=0;
uchar flag; //超时标志
for(i=0;i<8;i++)
{
value<<=1;
flag = 2;
while(!(DQ) && (flag++)) ; //等待低电平结束
if(flag==1){break;}
delay(20); //延时20us
if(DQ){value |=0x01;} //还处于高电平,输出为1
flag = 2;
while((DQ) && (flag++)) ; //等待高电平结束
}
return value;
}
/*********************************************************************
//函数名称:receive_data()
//函数功能:接受40位数据,并校验和处理
//入口参数:无
//返回参数:无
*********************************************************************/
void receive_data(void)
{
uchar R_H,R_L,T_H,T_L,R_T;
uchar flag=0;
/*********起始信号********/
DQ = 0;
delay20ms(); //>18ms
DQ = 1;
delay(20); //延时20us
/********读取数据***********/
if(!(DQ))
{
flag = 2;
while(!(DQ) && (flag++)) ; //等待低电平结束
flag = 2;
while((DQ) && (flag++)) ; //等待高电平结束
R_H = receive_byte();
R_L = receive_byte();
T_H = receive_byte();
T_L = receive_byte();
R_T = receive_byte();
DQ = 1; //拉高释放总线
if((R_H+R_L)==R_T)
{
RH=R_H;
TH=T_H;
display[0]=RH/10; //读取湿度的十位
display[1]=RH%10; //读取湿度的个位
display[4]=TH/10; //读取温度的十位
display[5]=TH%10; //读取温度的个位
}
}
}
/*********************************************************************
//函数名称:tm0_isr()
//函数功能:数码管的扫描显示
//入口参数:无
//返回参数:无
*********************************************************************/
void tm0_isr() interrupt 1
{
display_data();
}
/***********主函数**********/
void main()
{
P0M1 = 0x00;
P0M0 = 0xFF; //P0的推挽输出
tm0_init(); //定时器0初始化
receive_data();
while(1)
{
receive_data(); //接受数据
}
}
复制代码
作者:
lucky80204
时间:
2014-8-11 16:29
#include <reg51.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define disdata P0 //数码管段输入口
#define discan P2 //数码管位输入口
sfr AUXR = 0x8E; //特殊寄存器的地址
sfr P0M1 = 0x93;
sfr P0M0 = 0x94; //P0端口推挽输出设置地址
sbit DQ = P1^7; //DHT11的输入输出端口
/***********温湿度的整数位*******************/
uchar code dis_7[]=
{
0x3f, //"0"的字形表,0B00111111
0x06, //"1"的字形表,0B00000110
0x5B, //"2"的字形表,0B01011011
0x4f, //"3"的字形表,0B01001111
0x66, //"4"的字形表,0B01100110
0x6D, //"5"的字形表,0B01101101
0x7D, //"6"的字形表,0B01111101
0x07, //"7"的字形表,0B00000111
0x7F, //"8"的字形表,0B01111111
0x6F, //"9"的字形表,0B01101111
0x00, // 全灭消隐
0x40, //"-"的字形表,0B01000000
};
uchar code scan_con[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //列扫描控制字
uchar data display[]={0x00,0x00,0x0A,0x0A,0x00,0x00,0x0A,0x0A}; //存取缓存区
uchar RH=5,TH=5; //温湿度的整数存取
/***********************************************************************
//函数名称:delay(uint t)
//函数功能:延时程序 1*t us 系统时钟工作在12MHZ下,机器周期为1/12 us
_nop_()运行所需要时间为1个机器周期。do while函数占1个机器周期
t--占1个机器周期,10个_nop_()占10机器周期,共占12个机器周期
//入口参数:所要延时的时间 t t=n 就延时n us
//返回参数:无
***********************************************************************/
void delay(uint t)
{
do{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();
}while(t--);
}
/*********************************************************************
//函数名称:delay20ms()
//函数功能:软件延时20ms
//入口参数:无
//返回参数:无
*********************************************************************/
void delay20ms() //@12.000MHz
{
int j,k;
for(j=400;j>0;j--)
for(k=600;k>0;k--);
}
/*********************************************************************
//函数名称:display_data()
//函数功能:数码管显示温湿度
//入口参数:无
//返回参数:无
*********************************************************************/
void display_data(void)
{
static char k;
disdata=dis_7[display[k]]; //输入段选
discan=scan_con[k]; //位扫描
if(++k>=8)
k=0;
}
/*********************************************************************
//函数名称:tm0_init()
//函数功能:定时器0的初始设置
//入口参数:无
//返回参数:无
*********************************************************************/
void tm0_init(void) //2毫秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x30; //设置定时初值
TH0 = 0xF8; //设置定时初值
ET0 = 1;
EA = 1;
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
/*********************************************************************
//函数名称:receive_byte()
//函数功能:接受DHT11的8位数据
//入口参数:无
//返回参数:value
*********************************************************************/
uchar receive_byte(void) //接收一个字节
{
uchar i,value=0;
uchar flag; //超时标志
for(i = 0;i<8;i++)
{
value<<=1;
flag=2;
while(!(DQ)&&(flag++)) ; //等待低电平结束
if(flag==1){break;} //超时跳出
delay(20);
if(DQ){value|=0x01;} //等待高电平结束
flag=2;
while((DQ)&&(flag++)) ;
}
return value;
}
/*********************************************************************
//函数名称:receive_data()
//函数功能:接受40位数据,并校验和处理
//入口参数:无
//返回参数:无
*********************************************************************/
void receive_data(void)//接收数据
{
uchar T_H,T_L,R_H,R_L,R_T;
uchar flag=0;
/*************起始信号************/
DQ=0;
delay20ms(); //>18ms
DQ=1;
delay(20);
/*************读取数据************/
if(!(DQ)) //读取DHT11响应信号
{
flag=2;
while(!(DQ)&&(flag++)) ; //等待DHT11低电平结束
flag=2;
while((DQ)&&(flag++)) ; //等待DHT11高电平结束
R_H = receive_byte();
R_L = receive_byte();
T_H = receive_byte();
T_L = receive_byte();
R_T = receive_byte();
DQ=1; //拉高释放总线
if((R_H+T_H) == R_T)
{
RH = R_H;
TH = T_H;
display[0]=RH/10 ;
display[1]=RH%10;
display[4]=TH/10;
display[5]=TH%10;
}
}
}
/*********************************************************************
//函数名称:tm0_isr()
//函数功能:数码管的扫描显示
//入口参数:无
//返回参数:无
*********************************************************************/
void tm0_isr() interrupt 1
{
display_data();
}
/***********主函数**********/
void main()
{
P0M1 = 0x00;
P0M0 = 0xFF; //P0的推挽输出
tm0_init(); //定时器0初始化
receive_data();
while(1)
{
receive_data(); //接受数据
}
}
复制代码
作者:
lucky80204
时间:
2014-8-11 16:30
战友们。。。找茬呢。。。帮我找找回复帖和楼主贴的区别。。。为什么回复帖行。。楼主贴不行
欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/)
Powered by Discuz! X3.4