标题:
单片机负离子加湿器设计程序源代码
[打印本页]
作者:
liuqq
时间:
2015-5-20 21:32
标题:
单片机负离子加湿器设计程序源代码
#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开关
*/
}
复制代码
作者:
tt98
时间:
2018-1-13 09:23
能看看电路原理图吗?
作者:
hellospring
时间:
2018-7-14 21:45
你好!可以共享学习加湿器程序?QQ:2362034
作者:
fanghui78
时间:
2019-12-11 19:56
看看产品电路原理图
作者:
神出没
时间:
2020-2-22 10:28
没有原理图,程序看不懂
作者:
jovew
时间:
2020-2-23 14:05
能够提供电气原理图吗?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1