找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 8935|回復(fù): 16
打印 上一主題 下一主題
收起左側(cè)

用單片機(jī)開(kāi)發(fā)板做溫控風(fēng)扇PWM調(diào)速 源程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
能夠利用PWM調(diào)速原理實(shí)現(xiàn)對(duì)系統(tǒng)的控制對(duì)象(直流電機(jī))進(jìn)行轉(zhuǎn)速控制,當(dāng)溫度低于系統(tǒng)設(shè)置溫度下限時(shí)直流電機(jī)停止工作,到達(dá)設(shè)置溫度的下限和上限之間時(shí)以1檔的速度工作,當(dāng)溫度高于系統(tǒng)設(shè)置溫度上限時(shí)直流電機(jī)全速工作其中上下限溫度可以在數(shù)碼管上人工設(shè)置,數(shù)碼管上能夠顯示當(dāng)前的實(shí)時(shí)溫度。

單片機(jī)源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>                         //包含頭文件
  3. typedef unsigned int u16;          //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義 ,用u16表示 unsigned int
  4. typedef unsigned char u8;         //                用 u8表示  unsigned char

  5. /**定義各引腳**/
  6. sbit led=P2^0;//led
  7. sbit dj=P1^0;//電機(jī)
  8. sbit DQ=P3^7;//溫度傳感器
  9. //////////按鍵接口/////////////////////////////////
  10. sbit key1=P3^1;//設(shè)置溫度
  11. sbit key2=P3^0;//溫度加
  12. sbit key3=P3^2;//溫度減
  13. ///////////數(shù)碼管的四個(gè)位/////////////////////////////
  14. sbit LSA=P2^2;
  15. sbit LSB=P2^3;
  16. sbit LSC=P2^4;
  17.                           
  18. /*****共陰數(shù)碼管段選*****/
  19. u8 table[22]=
  20. {0x3F,0x06,0x5B,0x4F,0x66,
  21. 0x6D,0x7D,0x07,0x7F,0x6F,
  22. 0x77,0x7C,0x39,0x5E,0x79,0x71,
  23. 0x40,0x38,0x76,0x00,0xff,0x37};//'-',L,H,滅,全亮,n         16-21

  24. /***定義各變量***/
  25. u16 wen_du;//溫度變量  
  26. u16 shang,xia; //對(duì)比溫度暫存變量
  27. u8 dang;//檔位顯示
  28. u8 flag;         //標(biāo)志位
  29. u8 d1,d2,d3;//顯示數(shù)據(jù)暫存變量
  30. u8 j        ;

  31. /***延時(shí)函數(shù)***/
  32. void delay(u16 ms)                //延時(shí)函數(shù),大約延時(shí)25us
  33. {
  34.         u8 x;
  35.         for(ms;ms>0;ms--)
  36.                 for(x=10;x>0;x--);
  37. }


  38. /***********ds18b20延遲子函數(shù)(晶振12MHz )*******/
  39. void delay_18B20(u16 i)
  40. {
  41.         while(i--);
  42. }
  43. /**********ds18b20初始化函數(shù)**********************/
  44. void Init_DS18B20()
  45. {
  46.          u8 x=0;
  47.          DQ=1;          //DQ復(fù)位
  48.          delay_18B20(8);  //稍做延時(shí)
  49.          DQ=0;          //單片機(jī)將DQ拉低
  50.          delay_18B20(80); //精確延時(shí) 大于 480us
  51.          DQ=1;          //拉高總線
  52.          delay_18B20(14);
  53.          x=DQ;            //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
  54.          delay_18B20(20);
  55. }
  56. /***********ds18b20讀一個(gè)字節(jié)**************/  
  57. u8 ReadOneChar()
  58. {
  59.         u8 i=0;
  60.         u8 dat=0;
  61.         for (i=8;i>0;i--)
  62.          {
  63.                   DQ=0; // 給脈沖信號(hào)
  64.                   dat>>=1;
  65.                   DQ=1; // 給脈沖信號(hào)
  66.                   if(DQ)
  67.                   dat|=0x80;
  68.                   delay_18B20(4);
  69.          }
  70.          return(dat);
  71. }
  72. /*************ds18b20寫一個(gè)字節(jié)****************/  
  73. void WriteOneChar(u8 dat)
  74. {
  75.          u8 i=0;
  76.          for (i=8;i>0;i--)
  77.          {
  78.                   DQ=0;
  79.                  DQ=dat&0x01;
  80.             delay_18B20(5);
  81.                  DQ=1;
  82.             dat>>=1;
  83.         }
  84. }
  85. /**************讀取ds18b20當(dāng)前溫度************/
  86. void ReadTemperature()
  87. {
  88.         u8 a=0;
  89.         u8 b=0;
  90.         u8 t=0;
  91.         Init_DS18B20();
  92.         WriteOneChar(0xCC);            // 跳過(guò)讀序號(hào)列號(hào)的操作
  93.         WriteOneChar(0x44);         // 啟動(dòng)溫度轉(zhuǎn)換
  94.         delay_18B20(100);       // this message is wery important
  95.         Init_DS18B20();
  96.         WriteOneChar(0xCC);         //跳過(guò)讀序號(hào)列號(hào)的操作
  97.         WriteOneChar(0xBE);         //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
  98.         delay_18B20(100);
  99.         a=ReadOneChar();            //讀取溫度值低位
  100.         b=ReadOneChar();                   //讀取溫度值高位
  101.         wen_du=((b*256+a)>>4);    //當(dāng)前采集溫度值除16得實(shí)際溫度值
  102. }


  103. /***數(shù)碼管顯示函數(shù)***/
  104. void display()//顯示溫度
  105. {
  106.         LSA=1;LSB=1;LSC=0;P0=table[d1];delay(10); //第1位
  107.         P0=0x00;LSA=1;LSB=1;LSC=1;delay(1);
  108.          
  109.         LSA=0;LSB=1;LSC=0;P0=table[16];delay(10);//第2位
  110.         P0=0x00;LSA=1;LSB=1;LSC=1;delay(1);

  111.         LSA=1;LSB=0;LSC=0;P0=table[d2]; delay(10);//第3位
  112.         P0=0x00;LSA=1;LSB=1;LSC=1;delay(1);

  113.         LSA=0;LSB=0;LSC=0;P0=table[d3];delay(10);//第4位
  114.         P0=0x00;LSA=1;LSB=1;LSC=1;delay(1);
  115. }


  116. /***鍵盤自動(dòng)掃描及消抖***/
  117. /***以及功能***/
  118. void zi_keyscan()//自動(dòng)模式按鍵掃描函數(shù)
  119. {
  120.         if(key1==0)                                                          //設(shè)置鍵按下
  121.         {
  122.                 delay(30);                                                  //延時(shí)去抖
  123.                 if(key1==0)flag=1;                                  //再次判斷按鍵,按下的話進(jìn)入設(shè)置狀態(tài)
  124.                 while(key1==0);//松手檢測(cè)                  //按鍵釋放
  125.         }
  126.         while(flag==1)                                                  //進(jìn)入設(shè)置上限狀態(tài)
  127.         {
  128.                 d1=18;d2=shang/10;d3=shang%10;          //顯示字母H 和上限溫度值
  129.                 display();                                                  //調(diào)用顯示函數(shù)
  130.                 if(key1==0)                                                  //判斷設(shè)置鍵是否按下
  131.                 {
  132.                         delay(30);                                          //延時(shí)去抖
  133.                         if(key1==0)flag=2;                          //按鍵按下,進(jìn)入設(shè)置下限模式
  134.                         while(key1==0);//松手檢測(cè)
  135.                 }
  136.                 if(key2==0)                                                  //加鍵按下
  137.                 {
  138.                         delay(30);                                          //延時(shí)去抖
  139.                         if(key2==0)                                          //加鍵按下
  140.                         {
  141.                                 shang+=5;                                  //上限加5
  142.                                 if(shang>=100)shang=100;  //上限最大加到100
  143.                         }while(key2==0);//松手檢測(cè)
  144.                 }
  145.                 if(key3==0)                                                  //減鍵按下
  146.                 {
  147.                         delay(30);                                          //延時(shí)去抖
  148.                         if(key3==0)                                          //減鍵按下
  149.                         {
  150.                                 shang-=1;                                  //上限減1
  151.                                 if(shang<=10)shang=10;          //上限最小減到10
  152.                         }while(key3==0);//松手檢測(cè)
  153.                 }               
  154.         }
  155.         while(flag==2)                                                  //設(shè)置下限
  156.         {
  157.                 d1=17;d2=xia/10;d3=xia%10;                  //顯示字母L 顯示下限溫度值
  158.                 display();                                                  //注釋同上
  159.                 if(key1==0)
  160.                 {
  161.                         delay(30);
  162.                         if(key1==0)flag=0;
  163.                         while(key1==0);//松手檢測(cè)
  164.                 }
  165.                 if(key2==0)
  166.                 {
  167.                         delay(30);
  168.                         if(key2==0)
  169.                         {
  170.                                 xia+=5;
  171.                                 if(xia>=95)xia=95;        
  172.                         }while(key2==0);//松手檢測(cè)
  173.                 }
  174.                 if(key3==0)
  175.                 {
  176.                         delay(30);
  177.                         if(key3==0)
  178.                         {
  179.                                 xia-=1;
  180.                                 if(xia<=0)xia=0;        
  181.                         }while(key3==0);//松手檢測(cè)
  182.                 }               
  183.         }
  184. }


  185. /***數(shù)碼管顯示檔位及溫度***/
  186. /***鍵盤掃描***/
  187. /**根據(jù)按鍵顯示檔位及溫度**/
  188. /*PWM*/
  189. void zi_dong()//自動(dòng)溫控模式
  190. {
  191.         u8 i;
  192.         d1=dang;d2=wen_du/10;d3=wen_du%10;                //顯示檔位,顯示當(dāng)前溫度值
  193.         zi_keyscan();//按鍵掃描函數(shù)
  194.         display();         //調(diào)用顯示函數(shù)
  195.         if(wen_du<xia){dj=0;dang=0;}//低于下限  檔位為0 電機(jī)停止
  196.         if((wen_du>=xia)&&(wen_du<=shang))//溫度大于下限,小于上限  1擋
  197.         {
  198.                 dang=1;                                                                                        //檔位置1
  199.                 for(i=0;i<3;i++){dj=0;display();zi_keyscan();}        //PWM通過(guò)延時(shí)得到
  200.                 for(i=0;i<6;i++){dj=1;display();zi_keyscan();}               
  201.         }
  202.         if(wen_du>shang){dj=1;dang=2;}//高溫全速
  203. }


  204. /***主函數(shù)***/
  205. void main()                  //主函數(shù)
  206. {
  207.         led=0;//點(diǎn)亮led判斷單片機(jī)是否運(yùn)行
  208.         
  209.         dj=0;                  //電機(jī)開(kāi)
  210.         shang=22;
  211.         xia=19;                  //初始上下限值
  212.         for(j=0;j<80;j++)          //先讀取溫度值,防止開(kāi)機(jī)顯示85
  213.         ReadTemperature();
  214.         while(1)                          //進(jìn)入while循環(huán)
  215.         {        
  216.                 ReadTemperature();        //讀取溫度值
  217.                 for(j=0;j<100;j++)zi_dong();//自動(dòng)溫控模式
  218.         }
  219. }
