?? cortrol.c
字號(hào):
else if(display_set_data<10000)
{B[0]=display_set_data%10;
B[1]=(display_set_data/10)%10;
B[2]=(display_set_data/100)%10;
B[3]=display_set_data/1000;
}
if(dis_set_flag==DC)
{B[0]=23;
B[1]=22;
B[2]=22;
B[3]=22;
B[4]=17;
}
for(i=0;i<5;i++)
{dp_data=DD[B[i]];
for(j=8;j>0;j--)
{ CLK=0;
if(dp_data&0x80)
Y=1;
else Y=0;
DATA0=Y;
CLK=1;
dp_data=dp_data<<1;
}
}
STB=0;
STB=1;
delay(2);
STB=0;
}
/******************************************定時(shí)器0中斷************************
***函數(shù)名稱(chēng): time0() ****
***函數(shù)功能: 定時(shí)檢測(cè)溫度,濕度,亮度并顯示 ****
*****************************************************************************/
void time0() interrupt 1
{
uchar key[4];
TH0 = 0xa5; // 每秒中斷100次
TL0 = 0x00; // 中斷周期: 10mS
Key_scan();
if(KeyNumber!=0xff)
{
// kb_data=KeyNumber;
key[kf++]=KeyNumber;
if(kf>3)
kf=0;
time_count=1;
KeyNumber=0xff;
}
else
{ if(time_count==1)
{kb_data=key[0];
keyboard_flag=0;
kf=0;
}
time_count=0;
}
// if(keyflag==0)
// {
if(f1==200)
{TH_F0=1;
f3=0;
TH_F2=0;
f2++;
keyflag=0;
}
if(f2==200)
{TH_F1=1;
TH_F0=0;
f1=0;
f3++;
}
if(f3==200)
{TH_F2=1;
f2=0;
TH_F1=0;
f1++;
if(keyflag==1)
TH_F2=0;
}
// }
// time_count++;
// LED=1;
if(serial_count>6)
{
RT_Flag=1;
}
}
/*****************************************************************************
/********************************鍵盤(pán)掃描中斷程序****************************
***函數(shù)名稱(chēng): Key_scan()
***函數(shù)功能: 鍵盤(pán)掃描
******************************************************************************/
/*void INTT1()interrupt 2
{
EX1=0;
// Key_scan();
// keyflag=0;
// keyboard_flag=0;
EX1=1;
} */
//*****************************鍵盤(pán)掃描函數(shù)*********************************************************
//*******函數(shù)名稱(chēng):Key_scan *********
//*******函數(shù)功能:掃描鍵盤(pán),并取得鍵值 *********
//*******修改參數(shù):KeyNumber *********
//**************************************************************************************************
void Key_scan()
{
uchar i,j,pin1;
for(i=0;i<4;i++)
{for(j=0;j<4;j++)
{P2=0XFF&(~(0X01<<(3-i)));
pin1=P2;
// delay1(10);
if(((pin1>>(4+j))&0x01)==0)
{KeyNumber=i+j*4;
}
}
}
// P2=0XF0;
// LED=0;
}
//****************************************************************************************************
//******************************************按鍵查詢處理函數(shù) ****************************************
//*******函數(shù)名稱(chēng):key_deal ******************
//*******函數(shù)功能:查詢按鍵,若是設(shè)置溫度,濕度鍵,就調(diào)用設(shè)置處理函數(shù) ******************
//****************************************************************************************************
void key_deal(void)
{
switch(kb_data)
{case 3: keycost_deal(TEMP);
break;
case 7: keycost_deal(HUMI);
break;
default: break;
}
}
//===================================================================================================
//==========================================按鍵處理函數(shù)=============================================
//********函數(shù)名稱(chēng):keycost_deal ******
//********函數(shù)功能:設(shè)置溫濕度控制參數(shù)值,處理,顯示 ******
//********入口參數(shù):TEMP,HUMI,溫濕度標(biāo)志 ******
//********出口參數(shù):無(wú) ******
//********修改參數(shù): L_Temp_set, H_Temp_set,L_Hum_set,H_Hum_set ******
//===================================================================================================
void keycost_deal(unsigned char TH_flag)
{ unsigned char KD1=0,KD2=0,KD3=0,keydata=0xff;
uchar i;
char DDC;
keyflag=1;
for(i=0;i<2;i++)
{ if(TH_flag==HUMI)
i=1;
DDC=1;
Display_set(0,i);
keyboard_flag=1;
while(keyboard_flag==1);
keydata=key_switch(kb_data);
if(kb_data==0x0D) //按下“-”號(hào)
{DDC=DDC*(-1);
Display_set(0,DC);
keyboard_flag=1;
// KeyNumber=0xff;
}
else if(kb_data==0x0E) //按下"返回"鍵
return;
//=======================第一次數(shù)字鍵============================================
while(keyboard_flag==1);
keydata=key_switch(kb_data);
if(keydata>=0&&keydata<=9)
{KD1=keydata;
Display_set((keydata*DDC),i);
}
else if(keydata==0x0E) //按下"返回"鍵
return;
else
{error_bell(); //蜂鳴器報(bào)錯(cuò)誤信號(hào)
return;
}
//=======================第二次數(shù)字鍵============================================
keyboard_flag=1;
while(keyboard_flag==1);
keydata=key_switch(kb_data);
if(keydata>=0&&keydata<=9)
{
Display_set(((KD1*10+keydata)*DDC),i);
// F++;
KD2=keydata;
// KeyNumber=0xff;
}
else if(kb_data==0x0F) //有“個(gè)”位時(shí)按下"確定"鍵
{if(i==0)
{if(TH_flag==TEMP)
{ L_Temp_set=KD1*DDC;
keydata=0xff;
// KeyNumber=0xff;
continue;
}
}
else if(i==1)
{if(TH_flag==TEMP)
{ H_Temp_set=KD1*DDC;
return;
}
if(TH_flag==HUMI)
{ H_Hum_set=KD1*DDC;
return;
}
}
}
else if(kb_data==0x0E) //按下"返回"鍵
return;
else
{error_bell(); //蜂鳴器報(bào)錯(cuò)誤信號(hào)
return;
}
//=======================第三次數(shù)字鍵============================================
keyboard_flag=1;
while(keyboard_flag==1);
keydata=key_switch(kb_data);
if(kb_data==0x0F) //有“十”位數(shù)據(jù)時(shí)按下"確定"鍵
{
if(i==0)
{
if(TH_flag==TEMP)
{
L_Temp_set=(KD1*10+KD2)*DDC;
keydata=0xff;
// KeyNumber=0xff;
continue;
}
}
else if(i==1)
{
if(TH_flag==TEMP)
{
H_Temp_set=(KD1*10+KD2)*DDC;
return;
}
if(TH_flag==HUMI)
{
H_Hum_set=(KD1*10+KD2)*DDC;
return;
}
}
}
else if(keydata>=0&&keydata<=9)
{ if(DDC==-1)
{error_bell();
return;
}
Display_set(((KD1*100+KD2*10+keydata)*DDC),i);
// F++;
KD3=keydata;
keyboard_flag=1;
// KeyNumber=0xff;
}
else if(kb_data==0x0E) //按下"返回"鍵
return;
else
{error_bell();
return;
}
keyboard_flag=1;
while(keyboard_flag==1);
if(kb_data==0x0F) //有“百”位數(shù)據(jù)時(shí)按下"確定"鍵
{if(i==0)
{if(TH_flag==TEMP)
{ L_Temp_set=(KD1*100+KD2*10+KD3)*DDC;
keydata=0xff;
// KeyNumber=0xff;
continue;
}
}
else if(i==1)
{if(TH_flag==TEMP)
{ H_Temp_set=(KD1*100+KD2*10+KD3)*DDC;
return;
}
if(TH_flag==HUMI)
{ H_Hum_set=(KD1*100+KD2*10+KD3)*DDC;
return;
}
}
}
else if(kb_data==0x0E) //按下"返回"鍵
return;
else
{error_bell(); //蜂鳴器報(bào)錯(cuò)誤信號(hào)
return;
}
}
}
//=================================================================================
//****************************鍵值轉(zhuǎn)換函數(shù)******************************************
//*****函數(shù)名稱(chēng):key_switch **********
//*****函數(shù)功能:把實(shí)際鍵值轉(zhuǎn)換成鍵盤(pán)上標(biāo)識(shí)的鍵值 **********
//**********************************************************************************
uchar key_switch(unsigned char key_d)
{unsigned char key_cost;
switch(key_d)
{case 0: key_cost=7;break;
case 1: key_cost=8;break;
case 2: key_cost=9;break;
case 3: key_cost=0x10;break;
case 4: key_cost=4;break;
case 5: key_cost=5;break;
case 6: key_cost=6;break;
case 7: key_cost=0x11;break;
case 8: key_cost=1;break;
case 9: key_cost=2;break;
case 0X0A: key_cost=3;break;
case 0X0B: key_cost=0X12;break;
case 0X0C: key_cost=0X00;break;
case 0X0D: key_cost=0X0D;break;
case 0X0E: key_cost=0X0E;break;
case 0X0F: key_cost=0X0F;break;
default: break;
}
return key_cost;
}
//=============================================================================================================//
//***************************************************************************************************
//******************************讀溫濕度數(shù)據(jù)*******************************************
//****函數(shù)功能:調(diào)用I2C讀寫(xiě)函數(shù)計(jì)算出溫濕度值 ****************
//****入口參數(shù):TEMP,HUMI,溫度標(biāo)志,濕度標(biāo)志 ****************
//****出口參數(shù):TH_value,測(cè)量溫度值,測(cè)量的濕度值 ****************
//***************************************************************************************************
signed int measure(unsigned char mode)
{ unsigned int TH_H,TH_L,sum;
unsigned int i;
signed int TH_value,rh_lin;
const float xdata T1=+0.01f; // for 14 Bit @ 5V
const float xdata T2=+0.00008f; // for 14 Bit @ 5V
float xdata t_C; // t_C : 溫度
s_transstart(); //傳輸開(kāi)始
switch(mode)
{case TEMP: error+=s_write_byte(MEASURE_TEMP); //發(fā)送測(cè)溫度命令
break;
case HUMI: error+=s_write_byte(MEASURE_HUM1); //發(fā)送測(cè)濕度命令
break;
default: break;
}
for(i=0;i<65535;i++) //等待溫濕度值準(zhǔn)備
{if(IO0PIN & TH_DATA==0)
break;
}
if(TH_DATA)
error=error+1;
TH_H=s_read_byte(noACK); //讀溫濕度值高位
TH_L=s_read_byte(ACK); //讀溫濕度值低位
TH_H=TH_H<<8;
sum=TH_H+TH_L;
t_C=sum*0.01 - 40;
if(mode)
{
rh_lin=((-4)+(0.0405*sum)+(sum*sum*(-2.8E-6))); //計(jì)算濕度值
TH_value=(t_C-25)*(T1+T2*sum)+rh_lin; //計(jì)算溫度濕度 [%RH]
if(TH_value>100)TH_value=100; //濕度范圍:0.1-100之間
}
else
TH_value=(-40)+(0.01*sum); //計(jì)算溫度值
return TH_value;
// LED=0;
}
//============================================================================
void s_transstart() //SHT11I2C啟動(dòng)
{
TH_DATA=1; TH_SCK=0;
delay(1);
TH_SCK=1;
delay(1);
TH_DATA=0;
delay(1);
TH_SCK=0;
delay(1);
TH_SCK=1;
delay(1);
TH_DATA=1;
delay(1);
TH_SCK=0;
}
//============================================================================
char s_write_byte(unsigned char value)// 寫(xiě)字節(jié) 檢查ack應(yīng)答
{
unsigned char xdata i,error=0;
for (i=0x80;i>0;i/=2) //shift bit for masking
{ if (i & value) TH_DATA=1; //masking value with i , write to SENSI-BUS
else TH_DATA=0;
TH_SCK=1; //clk for SENSI-BUS
TH_SCK=1;
TH_SCK=0;
}
TH_DATA=1;//disp(); //release DAT-line
TH_SCK=1; //disp(); //clk #9 for ack
error=TH_DATA; //disp(); //check ack (DAT will be pulled down by SHT11)
TH_SCK=0;
return error; //error=1 in case of no acknowledge
}
//=======================================================================
unsigned char s_read_byte(uchar ack) // 讀字節(jié) 檢查ack應(yīng)答(if ack=1)
{
uchar xdata i,val=0;
TH_DATA=1; //release DAT-line
for (i=0x80;i>0;i/=2) //shift bit for masking
{ TH_SCK=1; //clk for SENSI-BUS
if (TH_DATA) val=(val | i); //read bit
//disp();
TH_SCK=0;
}
TH_DATA=!ack; //in case of "ack==1" pull down DAT-Line
TH_SCK=1; //disp(); //clk #9 for ack
//disp(); //pulswith approx. 5 us
TH_SCK=0;//disp();
TH_DATA=1; //release DAT-line
return val;
}
//=========================================================================================
//=============================延時(shí)函數(shù)========================================
void delay1(unsigned char d1)
{
uchar j,k;
for(;d1>0;d1--)
{for(j=50;j>0;j--)
{for(k=0;k>0;k--);
}
}
}
void delay(unsigned int i)
{
for(;i>0;i--)
;
}
//*************************************蜂鳴器函數(shù)*******************************
void bell(void)
{BELL=0;
delay(0x8fff);
BELL=1;
}
void error_bell(void)
{ char k;
for(k=4;k>0;k--)
{bell();
delay(0x9fff);
}
}
//*****************************************************************************
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -