久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7123|回復: 5
打印 上一主題 下一主題
收起左側

單片機負離子加濕器設計程序源代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:80436 發表于 2015-5-20 21:32 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

  1. #include<reg52.h>  
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit  SDA=P0^0;
  6. sbit  SCL=P0^1;

  7. sbit dio=P0^2;
  8. sbit clk=P0^3;
  9. sbit stb=P0^4;

  10. sfr P3M1=0xb1;//強推挽輸出
  11. sfr P3M0=0xb2;

  12. sfr ADC_CONTR=0xBC;   //ADC用
  13. sfr ADC_RES=0xBD;
  14. sfr P1ASF=0x9D;

  15. sbit kzd=P3^7;      //低速控制
  16. sbit kzz=P3^6;      //中速控制
  17. sbit kzg=P3^5;      //高速控制
  18. sbit kzf=P3^4;      //負離子控制
  19. sbit kzj=P3^1;      //加濕控制

  20. sbit ledd=P2^1;//低速指示燈
  21. sbit ledz=P2^2;//中速指示燈
  22. sbit ledg=P2^3;//高速指示燈
  23. sbit ledj=P2^4;//加濕指示燈
  24. sbit ledf=P2^5;//負離子指示燈
  25. sbit ledkq=P1^1;//空氣質量指示燈
  26. sbit ledds=P1^3;//定時指示燈

  27. sbit fmq=P3^0;      //蜂鳴器

  28. uint zzshu=1000;//初始化時,賦值大于轉動脈沖數
  29. uint fzshu=1000;//初始化時,賦值大于轉動脈沖數

  30. uchar qw;            //氣味處理值
  31. uint qwcaiji; //氣味采集值
  32. uint key;

  33. uchar TM_0,TM_2,TM_4;    //TM1629B顯示用參數
  34. uchar code table[]={0x7e,0x42,0x5d,0x57,0x63,0x37,0x3f,0x52,0x7f,0x77};

  35. uchar code zheng[]={0x30,0x60,0xc0,0x90};
  36. uchar code fan[]={0x30,0x90,0xc0,0x60};

  37. void TM1629B_xie(uchar xie)
  38. {
  39. uchar i;
  40. for(i=0;i<8;i++)
  41. {
  42. clk=0;
  43. if(xie&0x01)
  44. {dio=1;}
  45. else
  46. {dio=0;}
  47. clk=1;
  48. xie>>=1;
  49. }
  50. }

  51. void TM1629B_COM(uchar cmd)
  52. {
  53. stb=0;
  54. TM1629B_xie(cmd);
  55. stb=1;
  56. }

  57. void TM1629B_mie(void)
  58. {
  59. uchar i;
  60. stb=0;
  61. TM1629B_xie(0xc0);    //地址命令,00H顯示地址
  62. for(i=0;i<14;i++)
  63. {TM1629B_xie(0x00);}  //所有顯示為滅
  64. stb=1;
  65. }

  66. void TM1629B_init(void)
  67. {
  68. clk=1;
  69. stb=1;
  70. dio=1;
  71. TM1629B_COM(0x00);//顯示模式
  72. TM1629B_COM(0x40);//寫數據、地址自動增加
  73. TM1629B_mie();
  74. TM1629B_COM(0x89);//顯示開,灰度2/16
  75. }

  76. void delay(int x)
  77. {
  78. uint i,j;
  79. for(i=x;i>0;i--)
  80. for(j=1100;j>0;j--);
  81. }

  82. void init_ADC(void);    //ADC初始化
  83. uint get_ADC_qw(void);  //獲取氣味AD結果
  84. void SC09A(void);//按鍵掃描

  85. uint a,b;//定時、風速
  86. bit g;//開機
  87. bit qh;//切換標志位

  88. uint num;            //時間定時

  89. uchar ir;           //紅外線用
  90. uint startflag;
  91. uint bitnum;
  92. uchar irjsok,irjmok;
  93. uchar ircode[4];
  94. uchar irdata[33];

  95. void irjm(void)                   //把ir時間值解碼
  96. {
  97. uchar k,i,j;
  98. uchar value;
  99. k=1;
  100. for(j=0;j<4;j++)
  101. {
  102. for(i=0;i<8;i++)
  103. {
  104. value=value>>1;       //移位保存
  105. if(irdata[k]>6)      //判斷值1或0
  106. {
  107. value=value|0x80;
  108. }
  109. k++;
  110. }
  111. ircode[j]=value;
  112. irjmok=1;
  113. }
  114. }

  115. void irkz(void)         //一個碼值對應一個控制
  116. {
  117. if(ircode[1]==0xFF)
  118.     {       
  119. if(ircode[2]==0x09)//第1個按鈕,開關
  120. {
  121. fmq=1;
  122. delay(15);
  123. fmq=0;
  124. g=~g;         
  125. a=0;//開機復位,定時燈全滅
  126. b=1;//開機低速運行       
  127. if(g==1)
  128. {
  129. zzshu=0;
  130. fzshu=1000;
  131. }
  132. else
  133. {
  134.    zzshu=1000;
  135. fzshu=0;
  136. }
  137. }

  138. if(g==1)              //防止關機時,按鍵有聲音
  139. {       
  140. if(ircode[2]==0x11) //第2個按鈕,風速
  141. {
  142. fmq=1;
  143. delay(15);
  144. fmq=0;       
  145. b++;
  146. if(b>3)//風速循環
  147. {
  148. b=1;
  149. }       
  150. }

  151. if(ircode[2]==0x19)//第3個按鈕,加濕
  152. {
  153. fmq=1;
  154. delay(15);
  155. fmq=0;

  156. kzj=~kzj;
  157. ledj=~ledj;//加濕指示燈
  158. }
  159. if(ircode[2]==0x17)//第4個按鈕,負離子
  160. {
  161. fmq=1;
  162. delay(15);
  163. fmq=0;

  164. ledf=~ledf;
  165. kzf=~kzf;
  166. }

  167. if(ircode[2]==0x16) //第5個按鈕,定時
  168. {
  169. fmq=1;
  170. delay(15);
  171. fmq=0;

  172. a=a+60;
  173.        if(a>360)
  174.    {
  175. a=0;
  176. }
  177. qh=1;//按定時按鈕,顯示自動切換成定時
  178. }       

  179. if(ircode[2]==0x04) //第6個按鈕,切換
  180. {
  181. fmq=1;
  182. delay(15);
  183. fmq=0;

  184. qh=~qh;
  185. }
  186. }//if(g==1)
  187. }//if(ircode[1]==0xFF)
  188. }//irkz

  189. void main()
  190. {
  191. uint t;//ADC采樣時間控制

  192. P3M1=0;//P3.0強推挽輸出
  193. P3M0=0x01;

  194. fmq=1;//上電響
  195. delay(50);
  196. fmq=0;

  197.   delay(350);//電壓穩定再進行IAP操作

  198. init_ADC();  
  199.     TM1629B_init();

  200. TMOD=0x12;//定時器1為方式1,定時器0為方式2
  201. EA=1;
  202. TH1=(65535-45872)/256;
  203. TL1=(65535-45872)%256;
  204. ET1=1;
  205. TH0=0x00;
  206. TL0=0x00;
  207. ET0=1;
  208. TR0=1;
  209. TR1=1;    //定時器1開,定時、濾網時間共用
  210. IT1=1;    //外部中斷1設置
  211. EX1=1;    //外部中斷1允許
  212. IT0=1;    //外部中斷0設置
  213. EX0=1;    //外部中斷0允許

  214. while(1)
  215. {

  216. if(irjsok)  //紅外程序,用遙控器按鈕6解除濾網報警
  217. {
  218.    irjm();
  219.        irjsok=0;
  220. }

  221.   if(irjmok)
  222. {
  223. irkz();
  224. irjmok=0;
  225. }
  226. //-----------------------------------------
  227. SC09A();//按鍵掃描
  228. //-----------------------------------------
  229. if(zzshu<150)//正轉150個脈沖
  230. {
  231.    int i;
  232.    zzshu++;
  233. for(i=0;i<4;i++)
  234. {
  235. P1=P1&0x0f;       
  236.         P1=P1|zheng[i];
  237.   delay(8);//
  238. }
  239. }
  240. else
  241. {
  242. P1=P1&0x0f;       
  243. }

  244. if(fzshu<150)//反轉150個脈沖
  245. {
  246.    int i;
  247.    fzshu++;
  248. for(i=0;i<4;i++)
  249. {
  250. P1=P1&0x0f;
  251.   P1=P1|fan[i];
  252.   delay(8);//
  253. }       
  254. }
  255. else
  256. {
  257. P1=P1&0x0f;       
  258. }
  259. //---------------------------------------------
  260.         if(a==1)
  261. {
  262. if(num>1100)     //最后1分鐘算做55秒
  263. {
  264. g=0;
  265. a=0;//定時時間到關機,為了區別手動按到0值時不能關機
  266. }     
  267. }

  268.                 //紅外線測試時加g=1

  269.         if(g==1)//開機時,執行以下程序
  270.         {
  271. if(a!=0) //定時器T0開始工作
  272. {  
  273. if(num>1205)//設置定時時間,1分鐘設置為1205
  274.        {
  275. num=0;
  276.    a--;
  277. }
  278. }

  279. if(a==0)//a=0時,一直保持num值加不上去
  280. {
  281. num=0;
  282.    }


  283. if(qh==1)
  284. {
  285. ledkq=1;
  286. ledds=0;
  287. }
  288. else
  289. {
  290. ledkq=0;
  291. ledds=1;
  292. }

  293.     if(b==1)//低速
  294.    {
  295. kzd=0;        //低風
  296. kzz=1;     
  297. kzg=1;

  298.          ledd=0;
  299. ledz=1;
  300. ledg=1;
  301. }
  302.        if(b==2)//中速
  303.    {
  304. kzd=1;     //中風
  305. kzz=0;     
  306. kzg=1;

  307.          ledd=1;
  308. ledz=0;
  309. ledg=1;
  310. }
  311.        if(b==3)//高速
  312.    {
  313. kzd=1;     //高風
  314. kzz=1;     
  315. kzg=0;

  316.                 ledd=1;
  317. ledz=1;
  318. ledg=0;       
  319. }       

  320. TM1629B_COM(0x00);//顯示模式
  321. TM1629B_COM(0x44);//寫數據、固定地址
  322. stb=0;
  323. TM1629B_xie(0xc0);    //地址命令設置00H,這是個位
  324.        TM1629B_xie(table[TM_0]);
  325. stb=1;
  326. stb=0;
  327. TM1629B_xie(0xc2);    //地址命令設置02H,這是十位
  328.        TM1629B_xie(table[TM_2]);
  329. stb=1;
  330. stb=0;
  331. TM1629B_xie(0xc4);    //地址命令設置04H,這是百位
  332.        TM1629B_xie(table[TM_4]);
  333. stb=1;
  334. TM1629B_COM(0x89);//顯示開,灰度2/16

  335. }
  336. else//g不等于1時,關閉輸出
  337. {
  338. kzd=1;      //低速控制
  339. kzz=1;      //中速控制
  340. kzg=1;      //高速控制
  341. kzf=1;      //負離子控制
  342. kzj=1;      //加濕控制

  343. ledd=1;//低速指示燈
  344. ledz=1;//中速指示燈
  345. ledg=1;//高速指示燈
  346. ledj=1;//加濕指示燈
  347. ledf=1;//負離子指示燈
  348. ledkq=1;//空氣質量指示燈
  349. ledds=1;//定時指示燈   
  350. qh=0;      //開機顯示空氣質量

  351. TM1629B_COM(0x00);//關閉屏幕操作
  352. TM1629B_COM(0x40);
  353. TM1629B_mie();
  354. TM1629B_COM(0x89);
  355. }

  356.               
  357. qwcaiji=qwcaiji+get_ADC_qw();       
  358. t++;       
  359. if(t==200)                  //調整模擬量處理的時間間隔
  360. {
  361. qw=qwcaiji/200;      //平均濾波
  362. t=0;
  363. qwcaiji=0;
  364. }

  365. if(qh==1)                   //空氣質量與定時切換顯示
  366. {
  367. TM_0=a%10;
  368. TM_2=a%100/10;
  369. TM_4=a/100;
  370. }
  371. else
  372. {
  373. TM_0=qw%10;      
  374. TM_2=qw%100/10;
  375. TM_4=qw/100;       
  376. }
  377.     }//while
  378. }//main

  379. void T1_time() interrupt 3           //定時、濾網用
  380. {
  381. TH1=(65535-45872)/256;
  382. TL1=(65535-45872)%256;
  383. num++;
  384. }

  385. void timer0() interrupt 1       //紅外程序用
  386. {
  387. ir++;                       //一個周期ir值=0.278ms       
  388. }

  389. void int1() interrupt 2     //INT1下降沿接收紅外信號
  390. {
  391. if(startflag)
  392. {
  393. if(ir>42)//檢測引導嗎
  394. {
  395. bitnum=0;
  396. }          
  397. irdata[bitnum]=ir;
  398. ir=0;
  399. bitnum++;
  400. if(bitnum==33)
  401. {
  402. bitnum=0;
  403. irjsok=1;
  404. startflag=0;       
  405. }
  406. }
  407. else
  408. {
  409. startflag=1;
  410. ir=0;
  411. }
  412. }



  413. void init_ADC(void)
  414. {  
  415. P1ASF    =0x01;    //選擇P1.0通道
  416. ADC_RES  =0;       //清理結果寄存器的值  
  417. ADC_CONTR=0x80;    //開啟電源、540個時鐘、選用P1.0口
  418. _nop_();  
  419. _nop_();
  420. _nop_();  
  421. _nop_();
  422. }

  423. void SC09A(void)
  424. {
  425. if(key==0x0020)//開關
  426. {
  427. fmq=1;
  428. delay(15);
  429. fmq=0;

  430. g=~g;         
  431. a=0;//開機復位,定時燈全滅
  432. b=1;//開機低速運行
  433. if(g==1)
  434. {
  435. zzshu=0;
  436. fzshu=1000;
  437. }
  438. else
  439. {
  440.    zzshu=1000;
  441. fzshu=0;
  442. }
  443. key=0;
  444. }
  445. if(g==1)
  446. {
  447. if(key==0x1000)//風速
  448. {
  449. fmq=1;
  450. delay(15);
  451. fmq=0;       
  452. b++;
  453. if(b>3)//風速循環
  454. {
  455. b=1;
  456. }       

  457. key=0;
  458. }
  459. if(key==0x0800)//加濕
  460. {
  461. fmq=1;
  462. delay(15);
  463. fmq=0;

  464. kzj=~kzj;
  465. ledj=~ledj;//加濕指示燈

  466. key=0;
  467. }
  468. if(key==0x0400)//負離子
  469. {
  470. fmq=1;
  471. delay(15);
  472. fmq=0;

  473. ledf=~ledf;
  474. kzf=~kzf;

  475. key=0;
  476. }
  477. if(key==0x0080)//定時
  478. {
  479. fmq=1;
  480. delay(15);
  481. fmq=0;

  482. a=a+60;
  483.        if(a>360)
  484.    {
  485. a=0;
  486. }
  487. qh=1;//按定時按鈕,顯示自動切換成定時

  488. key=0;
  489. }

  490. if(key==0x0040)//切換
  491. {
  492. fmq=1;
  493. delay(15);
  494. fmq=0;

  495. qh=~qh;

  496. key=0;
  497. }
  498. }//        if(g==1)
  499. }
  500.   
  501. uint get_ADC_qw(void)
  502. {  
  503.      uchar mn=0;  
  504.      ADC_CONTR=0X88; //開電源、開始轉換ADC_START=1,選擇P1.0
  505.      _nop_();  
  506.      _nop_();
  507.      _nop_();  
  508.      _nop_();  
  509.      while(!(ADC_CONTR&0X10)); //轉換結束ADC_FLAG=1
  510. mn=ADC_RES;
  511.      ADC_CONTR&=~0X10;         //ADC_FLAG清零
  512.      _nop_();  
  513.      _nop_();
  514.      _nop_();  
  515.      _nop_();   
  516.      return mn;
  517. }  

  518. void int0() interrupt 0     //INT0下降沿接收SC09A
  519. {
  520. uchar i,j,temp;
  521. uchar dizi=0x81;
  522. uint keyzhi=0xffff;
  523. bit bit_temp;

  524. EA=0; // 屏蔽全局中斷
  525. SCL=1;
  526. for(i=0;i<50;i++){}          //延時
  527. SDA=0;                       // 拉低SDA,端口送出START 信號
  528. for(i=0;i<50;i++){}          //延時

  529. for(j=0;j<8;j++)//發送8位地址
  530. {       
  531. SCL=0;
  532. temp=dizi&0x80;
  533. for(i=0;i<50;i++){}          //延時
  534. if(temp==0x80)
  535. SDA=1;
  536. else
  537. SDA=0;
  538. dizi=dizi<<1;
  539. for(i=0;i<50;i++){}          //延時
  540. SCL=1;
  541. for(i=0;i<50;i++){}          //延時
  542. }

  543. SDA=1; //釋放SDA 端口,將SDA設置為輸入端口
  544. SCL=0;
  545. for(i=0;i<50;i++){}          //延時
  546. SCL=1;
  547. for(i=0;i<50;i++){}          //延時

  548. //此處讀ack回應,不做處理


  549. //讀16位按鍵數據
  550. for(j=0;j<16;j++)
  551. {
  552. SCL=0;
  553. for(i=0;i<50;i++){}          //延時
  554. SCL=1;
  555. for(i=0;i<50;i++){}          //延時
  556. bit_temp=SDA;
  557. if(bit_temp)
  558. {
  559. keyzhi=keyzhi<<1;
  560. keyzhi=keyzhi|0x01;
  561. }
  562. else
  563. {
  564. keyzhi=keyzhi<<1;
  565. }
  566. }

  567. SCL=0;
  568. SDA=1;
  569. for(i=0;i<50;i++){}          //延時
  570. SCL=1;
  571. for(i=0;i<50;i++){}          //延時
  572. SCL=0;
  573. SDA=0; //發送 NACK 信號
  574. for(i=0;i<50;i++){}          //延時
  575. SCL=1;
  576. for(i=0;i<50;i++){}          //延時
  577. SDA=1; //結束

  578. key=keyzhi^0xffff;//異或

  579. EA=1; //全局中斷使能
  580. /*
  581. CIN0   0x1000     S1風速
  582. CIN1   0x0800     S2加濕
  583. CIN2   0x0400     S3負離子
  584. CIN5   0x0080     S4定時
  585. CIN6   0x0040     S5切換
  586. CIN7   0x0020     S6開關
  587. */
  588. }