復(fù)制代碼

Keil工程文件hex文件51hei提供下載(如果自己會(huì)編譯就不必下載了):
普中板子,溫控.zip (27.28 KB, 下載次數(shù): 131)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:684871 發(fā)表于 2021-1-10 11:14 來(lái)自手機(jī) | 只看該作者
用到的部分包括DS18B20,數(shù)碼管,ULN2003放大電路模塊,直流電機(jī)(小馬達(dá)))
回復(fù)

使用道具 舉報(bào)

板凳
ID:684871 發(fā)表于 2021-1-10 11:16 來(lái)自手機(jī) | 只看該作者
還有獨(dú)立按鍵
回復(fù)

使用道具 舉報(bào)

地板
ID:684871 發(fā)表于 2021-1-10 11:20 來(lái)自手機(jī) | 只看該作者
想要修改的話,也很簡(jiǎn)單。數(shù)碼管驅(qū)動(dòng)模塊用了138譯碼器,你們?nèi)绻挥,就把?shù)碼管顯示函數(shù)改一下。然后電機(jī)用了ULN2003。其他的你就響應(yīng)地修改一下引腳就好了

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

5#
ID:390416 發(fā)表于 2021-1-15 20:54 | 只看該作者

我前段時(shí)間就做過(guò)類似這種的,也是DS18B20測(cè)溫,控制電腦四線風(fēng)扇。OLED顯示。帶蜂鳴器警報(bào),莫爾斯代碼的那種。

