📄 main.c
字号:
#include "STC12.H"
#include "pin.h"
#include "MATH.H"
#include "function.h"
#include "evariable.h"
main()
{
init();
while(1)
{
cnt_main++;
// WDT_CONTR=0x37;//喂狗 every 10s to start and set watch dog
scan_key();
if(k_pw)
{
disp_sens();
//dispose for hpr
disp_Hpr();
//dispose for Lpr
disp_Lpr();
//dispose fresh-air function
disp_fa();
disp_ref();
display();
//use T check data stored in the ee if changing;
//if happend,refresh the data of ee
ee_fresh();
//suggest not fresh operating every time during da_WA changing
disp_spd();
speaking();
}
}
while(1);
}
void delay10ms(unsigned int da)
{
unsigned int i,j;
for(i=0;i<da;i++)
{
for(j=0;j<16000;j++);
}
}
void scan_key(void)
{
byte da,da2;
// if(alarm==0)
// {
da=(unsigned char)sample_adc(1);
if((da>51)&&(da<205))
{
delay2(1000);
da2=(unsigned char)sample_adc(1);
if(abs(da-da2)<0x05)
{
if((alarm==0)&&(51<da)&&(da<=102)&&(k_pw)) //k101接通
{
k_ref=!k_ref;
if(k_ref==1)//cool key at open state
{ //display ON in LCD
dp_chara(addr_ON,0,2,30,18);
state_ref=0;
//when at cool state,wind adjusting is
//less than 1/3 to
if(da_WA<=30)
{
da_WA=30;
WA_changed=1;
state_WA=0;
}
}
else //cool key at open state
{ //display OFF in LCD
dp_chara(addr_OFF,0,2,30,18);
state_ref=0xff;
ref=0;
}
}
//FRESH AIR: 0 indicate OFF state
// 1 indicate ON state
// 2 indicate AUTO state
if((alarm==0)&&(102<da)&&(da<=154)&&(k_pw))
{
switch((++k_fa)%3)
{
case 0: //OFF
dp_chara(addr_OFF,0,3,30,18);
freshair_aut=0;
freshair=0;
break;
case 1: //ON
dp_chara(addr_ON,0,3,30,18);
freshair_aut=0;
freshair=1;
break;
case 2: //AUT
//star up Time ,changing states between
//ON and OFF per 2s
dp_chara(addr_AUT,0,3,30,18);
freshair_aut=1;
break;
default:
break;
}
}
//controll frigerate function
if((154<da)&&(da<=205))
{
k_pw=!k_pw;
if(k_pw==1)//power key at open state
{ //display ON in LCD
switch_5v=1;
delay2(500);
power_on();
// dp_chara(addr_ON,0,1,30,18);
}
else //power key at open state
{ //display OFF in LCD
switch_5v=0;
}
}
delay2(1000);
while(1)
{
da2=(unsigned char)sample_adc(1);
if(da2>205)
{
break;
}
}
}
}
// }
}
unsigned int adc4(void)
{
unsigned int Vd,Vd1;
byte da;
//p1.4 is input of adc
//chs2~0:100B;adc_power=1;
//speed1~0:11B
P1M0|=0x10;
P1M1&=0xef;
ADC_CONTR=0xe4;
ADC_CONTR&=0xe7;//clear start flag and end flag
ADC_DATA=0; //clear result data register
ADC_LOW2=0;
ADC_CONTR|=0x08;
while(!(ADC_CONTR&0x10));
// P1M0&=0xef;
// P1M1&=0xef;
ADC_CONTR&=0x80;
da= ADC_DATA;
Vd=(unsigned int)da;
Vd<<=2;
da=ADC_LOW2;
da&=0x03;
Vd1=(unsigned int)da;
Vd=Vd+Vd1;
return(Vd);
}
void disp_spd(void)
{
float da=0;
byte da1=0;
if((WA_changed)&&(alarm==0))
{
if(state_WA==0)
{
state_WA=1;
cnt_WA=0;
F2sWA=0;
}
else if((state_WA==1)&&(F2sWA==1))
{
F2sWA=0;
state_WA=0;
WA_changed=0;
DToA();
}
}
}
//input: wind grade;
//output:d->a output
void DToA(void)
{
float da;
unsigned int da1;
//d/a output voltage :0~4.5v
//then amplify 4 time
da=(float)da_WA;
da=99-da;
da=da*1024*18/99/4/5/2; //fomula is da/99*18/4/5*1024
da1=(unsigned int)da;
TLC5615(da1);
}
void TLC5615(unsigned int da)
{
byte i;
CLK=0;
CS=1;
DA=0;
da<<=2;
CS=0;
for(i=0;i<16;i++)
{
CLK=0;
DA = (0x8000 & da )? 1 : 0;
da<<=1;
CLK=1;
}
CLK=0;
CS=1;
}
void power_on(void)
{
// switch_5v=1;
// delay2(1000);
LCD_INIT();
// k_pw=1;
// dp_chara(addr_ON,0,1,30,18);
sendair_out=1;
state=1;
//SPD out
da_WA=99;
WA_changed=1;
state_WA=0;
EX0=1;
EX1=1;
pwon=1;
}
void disp_ref(void)
{
char da;
if(alarm==0)
{
switch(state_ref)
{
case 0: //suggestion:state_ref and ref should concurrent
//state_ref:-- indicate neceserry to analyse temperatrue changing
if(da_TA<=da_TC)//空调制冷输出
{
state_ref=1;
cnt_Ref=0;
F5sRef=0;
}
break;
case 1:
if(F5sRef==1)
{
state_ref=0;
F5sRef=0;
if(da_TA<=da_TC)
{
ref=1;//prepare open frigerate
}
}
break;
default:
break;
}
da=da_TC+2;
if(da_TA>=da) //Stop frigerate
{
ref=0;
}
}
else
{
ref=0;
}
}
void ee_fresh(void)
{
byte flag1;
//delay 5s after storing data updated
//than write to ee
if(ee_changed)
{
if(state_Ee==0)
{
cnt_Ee=0;
F5sEe=0;
state_Ee=1;
}
else if((state_Ee==1)&&(F5sEe==1))
{
F5sEe=0;
state_Ee=0;
ee_changed=0;
EE_Erase(0x2800);
flag1=0x33;
EE_Write(0x2900,&flag1,1);
EE_Write(0x2901,&flag1,1);
EE_Write(0x2800,&da_TA,1);
}
}
}
//state_sens:0->after sens failure,caculate count for checking again
// 1->when time come ,check the sens state
void disp_sens(void)
{
unsigned int Vd;
byte da;
if((pwon)&&(alarm==0)&&(cnt_main%255==0))
{
Vd=sample_adc(4);
//temperature circle open
//checking voltage less than 0.5v
//other 0.5v equal when the temperature is great than 70C
if(Vd<=102)
{
alarm|=0x04;
alarm&=0xf7;
state_Sens=0;
}
else if(Vd<690) //checking voltage great than 3.36v
{ //other 3.36v equal when the temperature is less than -10C
Vd=sample10_adc4();
da_TC=ct(Vd);
da=da_TC/10;
dp_chara(da,0,1,30,6);
da=da_TC%10;
dp_chara(da,0,1,36,6);
}
//temperature circle short
//checking voltage more than 3.36v
else if(Vd>=690)
{
alarm|=0x08;
alarm&=0xfb;
state_Sens=0;
}
}
if(alarm&0x0c)
{
//sensor failure --alarm:bit2 open --00
// bit3 short --50
//temperature circle open
//checking voltage less than 0.5v or great than 3.36v
if(state_Sens==0)
{
F5sSens=0;
cnt_Sens=0;
state_Sens=1;
}
if((state_Sens==1)&&(F5sSens==1))
{
F5sSens=0;
Vd=sample_adc(4);
//temperature circle open
//checking voltage less than 2.0v or great than 2.7v
if(Vd<102)
{
alarm|=0x04;
alarm&=0xf7;
state_Sens=0;
}
else if(Vd<690)
{
alarm&=0xf3;
if(alarm==0)
{
alarm_Resume=1;
}
state_Sens=0;
}
else
{
alarm|=0x08;
alarm&=0xfb;
state_Sens=0;
}
}
}
}
void disp_fa(void)
{
//2 min open ;8 min close
//state_fa: 0->caculate 8 min count;1->caculate 2 min count;2->wait for 8 min then
//operate; 3->wait for 2 min then operate
if(freshair_aut)
{
switch(state_fa)
{
case 0: //close fresh-air relay till F8m2m count to 8889
F8m2m=0;
cnt_fa=0;
state_fa=2;
freshair=0;
break;
case 1: //open fresh-air relay till F8m2m count to 2223
F8m2m=0;
cnt_fa=0;
state_fa=3;
freshair=1;
break;
case 2:
if(F8m2m==1)
{ //8min close
state_fa=1;
F8m2m=0;
}
break;
case 3:
if(F8m2m==1)
{ //8min close
state_fa=0;
F8m2m=0;
}
break;
default:
break;
}
}
}
//in byte da1: bit7:chip select;
// bit6~5:display mode select :00 ---normal
// 01 ---PR alarm
// 10 ---SENS alarm
// bit4~bit0:display content :in case of normal :it points dpl[]
// in case of PR/SENS 1---AH/50
// 0---AL/0
//in byte da2: bit7~6:page select;bit6~0:display column select
void disp_Hpr(void)
{
//State_Hp :0->caculate 5 min count;1->wait for 5 min then judge if entering the Hp state;
//2:caculate 5 min count for exiting state; 3->wait for 5 min then judge if exiting the Hp state
unsigned char da=0;
switch(state_Hp)
{
case 0:
if(alarm_Hpr)
{
F5sHp=0;
cnt_Hp=0;
state_Hp=1;
}
break;
case 1:
if((F5sHp==1)&&(alarm_Hpr==1))
{
F5sHp=0;
alarm_Hpr=0;
pin_hpr=1;
if(!pin_hpr)//hight press alarm
{
alarm|=0x01;
state_Hp=2;
state_ref=0xff;
ref=0;
}
else
{
EX0=1;
state_Hp=0;
}
}
break;
case 2:
da=alarm&0x01;
if(da)
{
pin_hpr=1;
if(pin_hpr)
{
F5sHp=0;
cnt_Hp=0;
state_Hp=3;
}
}
break;
case 3:
da=alarm&0x01;
if((da==1)&&(F5sHp==1))
{
F5sHp=0;
pin_hpr=1;
if(pin_hpr)
{
F5sHp=0;
alarm&=0xfe;
if(alarm==0)
{
alarm_Resume=1;
}
EX0=1;
state_Hp=0;
}
else
{
state_Hp=2;
}
}
break;
default:
break;
}
}
void disp_Lpr(void)
{
//State_Lp :0->caculate 5 min count;1->wait for 5 min then judge if entering the Lp state;
//2:caculate 5 min count for exiting state; 3->wait for 5 min then judge if exiting the Lp state
unsigned char da=0;
switch(state_Lp)
{
case 0:
if(alarm_Lpr)
{
F5sLp=0;
cnt_Lp=0;
state_Lp=1;
}
break;
case 1:
if((F5sLp==1)&&(alarm_Lpr==1))
{
F5sLp=0;
pin_lpr=1;
if(!pin_lpr)//hight press alarm
{
alarm_Lpr=0;
alarm|=0x02;
state_Lp=2;
state_ref=0xff;
ref=0;
}
else
{
EX1=1;
alarm_Lpr=0;
state_Lp=0;
}
}
break;
case 2:
da=alarm&0x02;
if(da)
{
pin_lpr=1;
if(pin_lpr)
{
F5sLp=0;
cnt_Lp=0;
state_Lp=3;
}
}
break;
case 3:
da=alarm&0x02;
if((da==2)&&(F5sLp==1))
// da=alarm&0x02;
{
F5sLp=0;
pin_lpr=1;
if(pin_lpr)
{
F5sLp=0;
alarm&=0xfd;
if(alarm==0)
{
alarm_Resume=1;
}
EX1=1;
state_Lp=0;
}
else
{
state_Lp=2;
}
}
break;
default:
break;
}
}
void display(void)
{
//alarm : bit0 Hpr alarm;bit1 Lpr alarm;bit2 SENS 00;bit3 SENS 50;
byte da1=0;
//fresh display TA
if(alarm==0x00)
{
if(display_TA)
{
//ECCF2=0
CCAPM1&=0xfe;
dp_chara(addr_TA,1,1,0,18);
da1=da_TA/10;
dp_bigchara(da1,1,2,18,12);
da1=da_TA%10;
dp_bigchara(da1,1,2,30,12);
display_TA=0;
ee_changed=1;
state_Ee=0;
//Open CCF2 interrupt
CCF1=0;
CCAPM1|=0x01;
}
//fresh display WA
if(display_WA)
{
//ECCF3=0
CCAPM3&=0xfe;
dp_chara(addr_WA,1,1,0,18);
da1=da_WA/10;
dp_bigchara(da1,1,2,18,12);
da1=da_WA%10;
dp_bigchara(da1,1,2,30,12);
display_WA=0;
//control wa output
WA_changed=1;
state_WA=0;
//display resume the normal state
//only display ta
display_resume=1;
//Open CCF3 interrupt
CCF3=0;
CCAPM3|=0x01;
}
if(display_resume)
{
if(state_Resume==0)
{
cnt_Resume=0;
F5sResume=0;
state_Resume=1;
}
else if((state_Resume==1)&&(F5sResume==1))
{
F5sResume=0;
state_Resume=0;
display_resume=0;
display_TA=1;
}
}
}
if((alarm!=0)&&(cnt_Display%37==0))
{
switch((alarm_state++)%4)
{
case 0:
da1=alarm&0x01;
if(da1)
{
lcd_clr(1);
dp_bigchara(addr_PR,0,1,26,60);
dp_bigchara(addr_AH,1,1,0,24);
// speaking();
}
break;
case 1:
da1=alarm&0x02;
if(da1)
{
lcd_clr(1);
dp_bigchara(addr_PR,0,1,26,60);
dp_bigchara(addr_AL,1,1,0,24);
// speaking();
}
break;
case 2:
da1=alarm&0x04;
if(da1)
{
lcd_clr(1);
dp_bigchara(addr_SENS,0,1,2,60);
dp_bigchara(addr_50,1,1,0,24);
}
break;
case 3:
da1=alarm&0x08;
if(da1)
{
lcd_clr(1);
dp_bigchara(addr_SENS,0,1,2,60);
dp_bigchara(addr_00,1,1,0,24);
// speaking();
}
break;
default:
break;
}
}
if(alarm_Resume)
{
alarm_Resume=0;
lcd_clr(0);
lcd_predp();
}
}
void speaking(void)
{
if((alarm)&&(cnt_Speaking>2))
{
// F54ms=0;
cnt_Speaking=0;
SpeakingBak=~SpeakingBak;
if(SpeakingBak)
{
SPEAKER=1;
}
else
{
SPEAKER=0;
}
}
else if(alarm==0)
{
SPEAKER=1;
cnt_Speaking=0;
}
}
word sample10_adc4(void)
{
word vresult;
word vmax,vmin,Vd;
byte i;
Vd=sample_adc(4);
vresult=vmax=vmin=Vd;
for(i=0;i<9;i++)
{
Vd=sample_adc(4);
vresult+=Vd;
if(Vd>vmax)
{
vmax=Vd;
}
else if(Vd<vmin)
{
vmin=Vd;
}
}
vresult-=vmax;
vresult-=vmin;
vresult>>=3;
return(vresult);
}
void delay2(word delay)
{
word i;
for(i=0;i<delay;i++);
}
unsigned char adc1(void)
{
unsigned char da;
//p1.1 is input of adc
//chs2~0:001B;adc_power=1;
//speed1~0:11B
// P1|=0x02;
P1M0|=0x02;
P1M1&=0xfd;
ADC_CONTR=0xe1;
ADC_CONTR&=0xe7;//clear start flag and end flag
ADC_DATA=0; //clear result data register
ADC_LOW2=0;
ADC_CONTR|=0x08;
while(!(ADC_CONTR&0x10));
// P1M1&=0xfd;
// P1M0&=0xfd;
ADC_CONTR&=0x80;
da=ADC_DATA;
return(da);
}
unsigned int sample_adc(unsigned char ch)
{
unsigned int Vd,Vd2;
switch(ch)
{
case 4:
while(1)
{
Vd=adc4();
Vd2=adc4();
if(abs(Vd-Vd2)<=3)
{
break;
}
}
break;
case 1:
while(1)
{
Vd=(unsigned int)adc1();
Vd2=(unsigned int)adc1();
if(abs(Vd-Vd2)<5)
{
break;
}
}
break;
default:
break;
}
return(Vd);
}
void delay(byte delay)
{
byte i;
for(i=0;i<delay;i++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -