久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
單片機負離子加濕器設計程序源代碼
[打印本頁]
作者:
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.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
99精品视频一区二区三区
|
国产成人福利在线观看
|
中文字幕精品一区
|
成人在线免费观看
|
中文字幕视频在线观看
|
亚洲欧美国产精品久久
|
久久亚洲一区
|
日韩欧美精品在线播放
|
欧美黑人一级爽快片淫片高清
|
亚洲欧美日韩中文在线
|
日韩中文字幕免费在线
|
国产中的精品av涩差av
|
黄视频国产
|
a级黄色毛片免费播放视频 国产精品视频在线观看
|
精品欧美一区二区三区免费观看
|
中文字幕av在线一二三区
|
在线日韩欧美
|
中文字幕在线播放不卡
|
综合天天久久
|
色橹橹欧美在线观看视频高清
|
99精品免费
|
久久久精彩视频
|
久久99深爱久久99精品
|
最新中文字幕第一页视频
|
国产色99
|
自拍视频一区二区三区
|
久久亚洲一区二区三区四区
|
自拍偷拍第一页
|
久草新在线
|
亚洲视屏
|
91精品国产乱码久久久久久久
|
亚洲国产精品自拍
|
伊人青青久久
|
亚洲精品一区二区网址
|
精品九九
|
午夜视频在线观看一区二区
|
久久久久无码国产精品一区
|
日韩视频 中文字幕
|
日韩二区
|
日韩成人在线免费视频
|
日韩欧美在线视频一区
|