- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit sda = P2^1; /*一線串口發送引腳 */
- sbit RS = P1^1;
- sbit RW = P1^2;
- sbit E = P1^3;
- sbit RST = P1^4;
- sbit PSB = P1^5;
- sbit GZJC = P1^6;
- sbit LED1 = P1^7;
- sbit TRH = P2^0; //THD11接口
- char str1[]={" "};
- char str2[]={" "};
- int TH_temp,TL_temp,RH_temp,RL_temp,CK_temp,respond,com_data,temp;
- uchar i,j;
- unsigned char num1 = 1;
- unsigned char num2 = 1;
- void Car_toon(); //開機動畫
- void LCD_BusyCheck();//檢忙
- void LCD_WCMD(unsigned char cmd);//寫屏幕指令
- void LCD_WDAT(unsigned char dat);//字庫--字符
- void LCD_SetPos(unsigned char x,unsigned char y); //屏幕定位
- void LCD_HZ(unsigned char *s);//漢字
- void DHT11_receive();
- char DHT11_rec_byte();
- void delay(int ms);
- void Delay1us(int T);
- void SendData ( unsigned addr )
- {
- unsigned i;
- EA = 0;/*發送時關掉中斷,防止中斷影響時序 */
- sda = 1;/*開始拉搞 */
- Delay1us ( 1000 );
- sda = 0;/*開始引導碼*/
- Delay1us ( 2200 );/*此處延時最少要大于2ms,此參數延時為310ms */
- for ( i = 0; i < 8; i++ ) /*總共8位數據 */
- {
- sda = 1;
- if ( addr & 0x01 ) /*3:1表示數據位1,每個位用兩個脈沖表示 */
- {
- Delay1us ( 500 );
- sda = 0;
- Delay1us ( 210 );
- }
- else /*1:3表示數據位0 ,每個位用兩個脈沖表示 */
- {
- Delay1us ( 210 );
- sda = 0;
- Delay1us ( 500 );
- }
- addr >>= 1;
- }
- sda = 1;
- EA = 1;
- }
- void Delay1us(int T)
- {
- while(T--);
- }
- void main()
- {
- RST = 1;
- PSB = 1;
- GZJC = 1;
- LED1 = 0;
- Car_toon();
-
-
- LCD_WCMD(0X30); //基本指令
- LCD_WCMD(0X0c); //打開顯示
- LCD_WCMD(0X01); //清屏
-
- LCD_SetPos(0,0);
- LCD_HZ("光照:");
-
- LCD_SetPos(1,0);
- LCD_HZ("溫濕度:");
-
- LCD_SetPos(2,0);
- LCD_HZ("照明系統:");
-
- LCD_SetPos(3,0);
- LCD_HZ("通風系統:");
-
- DHT11_receive();
-
- while(1)
- {
- DHT11_receive();
- LCD_SetPos(1,4);
- LCD_WDAT(str2[0]);
- LCD_WDAT(str2[1]);
-
- LCD_SetPos(1,6);
- LCD_WDAT(str1[0]);
- LCD_WDAT(str1[1]);
- if( ((TH_temp/10)*10+(TH_temp%10)) > 27)
- {
- SendData(0x0a);
- SendData(0x03);
- SendData(0x0b);
- delay(15000);
- }
-
- if(GZJC == 1)
- {
- num1 = 1;
- LCD_SetPos(2,5);
- LCD_HZ("開");
-
-
- LCD_SetPos(0,3);
- LCD_HZ("弱");
- LED1 = 1;
- if(num2==1) //一線串口語音
- {
- SendData(0x0a);
- SendData(0x01);
- SendData(0x0b);
- delay(12000);
- num1=1;
- num2=0;
- }
- }
- else
- {
-
- LCD_SetPos(2,5);
- LCD_HZ("關");
-
- LCD_SetPos(0,3);
- LCD_HZ("強");
- LED1 = 0;
- if(num1==1) //一線串口語音
- {
- SendData(0x0a);
- SendData(0x02);
- SendData(0x0b);
- delay(12000);
- num2=1;
- num1=0;
- }
-
-
-
-
- }
-
- }
- }
- void Car_toon() //開機動畫
- {
- LCD_SetPos(0,1);
- LCD_HZ("學院技能大賽");
-
- LCD_SetPos(1,1);
- LCD_HZ("智能控制系統");
-
- LCD_WCMD(0x34); //切換到擴展指令
- LCD_WCMD(0x03); //允許輸入滾動地址
-
- delay(5000); //1秒
-
- for(i=0x40;i<0x60;i++)
- {
- LCD_WCMD(i); //滾動內容
- delay(1000); //1秒
- }
- }
- void LCD_BusyCheck() //檢測是否繁忙
- {
- unsigned char temp;
- P0 = 0xFF;
- RS = 0;
- RW = 1;
- while(1)
- {
- E = 1;
- temp = P0;
- E = 0;
- if((temp & 0x80) == 0)
- break;
- }
- }
- void LCD_WCMD(unsigned char cmd)
- {
- LCD_BusyCheck();
- RS = 0;
- RW = 0;
- P0 = cmd;
- E = 1;
- E = 0;
- }
- void LCD_WDAT(unsigned char dat)//寫數據
- {
- LCD_BusyCheck();
- RS = 1;
- RW = 0;
- P0 = dat;
- E = 1;
- E = 0;
- }
- void LCD_SetPos(unsigned char x,unsigned char y) //定位
- {
- unsigned char pos;
- switch(x)
- {
- case 0 : x = 0x80;break;
- case 1 : x = 0x90;break;
- case 2 : x = 0x88;break;
- case 3 : x = 0x98;break;
- default:break;
- }
- pos = x+y; //x范圍:0~3,y范圍:0~7
- LCD_WCMD(pos);
- }
- void LCD_HZ(unsigned char *s)
- {
- while(*s)
- LCD_WDAT(*s++);
- }
- /*---------DHT11所用延時----------*/
- void Delay10u()
- {
- unsigned char i;
- _nop_();
- _nop_();
- _nop_();
- i = 24;
- while (--i);
- }
- void Delay18ms() //@11.0592MHz
- {
- unsigned char i, j, k;
- _nop_();
- _nop_();
- i = 1;
- j = 194;
- k = 159;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- /*---------開機動畫所用延時----------*/
- void delay(int ms)
- {
- while(ms--)
- {
- for(j=0;j<120;j++);
- }
- }
- char DHT11_rec_byte()
- {
- char i;
- com_data=0;
- for(i=0;i<=7;i++)
- {
- respond=2;
- while((!TRH)&&respond++);
- Delay10u();
- Delay10u();
- Delay10u();
- if(TRH)
- {
- temp=1;
- respond=2;
- while((TRH)&&respond++);
- }
- else
- temp=0;
- com_data<<=1;
- com_data|=temp;
- }
- return(com_data);
- }
- /****************************************************************************/
- //溫濕度讀取子程序
- //溫度高8位== TH_data
- //溫度低8位== TL_data
- //濕度高8位== RH_data
- //濕度低8位== RL_data
- //校驗 8位 == CK_data
- //調用的程序有 delay();, Delay_5us();,RECEIVE();
- /***************************************************************************/
- void DHT11_receive()
- {
- //主機拉低18ms
- TRH=0;
- Delay18ms();
- TRH=1;
- //DATA總線由上拉電阻拉高 主機延時50us
- Delay10u();
- Delay10u();
- //delay_us();delay_us();delay_us();delay_us();
- //主機設為輸入 判斷從機響應信號
- TRH=1;
- //判斷DHT11是否有低電平響應信號 如不響應則跳出,響應則向下運行
- if(!TRH)
- {
- respond=2;
- //判斷DHT11發出 80us 的低電平響應信號是否結束
- while((!TRH)&& respond++);
- respond=2;
- //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
- while(TRH && respond++);
- //數據接收狀態
- RH_temp = DHT11_rec_byte();
- RL_temp = DHT11_rec_byte();
- TH_temp = DHT11_rec_byte();
- TL_temp = DHT11_rec_byte();
- CK_temp = DHT11_rec_byte();
- TRH=1; //數據校驗
- }
- //濕度整數部分
- str1[0] = (char)(0X30+RH_temp/10);
- str1[1] = (char)(0X30+RH_temp%10);
- //溫度整數部分
- str2[0] = (char)(0X30+TH_temp/10);
- str2[1] = (char)(0X30+TH_temp%10);
- }
復制代碼 |