|
- #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开关
- */
- }
复制代码
|
|