单片机源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define Data P0 //数据端口
- sbit RS=P2^4;
- sbit RW=P2^5;
- sbit E=P2^6;
- sbit DHT=P1^0;
- uchar FirstLine[] ="wen:00.00"; //第一行数据
- uchar SecondLine[]="shi:00.00"; //第二行数据
- unsigned char shiZ,shiX,wenZ,wenX,check;
- unsigned char tr_shiZ,tr_shiX,tr_wenZ,tr_wenX;
- unsigned char flag;
- unsigned int n=20,m;
- void delay_1ms(unsigned int i)
- {
- unsigned int j=88;
- for(;i>0;i--)
- {
- while(j>0)j--;
- }
- }
- void delay_10us()
- {
- unsigned char i;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- }
- /******************************************/
- /*************温湿度读取函数***************/
- /******************************************/
- char read_data()
- {
- unsigned char i,num,temp;
- num=0;
- for(i=0;i<8;i++)
- {
- flag=2;
- while((!DHT)&&flag++);
- delay_10us();
- delay_10us();
- delay_10us();
- if(DHT==1)
- {
- temp=1;
- flag=2;
- while(DHT&&flag++);
- }
- else
- temp=0;
- num<<=1;
- num|=temp;
- }
- return(num);
- }
- void delay(uchar ms) // 延时函数ms毫秒
- {
- uchar i,j;
- for(i=ms;i>0;i--)
- for(j=100;j>0;j--);
- }
- void DelayUs(unsigned char us) //--延时函数
- {
- unsigned char uscnt;
- uscnt=us>>1; /*12MHz频率*/
- while(--uscnt);
- }
- void DelayMs(unsigned char ms)
- {
- while(--ms)
- {
- DelayUs(250);
- DelayUs(250);
- DelayUs(250);
- DelayUs(250);
- }
- }
- void lcd_write_com(uchar c) //写命令
- {
- DelayMs(5);//操作前短暂延时,保证信号稳定
- E=0;
- RS=0;
- RW=0;
- _nop_();
- E=1;
- Data=c;
- E=0;
- }
- void lcd_write_dat(uchar c) //写数据
- {
- DelayMs(5); //操作前短暂延时,保证信号稳定
- E=0;
- RS=1;
- RW=0;
- _nop_();
- E=1;
- Data=c;
- E=0;
- RS=0;
- }
- void lcd_init() //LCD初始化
- {
- DelayMs(15);
- lcd_write_com(0x38); //display mode
- lcd_write_com(0x38); //display mode
- lcd_write_com(0x38); //display mode
- lcd_write_com(0x06); //显示光标移动位置
- lcd_write_com(0x0c); //显示开及光标设置
- lcd_write_com(0x01); //显示清屏
- }
- void ShowChar(uchar pos,uchar c) //显示单个字符
- {
- unsigned char p;
- if (pos>=0x10)
- p=pos+0xb0; //是第二行则命令代码高4位为0xc
- else
- p=pos+0x80; //是第二行则命令代码高4位为0x8
- lcd_write_com(p);//写命令
- lcd_write_dat(c); //写数据
- }
- void ShowString (uchar line,char *ptr) //显示字符串
- {
- unsigned char l,*p;
- p=ptr;
- l=line<<4;
- while((*p)!='\0')
- {
- ShowChar(l++,*(p));
- p++;
- }
- }
- void disp(void) //主函数调用的显示函数
- {
- ShowString(0,FirstLine);
- ShowString(1,SecondLine);
- }
- /******************************************/
- /************初始化及采集程序**************/
- /******************************************/
- void read_init()
- {
- DHT=0; //主机使DHT11低电平并延时至少18ms
- delay_1ms(21);
- DHT=1; //主机置DHT11高电平20~40us,并等待从机相应
- delay_10us();
- delay_10us();
- delay_10us();
- delay_10us();
- DHT=1;
- if(!DHT) //从机发出相应信号
- {
- flag=2;
- while((!DHT)&&flag++);
- flag=2;
- while(DHT&&flag++); //开始采集数据
- tr_shiZ=read_data();//采集湿度整数部分
- tr_shiX=read_data();//采集湿度小数部分
- tr_wenZ=read_data();//采集温度整数部分
- tr_wenX=read_data();//采集温度小数部分
- check=read_data(); //采集校验位
- DHT=1;
- }
- }
- void main()
- {
- unsigned char temp;
- lcd_init();
- delay(50);
- while(1)
- {
- disp();
- read_init();
- temp=tr_shiZ+tr_shiX+tr_wenZ+tr_wenX;
- if(check==temp)
- {
- shiZ=tr_shiZ;
- shiX=tr_shiX;
- wenZ=tr_wenZ;
- wenX=tr_wenX;
- }
- FirstLine[4]='0'+wenZ/10;
- FirstLine[5]='0'+wenZ%10;
- FirstLine[8]='0'+wenX/10;
- FirstLine[9]='0'+wenX%10;
- SecondLine[4]='0'+shiZ/10;
- SecondLine[5]='0'+shiZ%10;
- SecondLine[8]='0'+shiX/10;
- SecondLine[9]='0'+shiX%10;
- }
- }
复制代码
以上代码51hei提供下载:
DHT11测温湿度程序lcd1602显示代码.doc
(34.5 KB, 下载次数: 93)
|