復制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:88606 發表于 2018-1-13 09:23 | 只看該作者
能看看電路原理圖嗎?
回復

使用道具 舉報

板凳
ID:371662 發表于 2018-7-14 21:45 | 只看該作者
你好!可以共享學習加濕器程序?QQ:2362034
回復

使用道具 舉報

地板
ID:619604 發表于 2019-12-11 19:56 | 只看該作者
看看產品電路原理圖
回復

使用道具 舉報

5#
ID:108573 發表于 2020-2-22 10:28 | 只看該作者
沒有原理圖,程序看不懂
回復

使用道具 舉報

6#
ID:97678 發表于 2020-2-23 14:05 | 只看該作者
能夠提供電氣原理圖嗎?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲综合大片69999 | 日韩高清中文字幕 | 欧美激情国产精品 | 成人免费av| 亚洲成人一区 | 精品国产精品三级精品av网址 | 午夜理伦三级理论三级在线观看 | 欧美一级精品片在线看 | 国产午夜高清 | 一级毛片视频 | 国产一区2区 | 欧美激情精品久久久久 | 日韩在线一区二区三区 | 日本久久久久久 | 国产天天操 | 天天操天天干天天爽 | 欧美激情精品久久久久 | 久操亚洲 | 亚洲在线一区二区 | 国产精品一区二区三 | 日韩欧美高清dvd碟片 | 日韩在线免费播放 | 欧美成人精品一区二区男人看 | 毛片在线看片 | 给我免费的视频在线观看 | 国产欧美二区 | 99亚洲精品视频 | av片在线观看网站 | 免费精品视频在线观看 | 午夜免费视频观看 | 国产精品毛片一区二区三区 | 亚洲日产精品 | 国产精品资源在线 | 欧美一级在线观看 | 蜜桃av一区二区三区 | 免费毛片网站 | 久久精品国产久精国产 | 亚洲高清av在线 | 围产精品久久久久久久 | 91超碰在线观看 | 成人av免费看|