你的這個(gè)DS18B20的初始化有死等,建議使用計(jì)數(shù)方式延遲。釋放CPU效率。
回復(fù)

使用道具 舉報(bào)

6#
ID:684871 發(fā)表于 2021-1-17 23:47 來(lái)自手機(jī) | 只看該作者
人人學(xué)會(huì)單片機(jī) 發(fā)表于 2021-1-15 20:54
我前段時(shí)間就做過(guò)類似這種的,也是DS18B20測(cè)溫,控制電腦四線風(fēng)扇。OLED顯示。帶蜂鳴器警報(bào),莫爾斯代碼 ...

好的,謝謝
回復(fù)

使用道具 舉報(bào)

7#
ID:991006 發(fā)表于 2022-5-19 11:56 | 只看該作者
yrx0203 發(fā)表于 2021-1-10 11:20
想要修改的話,也很簡(jiǎn)單。數(shù)碼管驅(qū)動(dòng)模塊用了138譯碼器,你們?nèi)绻挥茫桶褦?shù)碼管顯示函數(shù)改一下。然后電 ...

可以分享下原理圖嗎
回復(fù)

使用道具 舉報(bào)

8#
ID:97678 發(fā)表于 2022-5-19 15:36 | 只看該作者
yrx0203 發(fā)表于 2021-1-10 11:14
用到的部分包括DS18B20,數(shù)碼管,ULN2003放大電路模塊,直流電機(jī)(小馬達(dá)))

