extern int temp_value_; //声明外部变量extern int temp_value; //声明外部变量//数字数组uchar Number[10] = { '0','1','2','3','4','5','6','7','8','9' };uchar SET_Temp = 25;uchar Counter = 0;uchar FLAG = 0; //标志车窗状态的标志位 0:车窗关闭 1:车窗1挡 2:车窗2挡uchar FLAG_ = 0; //烟雾浓度标志位 0:正常 1:异常uchar Start_FLAG = 1;//毫秒级延时函数static void Delay_ms(uint ms){ uint a, b; for (a = ms; a > 0; a--) for (b = 112; b > 0; b--);}//定时器初始化void Init_Timer0(void){ TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 TH0 = (65535 - 30000) / 256; //给定初值,50ms TL0 = (65535 - 30000) % 256; EA = 1; //总中断打开 ET0 = 1; //定时器中断打开 TR0 = 1; //定时器开关打开}//定时器0中断服务函数void Timer0_isr(void) interrupt 1 using 1{ TH0 = (65535 - 30000) / 256; //给定初值,50ms TL0 = (65535 - 30000) % 256; Counter++; if (Counter <= 2 + abs(SET_Temp- temp_value)/3) //差值每超过3℃,PWM+1 { ENA = 1; } else { ENA = 0; if (Counter == 10) { Counter = 0; } }// if (Start_FLAG == 1)// {// LCD_Write_Char(11, 0, Number[temp_value_ / 10]); //车外温度// LCD_Write_Char(12, 0, Number[temp_value_ % 10]); ////// LCD_Write_Char(4, 0, Number[temp_value / 10]); //车内温度// LCD_Write_Char(5, 0, Number[temp_value % 10]); ////// LCD_Write_Char(11, 1, Number[Read0832(0) / 100]); //烟雾// LCD_Write_Char(12, 1, Number[Read0832(0) % 100 / 10]); //// LCD_Write_Char(13, 1, Number[Read0832(0) % 10]); ////// LCD_Write_Char(4, 1, Number[SET_Temp / 10]); //设定温度十位// LCD_Write_Char(5, 1, Number[SET_Temp % 10]); //设定温度个位//// LCD_Write_Char(15, 1, Number[FLAG]); //车窗状态// }}//事务处理void Headle(void){ //加 if (Up == 0) { Delay_ms(100); if (Up == 0) { if (SET_Temp < 50) { SET_Temp++; } } } //减 if (Down == 0) { Delay_ms(100); if (Down == 0) { if (SET_Temp > 10) { SET_Temp--; } } } //系统启动// if (Start == 0)// {// Delay_ms(100);// if (Start == 0)// {// Start_FLAG = ~Start_FLAG;// LCD_Clear();// }// } //如果车内温度低于设定温度10°以上,开始制热 if (temp_value < SET_Temp - 10) { //没有烟雾的时候,开空调需要关闭窗户,因为对窗户的控制,烟雾的优先级最高,所以有烟雾时,即使开空调,窗户也不关闭 if (FLAG_ == 0) //FLAG_ == 0说明没有烟雾 { //如果车窗是1挡 if (FLAG == 1) { CC_1 = 0; CC_2 = 1; ENB = 1; Delay_ms(1000); //延时5秒 ENB = 0; FLAG = 0; //车窗关闭 } //如果车窗是2挡 if (FLAG == 2) { CC_1 = 0; CC_2 = 1; ENB = 1; Delay_ms(2000); //延时10秒 ENB = 0; FLAG = 0; //车窗关闭 } }// if(Start_FLAG==1)// { LCD_Write_Char(15, 0, 'H'); //液晶显示制冷字符// } KT_1 = 1; KT_2 = 0;// ENA = 1; //电机开始转动 } //如果车内温度高于设定温度6°以上,开始制冷 if (temp_value > SET_Temp + 6 ) { //没有烟雾的时候,开空调需要关闭窗户,因为对窗户的控制,烟雾的优先级最高,所以有烟雾时,即使开空调,窗户也不关闭 if (FLAG_ == 0) { //如果车窗是1挡 if (FLAG == 1) { CC_1 = 0; CC_2 = 1; ENB = 1; Delay_ms(1000); //延时5秒 ENB = 0; FLAG = 0; //车窗关闭 } //如果车窗是2挡 if (FLAG == 2) { CC_1 = 0; CC_2 = 1; ENB = 1; Delay_ms(2000); //延时10秒 ENB = 0; FLAG = 0; //车窗关闭 } }// if (Start_FLAG == 1)// { LCD_Write_Char(15, 0, 'C'); //液晶显示制热字符// } KT_1 = 1; KT_2 = 0;// ENA = 1; //电机开始转动 } //如果车内温度高于设定温度0-6°以内,且没有烟雾,开车窗要分挡位 if (( temp_value >= SET_Temp )&&( temp_value <= SET_Temp + 6) && FLAG_ == 0) { //0-3 车窗开1挡 if (temp_value >= SET_Temp&&temp_value <= SET_Temp + 3) { if (FLAG == 0) { CC_1 = 1; CC_2 = 0; ENB = 1; Delay_ms(1000); //延时1秒 ENB = 0; FLAG = 1; } if (FLAG == 2) { CC_1 = 0; CC_2 = 1; //反转关窗 ENB = 1; Delay_ms(1000); //延时2秒 ENB = 0; FLAG = 1; } } //3-6 车窗开2挡 if (temp_value > SET_Temp+3) { if (FLAG == 0) { CC_1 = 1; CC_2 = 0; ENB = 1; Delay_ms(2000); //延时2秒 ENB = 0; FLAG = 2; } if (FLAG == 1) { CC_1 = 1; CC_2 = 0; ENB = 1; Delay_ms(1000); //延时1秒 ENB = 0; FLAG = 2; } } } //温度正常,空调不启动 if (temp_value >= SET_Temp - 10 && temp_value <= SET_Temp + 6) { KT_1 = 0; KT_2 = 0; //空调关闭// if (Start_FLAG == 1)// { LCD_Write_Char(15, 0, ' '); //液晶不显示空调// } } //烟雾浓度较高,开两档车窗 if (Read0832(0) > 200 && FLAG != 2) { if (FLAG == 1) { CC_1 = 1; CC_2 = 0; ENB = 1; Delay_ms(1000);//延时1秒 ENB = 0; } if (FLAG == 0) { CC_1 = 1; CC_2 = 0; ENB = 1; Delay_ms(2000);//延时2秒 ENB = 0; } FLAG = 2; FLAG_ = 1; } //烟雾浓度正常 if (Read0832(0) <= 200) { FLAG_ = 0; }}/***************************************** 函数功能:主函数 传入参数:无 返回参数:无 其它说明:无******************************************/void main(){ Init_DS18B20_(); LCD_Init(); Init_Timer0();//定时器初始化 do { ReadTemp_(); }while(temp_value_==85); do { ReadTemp(); }while(temp_value == 85); LCD_Write_String(1, 0, "IN:"); LCD_Write_String(7, 0, "OUT:"); LCD_Write_String(0, 1, "SET:"); LCD_Write_String(7, 1, "FOG:"); while(1) { ReadTemp_(); //车外温度读取 ReadTemp(); //车内温度读取 Headle();// if (Start_FLAG == 1)// { LCD_Write_Char(11, 0, Number[temp_value_ / 10]); //车外温度 LCD_Write_Char(12, 0, Number[temp_value_ % 10]); // LCD_Write_Char(4, 0, Number[temp_value / 10]); //车内温度 LCD_Write_Char(5, 0, Number[temp_value % 10]); // LCD_Write_Char(11, 1, Number[Read0832(0) / 100]); //烟雾 LCD_Write_Char(12, 1, Number[Read0832(0) % 100 / 10]); // LCD_Write_Char(13, 1, Number[Read0832(0) % 10]); // LCD_Write_Char(4, 1, Number[SET_Temp / 10]); //设定温度十位 LCD_Write_Char(5, 1, Number[SET_Temp % 10]); //设定温度个位 LCD_Write_Char(15, 1, Number[FLAG]); //车窗状态// } } |