|
板凳
楼主 |
发表于 2014-8-11 16:29:13
|
只看该作者
- #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(); //接受数据
- }
- }
复制代码 |
|