可以分享下原理圖嗎
回復(fù)

使用道具 舉報(bào)

9#
ID:684871 發(fā)表于 2022-5-26 11:07 來(lái)自手機(jī) | 只看該作者
jovew 發(fā)表于 2022-5-19 15:36
可以分享下原理圖嗎

好久之前做的,基于普中科技開(kāi)發(fā)板做的
回復(fù)

使用道具 舉報(bào)

10#
ID:333682 發(fā)表于 2023-3-4 09:33 | 只看該作者
原理圖呢
回復(fù)

使用道具 舉報(bào)

11#
ID:333682 發(fā)表于 2023-3-4 10:34 | 只看該作者
掉電要重新設(shè)置
回復(fù)

使用道具 舉報(bào)

12#
ID:1068245 發(fā)表于 2023-3-25 01:51 | 只看該作者
怎么分成多個(gè)檔位呀
回復(fù)

使用道具 舉報(bào)

13#
ID:684871 發(fā)表于 2024-1-8 22:11 來(lái)自手機(jī) | 只看該作者
郭志偉 發(fā)表于 2023-3-25 01:51
怎么分成多個(gè)檔位呀

軟件層實(shí)現(xiàn)多級(jí)pwm
回復(fù)

使用道具 舉報(bào)

14#
ID:1064915 發(fā)表于 2024-1-9 09:27 | 只看該作者



回復(fù)

使用道具 舉報(bào)

15#
ID:684871 發(fā)表于 2024-9-13 18:04 來(lái)自手機(jī) | 只看該作者
這是幾年前上學(xué)時(shí)做的,現(xiàn)在已經(jīng)工作了。如果大家感興趣可以就要,我可以搞一版復(fù)雜的功能和規(guī)范的代碼版
回復(fù)

使用道具 舉報(bào)

16#
ID:1131387 發(fā)表于 2024-9-14 08:51 | 只看該作者

這圖放大很模糊呢,有沒(méi)有清晰版的呢?
回復(fù)

使用道具 舉報(bào)

17#
ID:849826 發(fā)表于 2024-12-8 10:05 來(lái)自手機(jī) | 只看該作者
能不能改成驅(qū)動(dòng)高頻變壓器,實(shí)現(xiàn)多檔功率調(diào)節(jié),數(shù)碼管或者ole顯示功率,帶過(guò)流保護(hù)功能
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表