📄 cortrol.c
字号:
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;
}
/******************************************定时器0中断************************
***函数名称: time0() ****
***函数功能: 定时检测温度,湿度,亮度并显示 ****
*****************************************************************************/
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;
}
}
/*****************************************************************************
/********************************键盘扫描中断程序****************************
***函数名称: Key_scan()
***函数功能: 键盘扫描
******************************************************************************/
/*void INTT1()interrupt 2
{
EX1=0;
// Key_scan();
// keyflag=0;
// keyboard_flag=0;
EX1=1;
} */
//*****************************键盘扫描函数*********************************************************
//*******函数名称:Key_scan *********
//*******函数功能:扫描键盘,并取得键值 *********
//*******修改参数: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;
}
//****************************************************************************************************
//******************************************按键查询处理函数 ****************************************
//*******函数名称:key_deal ******************
//*******函数功能:查询按键,若是设置温度,湿度键,就调用设置处理函数 ******************
//****************************************************************************************************
void key_deal(void)
{
switch(kb_data)
{case 3: keycost_deal(TEMP);
break;
case 7: keycost_deal(HUMI);
break;
default: break;
}
}
//===================================================================================================
//==========================================按键处理函数=============================================
//********函数名称:keycost_deal ******
//********函数功能:设置温湿度控制参数值,处理,显示 ******
//********入口参数:TEMP,HUMI,温湿度标志 ******
//********出口参数:无 ******
//********修改参数: 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) //按下“-”号
{DDC=DDC*(-1);
Display_set(0,DC);
keyboard_flag=1;
// KeyNumber=0xff;
}
else if(kb_data==0x0E) //按下"返回"键
return;
//=======================第一次数字键============================================
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(); //蜂鸣器报错误信号
return;
}
//=======================第二次数字键============================================
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) //有“个”位时按下"确定"键
{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(); //蜂鸣器报错误信号
return;
}
//=======================第三次数字键============================================
keyboard_flag=1;
while(keyboard_flag==1);
keydata=key_switch(kb_data);
if(kb_data==0x0F) //有“十”位数据时按下"确定"键
{
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) //有“百”位数据时按下"确定"键
{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(); //蜂鸣器报错误信号
return;
}
}
}
//=================================================================================
//****************************键值转换函数******************************************
//*****函数名称:key_switch **********
//*****函数功能:把实际键值转换成键盘上标识的键值 **********
//**********************************************************************************
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;
}
//=============================================================================================================//
//***************************************************************************************************
//******************************读温湿度数据*******************************************
//****函数功能:调用I2C读写函数计算出温湿度值 ****************
//****入口参数:TEMP,HUMI,温度标志,湿度标志 ****************
//****出口参数:TH_value,测量温度值,测量的湿度值 ****************
//***************************************************************************************************
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(); //传输开始
switch(mode)
{case TEMP: error+=s_write_byte(MEASURE_TEMP); //发送测温度命令
break;
case HUMI: error+=s_write_byte(MEASURE_HUM1); //发送测湿度命令
break;
default: break;
}
for(i=0;i<65535;i++) //等待温湿度值准备
{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))); //计算湿度值
TH_value=(t_C-25)*(T1+T2*sum)+rh_lin; //计算温度湿度 [%RH]
if(TH_value>100)TH_value=100; //湿度范围:0.1-100之间
}
else
TH_value=(-40)+(0.01*sum); //计算温度值
return TH_value;
// LED=0;
}
//============================================================================
void s_transstart() //SHT11I2C启动
{
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)// 写字节 检查ack应答
{
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) // 读字节 检查ack应答(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;
}
//=========================================================================================
//=============================延时函数========================================
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--)
;
}
//*************************************蜂鸣器函数*******************************
void bell(void)
{BELL=0;
delay(0x8fff);
BELL=1;
}
void error_bell(void)
{ char k;
for(k=4;k>0;k--)
{bell();
delay(0x9fff);
}
}
//*****************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -