红外遥控智能电风扇实物图纸程序共享
制作出来的实物图如下:
电路原理图如下:
单片机源程序如下:
- //宏定义
- #define uchar unsigned char
- #define uint unsigned int
- //头函数
- #include <stc12c5a60s2.h>
- #include <AT24C02.h>
- //温度传感器标志变量
- uchar flag=1;
- #include <DS18B20.h>
- #include <Ds1302.h>
- #include <Lcd.h>
- #include <Data.h>
- //热释电传感器
- sbit RR=P3^4;
- //是否有人状态 闹铃状态 风速状态
- uchar R=1,L=1,FS=0;
- //读取温度
- uint TT=0;
- //开机时分秒
- uchar OS=0,OF=0,OM=0;
- //关机时分秒
- uchar ClS=0,ClF=0,ClM=0;
- //模式
- uchar Mode=0;
- //调整位光标
- uchar Modes=0;
- //暂时保存状态
- uchar Modetemp=0;
- //时间计算
- #define Imax 14000 //此处为晶振为11.0592时的取值,
- #define Imin 8000 //如用其它频率的晶振时,
- #define Inum1 145 //要改变相应的取值。
- #define Inum2 700
- #define Inum3 3000
- //解码变量
- unsigned char Im[4]={0x00,0x00,0x00,0x00};
- //全局变量
- uchar f;
- unsigned long m,Tc;
- uchar IrOK;
- //延时
- void delayHW(uchar i);
- //PWM脉冲占空比调节
- void pwm_set(uchar a);
- //PWM初始化
- void initpwm();
- //外部中断定时器0寄存器初始化
- void Init();
- //主函数
- void main()
- {
- //PWM脉冲
- initpwm();
- //外部中断定时器0寄存器初始化
- Init();
- //屏幕初始化
- Init_LCD();
- //时钟初始化
- Ds1302_Init();
- //EEPROM初始化
- initeeprom();
- //写
- /* write_add(0x00,L);
- write_add(0x01,OS);
- write_add(0x02,OF);
- write_add(0x03,OM);
- write_add(0x04,ClS);
- write_add(0x05,ClF);
- write_add(0x06,ClM);*/
- //读
- L=read_add(0x00);
- OS=read_add(0x01);
- OF=read_add(0x02);
- OM=read_add(0x03);
- ClS=read_add(0x04);
- ClF=read_add(0x05);
- ClM=read_add(0x06);
- //发送温度转换
- tmpchange();
- //发送温度转换
- tmpchange();
- //读取温度
- TT=tmp();
- //初始化
- pwm_set(0xff);
- //读取时间
- while(1)
- {
- //发送温度转换
- tmpchange();
- //读取温度
- TT=tmp();
- //读取人员状况
- //有人
- if(RR==1)
- {
- R=0;
- }
- //无人
- else
- {
- R=1;
- }
- //模式处理
- //自动开机
- if(Mode==2)
- {
- //有人开启风扇
- if(R==1)
- {
- //温度调整0档关闭
- if(TT<=300)
- {
- pwm_set(0xff);
- FS=0;
- }
- //1档
- else if(TT>300&&TT<=320)
- {
- pwm_set(50);
- FS=1;
- }
- //2档
- else if(TT>320&&TT<=340)
- {
- pwm_set(10);
- FS=2;
- }
- //3档
- else if(TT>340)
- {
- pwm_set(0);
- FS=3;
- }
- }
- //无人关闭风扇
- else
- {
- pwm_set(0xff);
- FS=0;
- }
- }
- //读取时间
- Ds1302_Read_Time();
- //LCD实时刷新
- LCD_Write_Time(time_buf1,TT,R,L,FS,Mode);
- //延时不然芯片会发热
- delay_LCD(50);
- //如果开启定时 定时后转为自动模式
- if(L==1&&time_buf1[4]==OS&&time_buf1[5]==OF&&time_buf1[6]==OM)
- {
- Mode=2;
- }
- else if(L==3&&time_buf1[0]==OS&&time_buf1[5]==OF&&time_buf1[6]==OM)
- {
- Mode=2;
- }
- else if(L==2&&time_buf1[4]==ClS&&time_buf1[5]==ClF&&time_buf1[6]==ClM)
- {
- Mode=0;
- pwm_set(0xff);
- }
- else if(L==3&&time_buf1[4]==ClS&&time_buf1[5]==ClF&&time_buf1[6]==ClM)
- {
- Mode=0;
- pwm_set(0xff);
- }
- //红外命令处理
- if(IrOK==1)
- {
- //标志变量清空
- IrOK=0;
- //开机关机按键
- if(Im[2]==0x45)
- {
- //关机变开机
- if(Mode==0)
- {
- Mode=1;
- }
- //开机变关机 或自动变关机
- else if(Mode==1||Mode==2)
- {
- Mode=0;
- pwm_set(0xff);
- }
- }
- //自动模式/手动模式切换
- else if(Im[2]==0x15)
- {
- //手动切自动
- if(Mode==1)
- {
- Mode=2;
- }
- //自动切手动
- else if(Mode==2)
- {
- Mode=1;
- }
- }
- //风速 手动调节0档
- else if(Im[2]==0x16)
- {
- //手动模式
- if(Mode==1)
- {
- pwm_set(0xff);
- }
- }
- //风速 手动调节1档
- else if(Im[2]==0x0c)
- {
- //手动模式
- if(Mode==1)
- {
- pwm_set(0x50);
- }
- }
- //风速 手动调节2档
- else if(Im[2]==0x18)
- {
- //手动模式
- if(Mode==1)
- {
- pwm_set(0x10);
- }
- }
- //风速 手动调节3档
- else if(Im[2]==0x5e)
- {
- //手动模式
- if(Mode==1)
- {
- pwm_set(0x00);
- }
- }
- //是否开启闹铃
- else if(Im[2]==0x0d)
- {
- L++;
- //开启到关闭
- if(L==4)
- {
- L=0;
- }
- //////////////////////保存
- //写
- delay_LCD(20);
- write_add(0x00,L);
- }
- //调整开机时间
- else if(Im[2]==0x44)
- {
- //屏幕初始化
- Init_LCD_ONTime();
- //时间调整
- Modetemp=Mode;
- Mode=4;
- Modes=0;
- //时间刷新
- LCD_time(OS,OF,OM);
- //开启光标
- write_com(0x0F);
- write_com(0x06);
- write_com(0x80+40+11);
-
- //设置好跳出
- while(Mode==4)
- {
- //红外命令处理
- if(IrOK==1)
- {
- //标志变量清空
- IrOK=0;
- //退出并保存
- if(Im[2]==0x44)
- {
- Mode=Modetemp;
- //保存
- //写
- delay_LCD(20);
- write_add(0x01,OS);
- delay_LCD(20);
- write_add(0x02,OF);
- delay_LCD(20);
- write_add(0x03,OM);
- }
- //左移光标
- else if(Im[2]==0x07)
- {
- Modes++;
- if(Modes==3)
- Modes=0;
- }
- //右移光标
- else if(Im[2]==0x09)
- {
- Modes--;
- if(Modes==0xff)
- Modes=2;
- }
- //光标值+
- else if(Im[2]==0x40)
- {
- //秒++
- if(Modes==0)
- {
- OM++;
- if(OM==60)
- {
- OM=0;
- }
- }
- //分++
- else if(Modes==1)
- {
- OF++;
- if(OF==60)
- {
- OF=0;
- }
- }
- //时++
- else if(Modes==2)
- {
- OS++;
- if(OS==24)
- {
- OS=0;
- }
- }
- }
- //光标值-
- else if(Im[2]==0x19)
- {
- //秒--
- if(Modes==0)
- {
- OM--;
- if(OM==0xff)
- {
- OM=59;
- }
- }
- //分--
- else if(Modes==1)
- {
- OF--;
- if(OF==0xff)
- {
- OF=59;
- }
- }
- //时--
- else if(Modes==2)
- {
- OS--;
- if(OS==0xff)
- {
- OS=23;
- }
- }
- }
- //时间刷新
- LCD_time(OS,OF,OM);
- //光标设置
- switch(Modes)
- {
- case 0:
- {
- write_com(0x80+0x40+11);
- break;
- }
- case 1:
- {
- write_com(0x80+0x40+8);
- break;
- }
- case 2:
- {
- write_com(0x80+0x40+5);
- break;
- }
- }//Switch
- }
- }//while end
-
- //屏幕初始化
- Init_LCD();
- }
- //调整关机时间
- else if(Im[2]==0x43)
- {
- //屏幕初始化
- Init_LCD_OFFTime();
- //时间调整
- Modetemp=Mode;
- Mode=5;
- Modes=0;
- //时间刷新
- LCD_time(ClS,ClF,ClM);
- //开启光标
- write_com(0x0F);
- write_com(0x06);
- write_com(0x80+40+11);
-
- //设置好跳出
- while(Mode==5)
- {
- //红外命令处理
- if(IrOK==1)
- {
- //标志变量清空
- IrOK=0;
- //退出并保存
- if(Im[2]==0x43)
- {
- Mode=Modetemp;
- //保存
- //写
- delay_LCD(20);
- write_add(0x04,ClS);
- delay_LCD(20);
- write_add(0x05,ClF);
- delay_LCD(20);
- write_add(0x06,ClM);
- }
- //左移光标
- else if(Im[2]==0x07)
- {
- Modes++;
- if(Modes==3)
- Modes=0;
- }
- //右移光标
- else if(Im[2]==0x09)
- {
- Modes--;
- if(Modes==0xff)
- Modes=2;
- }
- //光标值+
- else if(Im[2]==0x40)
- {
- //秒++
- if(Modes==0)
- {
- ClM++;
- if(ClM==60)
- {
- ClM=0;
- }
- }
- //分++
- else if(Modes==1)
- {
- ClF++;
- if(ClF==60)
- {
- ClF=0;
- }
- }
- //时++
- else if(Modes==2)
- {
- ClS++;
- if(ClS==24)
- {
- ClS=0;
- }
- }
- }
- //光标值-
- else if(Im[2]==0x19)
- {
- //秒--
- if(Modes==0)
- {
- ClM--;
- if(ClM==0xff)
- {
- ClM=59;
- }
- }
- //分--
- else if(Modes==1)
- {
- ClF--;
- if(ClF==0xff)
- {
- ClF=59;
- }
- }
- //时--
- else if(Modes==2)
- {
- ClS--;
- if(ClS==0xff)
- {
- ClS=23;
- }
- }
- }
- //时间刷新
- LCD_time(ClS,ClF,ClM);
- //光标设置
- switch(Modes)
- {
- case 0:
- {
- write_com(0x80+40+11);
- break;
- }
- case 1:
- {
- write_com(0x80+40+8);
- break;
- }
- case 2:
- {
- write_com(0x80+40+5);
- break;
- }
- }//Switch
- }
- }//while end
-
- //屏幕初始化
- Init_LCD();
- }
- //时间调整
- else if(Im[2]==0x47)
- {
- //屏幕初始化
- Init_LCD();
- //读取时间
- Ds1302_Read_Time();
- //LCD实时刷新
- LCD_Write_Time(time_buf1,TT,R,L,FS,Mode);
- //延时不然芯片会发热
- delay_LCD(50);
- //时间调整
- Modetemp=Mode;
- Mode=3;
- Modes=0;
- //开启光标
- write_com(0x0F);
- write_com(0x06);
- write_com(0x80+40+7);
- //进入调整
- while(Mode==3)
- {
- //红外命令处理
- if(IrOK==1)
- {
- //标志变量清空
- IrOK=0;
- //跳出调整
- if(Im[2]==0x47)
- {
- Mode=Modetemp;
- }
- //左移光标
- else if(Im[2]==0x07)
- {
- Modes++;
- if(Modes==6)
- Modes=0;
- }
- //右移光标
- else if(Im[2]==0x09)
- {
- Modes--;
- if(Modes==0xff)
- Modes=5;
- }
- //光标值+
- else if(Im[2]==0x40)
- {
- //秒++
- if(Modes==0)
- {
- time_buf1[6]++;
- if(time_buf1[6]==60)
- {
- time_buf1[6]=0;
- }
- }
- //分++
- else if(Modes==1)
- {
- time_buf1[5]++;
- if(time_buf1[5]==60)
- {
- time_buf1[5]=0;
- }
- }
- //时++
- else if(Modes==2)
- {
- time_buf1[4]++;
- if(time_buf1[4]==24)
- {
- time_buf1[4]=0;
- }
- }
- //年++
- else if(Modes==3)
- {
- time_buf1[1]++;
- if(time_buf1[1]==99)
- {
- time_buf1[1]=0;
- }
- }
- //月++
- else if(Modes==4)
- {
- time_buf1[2]++;
- if(time_buf1[2]==13)
- {
- time_buf1[2]=1;
- }
- }
- //日++
- else if(Modes==5)
- {
- time_buf1[3]++;
- if(time_buf1[3]==(YDay(time_buf1[1],time_buf1[2])+1))
- {
- time_buf1[3]=1;
- }
- time_buf1[7]=Conver_week(time_buf1[1],time_buf1[2],time_buf1[3]);
- }
- }
- //光标值-
- else if(Im[2]==0x19)
- {
- //秒--
- if(Modes==0)
- {
- time_buf1[6]--;
- if(time_buf1[6]==0xff)
- {
- time_buf1[6]=59;
- }
- }
- //分--
- else if(Modes==1)
- {
- time_buf1[5]--;
- if(time_buf1[5]==0xff)
- {
- time_buf1[5]=59;
- }
- }
- //时--
- else if(Modes==2)
- {
- time_buf1[4]--;
- if(time_buf1[4]==0xff)
- {
- time_buf1[4]=23;
- }
- }
- //年--
- else if(Modes==3)
- {
- time_buf1[1]--;
- if(time_buf1[1]==0xff)
- {
- time_buf1[1]=99;
- }
- }
- //月--
- else if(Modes==4)
- {
- time_buf1[2]--;
- if(time_buf1[2]==0)
- {
- time_buf1[2]=12;
- }
- }
- //日--
- else if(Modes==5)
- {
- time_buf1[3]--;
- if(time_buf1[3]==0)
- {
- time_buf1[3]=YDay(time_buf1[1],time_buf1[2]);
- }
- time_buf1[7]=Conver_week(time_buf1[1],time_buf1[2],time_buf1[3]);
- }
- }
- //LCD实时刷新
- LCD_Write_Time(time_buf1,TT,R,L,FS,Mode);
- //光标设置
- switch(Modes)
- {
- case 0:
- {
- write_com(0x80+40+7);
- break;
- }
- case 1:
- {
- write_com(0x80+40+4);
- break;
- }
- case 2:
- {
- write_com(0x80+40+1);
- break;
- }
- case 3:
- {
- write_com(0x80+3);
- break;
- }
- case 4:
- {
- write_com(0x80+6);
- break;
- }
- case 5:
- {
- write_com(0x80+9);
- break;
- }
- }//Switch
- }//if
- }//while
- //屏幕初始化
- Init_LCD();
- //保存时间
- Ds1302_Write_Time();
- }
- }
- }//while end
- }
- //延时
- void delayHW(uchar i)
- {
- uchar j,k;
- for(j=i;j>0;j--)
- for(k=125;k>0;k--);
- }
- //外部中断定时器0寄存器初始化
- void Init()
- {
- m=0;
- f=0;
- EA=1;//开启总中断
- IT1=1;//下降沿有效
- EX1=1;//外部中断1开
- TMOD=0x01;//定时器初始化
- TH0=0;//T0赋初值
- TL0=0;
- TR0=0;//t0开始计时
- }
- //外部中断解码程序_外部中断1
- void intersvr1(void) interrupt 2 using 1
- {
- TR0=1;
- Tc=TH0*256+TL0/256;//提取中断时间间隔时长
- TH0=0;
- TL0=0; //定时中断重新置零
- if((Tc>Imin)&&(Tc<Imax))
- {
- m=0;
- f=1;
- return;
- } //找到启始码
- if(f==1)
- {
- if(Tc>Inum1&&Tc<Inum3)
- {
- Im[m/8]=Im[m/8]>>1|0x80; m++;
- }
- if(Tc>Inum2&&Tc<Inum1)
- {
- Im[m/8]=Im[m/8]>>1; m++; //取码
- }
- if(m==32)
- {
- m=0;
- f=0;
- if(Im[2]==~Im[3])
- {
- IrOK=1;
- TR0=1;
- delayHW(200);
- }
- else IrOK=0; //取码完成后判断读码是否正确
- }
- //准备读下一码
- }
- }
- //PWM脉冲初始化
- void initpwm()
- {
- CCON=0;
- CL=0;
- CH=0;
- CMOD=0X00;//设定Pwm时钟频率11.0592/12
- CCAPM0=0X42;
- PCA_PWM0=0X00;
- CCAP0H=0;
- CCAP0L=0xff;
- CR=1;
- }
- //PWM占空比设置
- void pwm_set(uchar a)
- {
- CCAP0H=a;
- }
复制代码
所有资料51hei提供下载:
程序--原理图.rar
(2.45 MB, 下载次数: 46)
|