|
- #include<reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit SDA=P0^0;
- sbit SCL=P0^1;
- sbit dio=P0^2;
- sbit clk=P0^3;
- sbit stb=P0^4;
- sfr P3M1=0xb1;//強推挽輸出
- sfr P3M0=0xb2;
- sfr ADC_CONTR=0xBC; //ADC用
- sfr ADC_RES=0xBD;
- sfr P1ASF=0x9D;
- sbit kzd=P3^7; //低速控制
- sbit kzz=P3^6; //中速控制
- sbit kzg=P3^5; //高速控制
- sbit kzf=P3^4; //負離子控制
- sbit kzj=P3^1; //加濕控制
- sbit ledd=P2^1;//低速指示燈
- sbit ledz=P2^2;//中速指示燈
- sbit ledg=P2^3;//高速指示燈
- sbit ledj=P2^4;//加濕指示燈
- sbit ledf=P2^5;//負離子指示燈
- sbit ledkq=P1^1;//空氣質量指示燈
- sbit ledds=P1^3;//定時指示燈
- sbit fmq=P3^0; //蜂鳴器
- uint zzshu=1000;//初始化時,賦值大于轉動脈沖數
- uint fzshu=1000;//初始化時,賦值大于轉動脈沖數
- uchar qw; //氣味處理值
- uint qwcaiji; //氣味采集值
- uint key;
- uchar TM_0,TM_2,TM_4; //TM1629B顯示用參數
- uchar code table[]={0x7e,0x42,0x5d,0x57,0x63,0x37,0x3f,0x52,0x7f,0x77};
- uchar code zheng[]={0x30,0x60,0xc0,0x90};
- uchar code fan[]={0x30,0x90,0xc0,0x60};
- void TM1629B_xie(uchar xie)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- clk=0;
- if(xie&0x01)
- {dio=1;}
- else
- {dio=0;}
- clk=1;
- xie>>=1;
- }
- }
- void TM1629B_COM(uchar cmd)
- {
- stb=0;
- TM1629B_xie(cmd);
- stb=1;
- }
- void TM1629B_mie(void)
- {
- uchar i;
- stb=0;
- TM1629B_xie(0xc0); //地址命令,00H顯示地址
- for(i=0;i<14;i++)
- {TM1629B_xie(0x00);} //所有顯示為滅
- stb=1;
- }
- void TM1629B_init(void)
- {
- clk=1;
- stb=1;
- dio=1;
- TM1629B_COM(0x00);//顯示模式
- TM1629B_COM(0x40);//寫數據、地址自動增加
- TM1629B_mie();
- TM1629B_COM(0x89);//顯示開,灰度2/16
- }
- void delay(int x)
- {
- uint i,j;
- for(i=x;i>0;i--)
- for(j=1100;j>0;j--);
- }
- void init_ADC(void); //ADC初始化
- uint get_ADC_qw(void); //獲取氣味AD結果
- void SC09A(void);//按鍵掃描
- uint a,b;//定時、風速
- bit g;//開機
- bit qh;//切換標志位
- uint num; //時間定時
- uchar ir; //紅外線用
- uint startflag;
- uint bitnum;
- uchar irjsok,irjmok;
- uchar ircode[4];
- uchar irdata[33];
- void irjm(void) //把ir時間值解碼
- {
- uchar k,i,j;
- uchar value;
- k=1;
- for(j=0;j<4;j++)
- {
- for(i=0;i<8;i++)
- {
- value=value>>1; //移位保存
- if(irdata[k]>6) //判斷值1或0
- {
- value=value|0x80;
- }
- k++;
- }
- ircode[j]=value;
- irjmok=1;
- }
- }
- void irkz(void) //一個碼值對應一個控制
- {
- if(ircode[1]==0xFF)
- {
- if(ircode[2]==0x09)//第1個按鈕,開關
- {
- fmq=1;
- delay(15);
- fmq=0;
- g=~g;
- a=0;//開機復位,定時燈全滅
- b=1;//開機低速運行
- if(g==1)
- {
- zzshu=0;
- fzshu=1000;
- }
- else
- {
- zzshu=1000;
- fzshu=0;
- }
- }
- if(g==1) //防止關機時,按鍵有聲音
- {
- if(ircode[2]==0x11) //第2個按鈕,風速
- {
- fmq=1;
- delay(15);
- fmq=0;
- b++;
- if(b>3)//風速循環
- {
- b=1;
- }
- }
- if(ircode[2]==0x19)//第3個按鈕,加濕
- {
- fmq=1;
- delay(15);
- fmq=0;
- kzj=~kzj;
- ledj=~ledj;//加濕指示燈
- }
- if(ircode[2]==0x17)//第4個按鈕,負離子
- {
- fmq=1;
- delay(15);
- fmq=0;
- ledf=~ledf;
- kzf=~kzf;
- }
- if(ircode[2]==0x16) //第5個按鈕,定時
- {
- fmq=1;
- delay(15);
- fmq=0;
- a=a+60;
- if(a>360)
- {
- a=0;
- }
- qh=1;//按定時按鈕,顯示自動切換成定時
- }
- if(ircode[2]==0x04) //第6個按鈕,切換
- {
- fmq=1;
- delay(15);
- fmq=0;
- qh=~qh;
- }
- }//if(g==1)
- }//if(ircode[1]==0xFF)
- }//irkz
- void main()
- {
- uint t;//ADC采樣時間控制
- P3M1=0;//P3.0強推挽輸出
- P3M0=0x01;
- fmq=1;//上電響
- delay(50);
- fmq=0;
- delay(350);//電壓穩定再進行IAP操作
- init_ADC();
- TM1629B_init();
- TMOD=0x12;//定時器1為方式1,定時器0為方式2
- EA=1;
- TH1=(65535-45872)/256;
- TL1=(65535-45872)%256;
- ET1=1;
- TH0=0x00;
- TL0=0x00;
- ET0=1;
- TR0=1;
- TR1=1; //定時器1開,定時、濾網時間共用
- IT1=1; //外部中斷1設置
- EX1=1; //外部中斷1允許
- IT0=1; //外部中斷0設置
- EX0=1; //外部中斷0允許
- while(1)
- {
- if(irjsok) //紅外程序,用遙控器按鈕6解除濾網報警
- {
- irjm();
- irjsok=0;
- }
- if(irjmok)
- {
- irkz();
- irjmok=0;
- }
- //-----------------------------------------
- SC09A();//按鍵掃描
- //-----------------------------------------
- if(zzshu<150)//正轉150個脈沖
- {
- int i;
- zzshu++;
- for(i=0;i<4;i++)
- {
- P1=P1&0x0f;
- P1=P1|zheng[i];
- delay(8);//
- }
- }
- else
- {
- P1=P1&0x0f;
- }
- if(fzshu<150)//反轉150個脈沖
- {
- int i;
- fzshu++;
- for(i=0;i<4;i++)
- {
- P1=P1&0x0f;
- P1=P1|fan[i];
- delay(8);//
- }
- }
- else
- {
- P1=P1&0x0f;
- }
- //---------------------------------------------
- if(a==1)
- {
- if(num>1100) //最后1分鐘算做55秒
- {
- g=0;
- a=0;//定時時間到關機,為了區別手動按到0值時不能關機
- }
- }
- //紅外線測試時加g=1
- if(g==1)//開機時,執行以下程序
- {
- if(a!=0) //定時器T0開始工作
- {
- if(num>1205)//設置定時時間,1分鐘設置為1205
- {
- num=0;
- a--;
- }
- }
- if(a==0)//a=0時,一直保持num值加不上去
- {
- num=0;
- }
- if(qh==1)
- {
- ledkq=1;
- ledds=0;
- }
- else
- {
- ledkq=0;
- ledds=1;
- }
- if(b==1)//低速
- {
- kzd=0; //低風
- kzz=1;
- kzg=1;
- ledd=0;
- ledz=1;
- ledg=1;
- }
- if(b==2)//中速
- {
- kzd=1; //中風
- kzz=0;
- kzg=1;
- ledd=1;
- ledz=0;
- ledg=1;
- }
- if(b==3)//高速
- {
- kzd=1; //高風
- kzz=1;
- kzg=0;
- ledd=1;
- ledz=1;
- ledg=0;
- }
- TM1629B_COM(0x00);//顯示模式
- TM1629B_COM(0x44);//寫數據、固定地址
- stb=0;
- TM1629B_xie(0xc0); //地址命令設置00H,這是個位
- TM1629B_xie(table[TM_0]);
- stb=1;
- stb=0;
- TM1629B_xie(0xc2); //地址命令設置02H,這是十位
- TM1629B_xie(table[TM_2]);
- stb=1;
- stb=0;
- TM1629B_xie(0xc4); //地址命令設置04H,這是百位
- TM1629B_xie(table[TM_4]);
- stb=1;
- TM1629B_COM(0x89);//顯示開,灰度2/16
- }
- else//g不等于1時,關閉輸出
- {
- kzd=1; //低速控制
- kzz=1; //中速控制
- kzg=1; //高速控制
- kzf=1; //負離子控制
- kzj=1; //加濕控制
- ledd=1;//低速指示燈
- ledz=1;//中速指示燈
- ledg=1;//高速指示燈
- ledj=1;//加濕指示燈
- ledf=1;//負離子指示燈
- ledkq=1;//空氣質量指示燈
- ledds=1;//定時指示燈
- qh=0; //開機顯示空氣質量
- TM1629B_COM(0x00);//關閉屏幕操作
- TM1629B_COM(0x40);
- TM1629B_mie();
- TM1629B_COM(0x89);
- }
-
- qwcaiji=qwcaiji+get_ADC_qw();
- t++;
- if(t==200) //調整模擬量處理的時間間隔
- {
- qw=qwcaiji/200; //平均濾波
- t=0;
- qwcaiji=0;
- }
- if(qh==1) //空氣質量與定時切換顯示
- {
- TM_0=a%10;
- TM_2=a%100/10;
- TM_4=a/100;
- }
- else
- {
- TM_0=qw%10;
- TM_2=qw%100/10;
- TM_4=qw/100;
- }
- }//while
- }//main
- void T1_time() interrupt 3 //定時、濾網用
- {
- TH1=(65535-45872)/256;
- TL1=(65535-45872)%256;
- num++;
- }
- void timer0() interrupt 1 //紅外程序用
- {
- ir++; //一個周期ir值=0.278ms
- }
- void int1() interrupt 2 //INT1下降沿接收紅外信號
- {
- if(startflag)
- {
- if(ir>42)//檢測引導嗎
- {
- bitnum=0;
- }
- irdata[bitnum]=ir;
- ir=0;
- bitnum++;
- if(bitnum==33)
- {
- bitnum=0;
- irjsok=1;
- startflag=0;
- }
- }
- else
- {
- startflag=1;
- ir=0;
- }
- }
- void init_ADC(void)
- {
- P1ASF =0x01; //選擇P1.0通道
- ADC_RES =0; //清理結果寄存器的值
- ADC_CONTR=0x80; //開啟電源、540個時鐘、選用P1.0口
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- void SC09A(void)
- {
- if(key==0x0020)//開關
- {
- fmq=1;
- delay(15);
- fmq=0;
- g=~g;
- a=0;//開機復位,定時燈全滅
- b=1;//開機低速運行
- if(g==1)
- {
- zzshu=0;
- fzshu=1000;
- }
- else
- {
- zzshu=1000;
- fzshu=0;
- }
- key=0;
- }
- if(g==1)
- {
- if(key==0x1000)//風速
- {
- fmq=1;
- delay(15);
- fmq=0;
- b++;
- if(b>3)//風速循環
- {
- b=1;
- }
- key=0;
- }
- if(key==0x0800)//加濕
- {
- fmq=1;
- delay(15);
- fmq=0;
- kzj=~kzj;
- ledj=~ledj;//加濕指示燈
- key=0;
- }
- if(key==0x0400)//負離子
- {
- fmq=1;
- delay(15);
- fmq=0;
- ledf=~ledf;
- kzf=~kzf;
- key=0;
- }
- if(key==0x0080)//定時
- {
- fmq=1;
- delay(15);
- fmq=0;
- a=a+60;
- if(a>360)
- {
- a=0;
- }
- qh=1;//按定時按鈕,顯示自動切換成定時
- key=0;
- }
- if(key==0x0040)//切換
- {
- fmq=1;
- delay(15);
- fmq=0;
- qh=~qh;
- key=0;
- }
- }// if(g==1)
- }
-
- uint get_ADC_qw(void)
- {
- uchar mn=0;
- ADC_CONTR=0X88; //開電源、開始轉換ADC_START=1,選擇P1.0
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- while(!(ADC_CONTR&0X10)); //轉換結束ADC_FLAG=1
- mn=ADC_RES;
- ADC_CONTR&=~0X10; //ADC_FLAG清零
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- return mn;
- }
- void int0() interrupt 0 //INT0下降沿接收SC09A
- {
- uchar i,j,temp;
- uchar dizi=0x81;
- uint keyzhi=0xffff;
- bit bit_temp;
- EA=0; // 屏蔽全局中斷
- SCL=1;
- for(i=0;i<50;i++){} //延時
- SDA=0; // 拉低SDA,端口送出START 信號
- for(i=0;i<50;i++){} //延時
- for(j=0;j<8;j++)//發送8位地址
- {
- SCL=0;
- temp=dizi&0x80;
- for(i=0;i<50;i++){} //延時
- if(temp==0x80)
- SDA=1;
- else
- SDA=0;
- dizi=dizi<<1;
- for(i=0;i<50;i++){} //延時
- SCL=1;
- for(i=0;i<50;i++){} //延時
- }
- SDA=1; //釋放SDA 端口,將SDA設置為輸入端口
- SCL=0;
- for(i=0;i<50;i++){} //延時
- SCL=1;
- for(i=0;i<50;i++){} //延時
- //此處讀ack回應,不做處理
- //讀16位按鍵數據
- for(j=0;j<16;j++)
- {
- SCL=0;
- for(i=0;i<50;i++){} //延時
- SCL=1;
- for(i=0;i<50;i++){} //延時
- bit_temp=SDA;
- if(bit_temp)
- {
- keyzhi=keyzhi<<1;
- keyzhi=keyzhi|0x01;
- }
- else
- {
- keyzhi=keyzhi<<1;
- }
- }
- SCL=0;
- SDA=1;
- for(i=0;i<50;i++){} //延時
- SCL=1;
- for(i=0;i<50;i++){} //延時
- SCL=0;
- SDA=0; //發送 NACK 信號
- for(i=0;i<50;i++){} //延時
- SCL=1;
- for(i=0;i<50;i++){} //延時
- SDA=1; //結束
- key=keyzhi^0xffff;//異或
- EA=1; //全局中斷使能
- /*
- CIN0 0x1000 S1風速
- CIN1 0x0800 S2加濕
- CIN2 0x0400 S3負離子
- CIN5 0x0080 S4定時
- CIN6 0x0040 S5切換
- CIN7 0x0020 S6開關
- */
- }
復制代碼
|
|