//首先謝謝您的解答
//改用DHT11溫濕度傳感器后,聽了您的建議更改了程序
//由于我的知識儲備不夠出現了一下問題,電機可以調速,但是LCD屏幕還是不顯示DHT11溫濕度傳感器的數據,希望您撥冗幫助
程序如下
- #include <reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
- #include <intrins.h>
- #include <math.h>
- #define uchar unsigned char
- #define uint unsigned int
- unsigned int i;
- unsigned char pwm_motor_val =0;//左右電機占空比值 取值范圍0-170,0最快
- unsigned char pwm_t;//周期
- sbit led=P1^0;
- sbit _4IN = P2^4;//
- sbit key_s2 = P3^0;
- sbit key_s3 = P3^1;
- sbit RS = P3^5; //定義端口
- sbit RW = P3^6;
- sbit EN = P3^4;
- sbit DU = P2^0;
- sbit WE = P2^1;
-
- sbit Data = P3^7;//定義數據線
- uchar rec_dat[15]; //用于顯示的接收數據數組
-
- #define RS_CLR RS=0
- #define RS_SET RS=1
-
- #define RW_CLR RW=0
- #define RW_SET RW=1
-
- #define EN_CLR EN=0
- #define EN_SET EN=1
-
- #define DataPort P0
- void delay(unsigned int z)//毫秒級延時
- {
- unsigned int x,y;
- for(x = z; x > 0; x--)
- for(y = 114; y > 0 ; y--);
- }
-
- void cmg88()//關數碼管,點陣函數
- {
- DU=1;
- P0=0X00;
- DU=0;
- }
- /*------------------------------------------------
- uS延時函數,含有輸入參數 unsigned char t,無返回值
- unsigned char 是定義無符號字符變量,其值的范圍是
- 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
- 長度如下 T=tx2+5 uS
- ------------------------------------------------*/
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- /*------------------------------------------------
- mS延時函數,含有輸入參數 unsigned char t,無返回值
- unsigned char 是定義無符號字符變量,其值的范圍是
- 0~255 這里使用晶振12M,精確延時請使用匯編
- ------------------------------------------------*/
- void DelayMs(unsigned char t)
- {
-
- while(t--)
- {
- //大致延時1mS
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
- /*------------------------------------------------
- 判忙函數
- ------------------------------------------------*/
- bit LCD_Check_Busy(void)
- {
- DataPort= 0xFF;
- RS_CLR;
- RW_SET;
- EN_CLR;
- _nop_();
- EN_SET;
- return (bit)(DataPort & 0x80);
- }
- /*------------------------------------------------
- 寫入命令函數
- ------------------------------------------------*/
- void LCD_Write_Com(unsigned char com)
- {
- while(LCD_Check_Busy()); //忙則等待
- RS_CLR;
- RW_CLR;
- EN_SET;
- DataPort= com;
- _nop_();
- EN_CLR;
- }
- /*------------------------------------------------
- 寫入數據函數
- ------------------------------------------------*/
- void LCD_Write_Data(unsigned char Data)
- {
- while(LCD_Check_Busy()); //忙則等待
- RS_SET;
- RW_CLR;
- EN_SET;
- DataPort= Data;
- _nop_();
- EN_CLR;
- }
-
- /*------------------------------------------------
- 清屏函數
- ------------------------------------------------*/
- void LCD_Clear(void)
- {
- LCD_Write_Com(0x01);
- DelayMs(5);
- }
- /*------------------------------------------------
- 寫入字符串函數
- ------------------------------------------------*/
- void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
- {
- if (y == 0)
- {
- LCD_Write_Com(0x80 + x); //表示第一行
- }
- else
- {
- LCD_Write_Com(0xC0 + x); //表示第二行
- }
- while (*s)
- {
- LCD_Write_Data( *s);
- s ++;
- }
- }
- /*------------------------------------------------
- 寫入字符函數
- ------------------------------------------------*/
- void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
- {
- if (y == 0)
- {
- LCD_Write_Com(0x80 + x);
- }
- else
- {
- LCD_Write_Com(0xC0 + x);
- }
- LCD_Write_Data( Data);
- }
- /*------------------------------------------------
- 初始化函數
- ------------------------------------------------*/
- void LCD_Init(void)
- {
- LCD_Write_Com(0x38); /*顯示模式設置*/
- DelayMs(5);
- LCD_Write_Com(0x38);
- DelayMs(5);
- LCD_Write_Com(0x38);
- DelayMs(5);
- LCD_Write_Com(0x38);
- LCD_Write_Com(0x08); /*顯示關閉*/
- LCD_Write_Com(0x01); /*顯示清屏*/
- LCD_Write_Com(0x06); /*顯示光標移動設置*/
- DelayMs(5);
- LCD_Write_Com(0x0C); /*顯示開及光標設置*/
- }
-
-
- /*------------------------------------------------
- DHT11延時函數
- ------------------------------------------------*/
- void DHT11_delay_us(uchar n)
- {
- while(--n);
- }
-
- void DHT11_delay_ms(uint z)
- {
- uint i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- /*------------------------------------------------
- DHT11開始信號
- ------------------------------------------------*/
- void DHT11_start()
- {
- Data=1;
- DHT11_delay_us(2);
- Data=0;
- DHT11_delay_ms(20); //延時18ms以上
- Data=1;
- DHT11_delay_us(30);
- }
- /*------------------------------------------------
- 接收八位二進制
- ------------------------------------------------*/
- uchar DHT11_rec_byte() //接收一個字節
- {
- uchar i,dat=0;
- for(i=0;i<8;i++) //從高到低依次接收8位數據
- {
- while(!Data); //等待50us低電平過去
- DHT11_delay_us(8); //延時60us,如果還為高則數據為1,否則為0
- dat<<=1; //移位使正確接收8位數據,數據為0時直接移位
- if(Data==1) //數據為1時,使dat加1來接收數據1
- dat+=1;
- while(Data); //等待數據線拉低
- }
- return dat;
- }
- /*------------------------------------------------
- 接收40bit數據
- ------------------------------------------------*/
- void DHT11_receive() //接收40位的數據
- {
- uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
- DHT11_start();
-
- if(Data==0)
- {
-
- while(Data==0); //等待拉高
-
- DHT11_delay_us(40); //拉高后延時80us
- R_H=DHT11_rec_byte(); //接收濕度高八位
- R_L=DHT11_rec_byte(); //接收濕度低八位
- T_H=DHT11_rec_byte(); //接收溫度高八位
- T_L=DHT11_rec_byte(); //接收溫度低八位
- revise=DHT11_rec_byte(); //接收校正位
-
- DHT11_delay_us(25); //結束
-
- if((R_H+R_L+T_H+T_L)==revise) //校正
- {
- RH=R_H;
- RL=R_L;
- TH=T_H;
- TL=T_L;
- }
- /*數據處理,方便顯示*/
- rec_dat[0]='0'+(RH/10);
- rec_dat[1]='0'+(RH%10);
- rec_dat[2] =' ';
- rec_dat[3] = 'R' ;
- rec_dat[4] = 'H';
- rec_dat[5]=' ';
- rec_dat[6]=' ';
- rec_dat[7]=' ';
- rec_dat[8]=' ';
- rec_dat[9]='0'+(TH/10);
- rec_dat[10]='0'+(TH%10);
- rec_dat[11] =' ';
- rec_dat[12] = 'C';
- rec_dat[13] = ' ' ;
- rec_dat[14]=' ';
- }
- }
- void timer0() interrupt 1
- {
-
- TH0 = 220;
- TL0 = 220;//11.0592M晶振下占空比最大比值是256,輸出100HZ
- pwm_t=pwm_t+1;
- if(pwm_t == 255)
- { _4IN = 0;
- led=1; }
- if(pwm_motor_val == pwm_t)
- {_4IN = 1;
- led=0; }
-
- }
-
- /*------------------------------------------------
- 主函數
- ------------------------------------------------*/
- void main(void)
- {
- uint i;
- cmg88();//關數碼管,點陣函數
-
- LCD_Init();
- LCD_Clear();//清屏
- DHT11_delay_ms(1500); //DHT11上電后要等待1S以越過不穩定狀態在此期間不能發送任何指令
- TMOD = 0x02;//8位自動重裝模塊
- // TH0 = 220;
- // TL0 = 220;//11.0592M晶振下占空比最大比值是256,輸出100HZ
- EA = 1;//總中斷允許
- TR0 = 1;//啟動定時器0
- ET0 = 1;//允許定時器0中斷
- while (1)
- {
- DHT11_receive();
-
-
- for(i=0;i<15;i++)
- {
- LCD_Write_Char(i,1,rec_dat[i]);
- }
- //LCD_Write_Char(0,0,'T');
- //LCD_Write_Char(0,1,'H');
- //LCD_Write_String(0,1,"HELLO");
- if(key_s3 == 0) //S2按下LED變暗
- {
- delay(5);
- if(key_s3 == 0)
- {
- if(pwm_motor_val < 170)
- {
- pwm_motor_val=pwm_motor_val+10;
- }
- }
- }
- if(key_s2 == 0) //S3按鍵LED變亮
- {
- delay(5);
- if(key_s2 == 0)
- {
- if(pwm_motor_val > 0)
- {
- pwm_motor_val=pwm_motor_val-10;
- }
- }
- }
-
- }
- }
復制代碼
|