- #include<REG52.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit DATA=P1^0;//dht11data端接單片機的P1^0口//
- #define LCD_data P0 //數據口
- sbit LCD_RS = P3^5; //寄存器選擇輸入
- sbit LCD_RW = P3^6; //液晶讀/寫控制
- sbit LCD_EN = P3^4; //液晶使能控制
- sbit LCD_PSB = P3^7; //串/并方式控制
- /*定義數字ascii編碼*/
- unsigned char mun_char_table[]={"0123456789"};
- uchar code dis1[] = {"溫度:"};
- uchar code dis2[] = {"濕度:"};
- uchar RHL,RHH,CL,CH;
- uint m,n;
- //很正要的延時
- void delayus(uchar n)
- {
- while(n--);
- }
- //很正要的延時
- void Delay10ms(void)//12M晶振下延時
- {
- uchar a,b;
- for(b=249;b>0;b--)
- for(a=17;a>0;a--);
- }
- //粗延時
- void delay_ms(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=614;y>0;y--);
- }
- //起始
- void Start(void)
- {
- DATA=1;
- delay_ms(10);
- DATA=0;
- Delay10ms(); //主機把總線拉低必須大于
- //18msDHT11能檢測到起始信號
- Delay10ms();
- Delay10ms();
- DATA=1;
- delay_ms(1);
- }
- uint integer(uchar x)
- {
- uchar h,l;
- uint n;
- l=x&0x0f;
- h=(x&0xf0)>>4;
- n=h*16+l;
- return n;
- }
- uchar readdht11_byte()
- {
- uchar i,dht;
- for(i=8;i>0;i--)
- {
- dht=dht<<1;
- while(!DATA); //等待50ms
- delayus(30); //延時29us
- if(DATA==1)
- {
- dht=dht|0x01;
- delayus(60);
- }
- else
- delayus(30); //延時29us
- }
- return(dht);
- }
- void read_dht11()
- {
- Start();
- DATA=0; //數據線拉低>18ms
- delay_ms(20); //延時>18ms
- DATA=1; //拉高等待
- delayus(30); //延時29us
- DATA=1;
- if(!DATA)
- {
- while(!DATA);//
- while(DATA);
- RHH=readdht11_byte();//濕度整數數據
- RHL=readdht11_byte();//濕度小數數據
- CH=readdht11_byte();//溫度整數數據
- CL=readdht11_byte();//溫度小數數據
- }
- }
- //////////////以下是LCD12864驅動程序////////////////
-
- /*******************************************************************/
- /* */
- /*檢查LCD忙狀態 */
- /*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數據。 */
- /* */
- /*******************************************************************/
- bit lcd_busy()
- {
- bit result;
- P0=0X00; //關掉數碼管的信號。阻止數碼管受到P0口信號的影響
- LCD_RS = 0;
- LCD_RW = 1;
- LCD_EN = 1;
- delay_ms(1);
- result = (bit)(P0&0x80);
- LCD_EN = 0;
- return(result);
- }
- /*******************************************************************/
- /* */
- /*寫指令數據到LCD */
- /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。 */
- /* */
- /*******************************************************************/
- void lcd_wcmd(uchar cmd)
- {
- while(lcd_busy());
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_EN = 0;
- _nop_();
- _nop_();
- P0 = cmd;
- delay_ms(1);
- LCD_EN = 1;
- delay_ms(1);
- LCD_EN = 0;
- }
- /*******************************************************************/
- /* */
- /*寫顯示數據到LCD */
- /*RS=H,RW=L,E=高脈沖,D0-D7=數據。 */
- /* */
- /*******************************************************************/
- void lcd_wdat(uchar dat)
- {
- while(lcd_busy());
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_EN = 0;
- P0 = dat;
- delay_ms(1);
- LCD_EN = 1;
- delay_ms(1);
- LCD_EN = 0;
- }
- /*******************************************************************/
- /* */
- /* LCD初始化設定 */
- /* */
- /*******************************************************************/
- void lcd_init()
- {
- LCD_PSB = 1; //并口方式
- lcd_wcmd(0x34); //擴充指令操作
- delay_ms(5);
- lcd_wcmd(0x30); //基本指令操作
- delay_ms(5);
- lcd_wcmd(0x0C); //顯示開,關光標
- delay_ms(5);
- lcd_wcmd(0x01); //清除LCD的顯示內容
- delay_ms(5);
- }
- /*********************************************************/
- /* */
- /* 設定顯示位置 */
- /* */
- /*********************************************************/
- void lcd_pos(uchar X,uchar Y)
- {
- uchar pos;
- if (X==0)
- {X=0x80;}
- else if (X==1)
- {X=0x90;}
- else if (X==2)
- {X=0x88;}
- else if (X==3)
- {X=0x98;}
- pos = X+Y ;
- lcd_wcmd(pos); //顯示地址
- }
- //////////////////以上是LCD12864驅動程序////////////////
- void main()//主函數模塊//
- {
- uchar i=0;
- lcd_init();
- delay_ms(1500);
- lcd_pos(0,0); //設置顯示位置為第一行的第1個字符
- i = 0;
- while(dis1[i] != '\0')
- { //顯示字符
- lcd_wdat(dis1[i]);
- i++;
- }
- lcd_pos(1,0); //設置顯示位置為第一行的第1個字符
- i = 0;
- while(dis2[i] != '\0')
- { //顯示字符
- lcd_wdat(dis2[i]);
- i++;
- }
- while(1)
- {
- delay_ms(1500);
- read_dht11();
- m=integer(RHH);
- delay_ms(1);
- n=integer(CH);
- lcd_pos(0,3);
- lcd_wdat(mun_char_table[n/10]);
- lcd_wdat(mun_char_table[n%10]);
- lcd_pos(1,3);
- lcd_wdat(mun_char_table[m/10]);
- lcd_wdat(mun_char_table[m%10]);
- }
- }
復制代碼 |