欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STC12c5A60s2單片機DHT11+LCD12864+JQ8400語音播報環(huán)境檢測程序
[打印本頁]
作者:
2545010433
時間:
2021-10-26 12:55
標題:
STC12c5A60s2單片機DHT11+LCD12864+JQ8400語音播報環(huán)境檢測程序
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit sda = P2^1; /*一線串口發(fā)送引腳 */
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;/*發(fā)送時關(guān)掉中斷,防止中斷影響時序 */
sda = 1;/*開始拉搞 */
Delay1us ( 1000 );
sda = 0;/*開始引導(dǎo)碼*/
Delay1us ( 2200 );/*此處延時最少要大于2ms,此參數(shù)延時為310ms */
for ( i = 0; i < 8; i++ ) /*總共8位數(shù)據(jù) */
{
sda = 1;
if ( addr & 0x01 ) /*3:1表示數(shù)據(jù)位1,每個位用兩個脈沖表示 */
{
Delay1us ( 500 );
sda = 0;
Delay1us ( 210 );
}
else /*1:3表示數(shù)據(jù)位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("照明系統(tǒng):");
LCD_SetPos(3,0);
LCD_HZ("通風系統(tǒng):");
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("關(guān)");
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("學(xué)院技能大賽");
LCD_SetPos(1,1);
LCD_HZ("智能控制系統(tǒng)");
LCD_WCMD(0x34); //切換到擴展指令
LCD_WCMD(0x03); //允許輸入滾動地址
delay(5000); //1秒
for(i=0x40;i<0x60;i++)
{
LCD_WCMD(i); //滾動內(nè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)//寫數(shù)據(jù)
{
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
//調(diào)用的程序有 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();
//主機設(shè)為輸入 判斷從機響應(yīng)信號
TRH=1;
//判斷DHT11是否有低電平響應(yīng)信號 如不響應(yīng)則跳出,響應(yīng)則向下運行
if(!TRH)
{
respond=2;
//判斷DHT11發(fā)出 80us 的低電平響應(yīng)信號是否結(jié)束
while((!TRH)&& respond++);
respond=2;
//判斷從機是否發(fā)出 80us 的高電平,如發(fā)出則進入數(shù)據(jù)接收狀態(tài)
while(TRH && respond++);
//數(shù)據(jù)接收狀態(tài)
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; //數(shù)據(jù)校驗
}
//濕度整數(shù)部分
str1[0] = (char)(0X30+RH_temp/10);
str1[1] = (char)(0X30+RH_temp%10);
//溫度整數(shù)部分
str2[0] = (char)(0X30+TH_temp/10);
str2[1] = (char)(0X30+TH_temp%10);
}
復(fù)制代碼
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1