找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2997|回復: 2
打印 上一主題 下一主題
收起左側(cè)

51單片機的溫控風扇程序+元件清單等

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:479983 發(fā)表于 2019-6-12 19:07 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
一、        材料清單:
風扇電機;

紅外對管;

9012三極管;

51最小系統(tǒng)板(含51單片機);

7805穩(wěn)壓芯片;

杜邦線若干;

LCD1602;

紅外遙控器+接受頭;

熱釋電紅外傳感器

ds18b20溫度傳感器

二、        系統(tǒng)原理圖

三、        模塊功能
1.    紅外遙控器:

紅外遙控接收線,是紅外接收線的一種。外遙控接收線載波頻率為38KHZ 。廣泛應用于音響、電視機、機頂盒、衛(wèi)星接收器、等其它各種輔助延長遙控接收效果的產(chǎn)品!紅外遙控接收線是用于紅外遙控系統(tǒng)的一體化接收模塊,內(nèi)置PIN光敏二極管和前置放大器IC,實現(xiàn)紅外遙控信號的拾取、放大和解調(diào),檢波輸出信號可以直接由微處理器解碼。

2.    紅外傳感器:


紅外傳感器黑線的檢測原理是紅外發(fā)射管發(fā)射光線到路面,紅外光遇到白底則被反射,接收管接收到反射光,經(jīng)施密特觸發(fā)器整形后輸出低電平;當紅外光遇到黑線時則被吸收,接收管沒有接收到反射光

3.    51單片機:

AT89C51單片機是把那些作為控制應用所必需的基本內(nèi)容都集成在一個尺寸有限的集成電路芯片上。如果按功能劃分,它由如下功能部件組成,即微處理器(CPU)、數(shù)據(jù)存儲器(RAM)、程序存儲器(ROM)、并行I/O口(4個8位I/O口)、串行口、定時器/計數(shù)器、中斷系統(tǒng)及特殊功能寄存器。它們都是通過片內(nèi)單一總線連接而成,其基本結(jié)構(gòu)依舊是微處理器(CPU)加上外圍芯片的傳統(tǒng)結(jié)構(gòu)模式。但對各種功能部件的控制是采用特殊功能寄存器的集中控制方式,以實現(xiàn)不同的功能

4.    7805穩(wěn)壓:
7805三端穩(wěn)壓集成電路,顧名思義,三端IC是指這種穩(wěn)壓用的集成電路,只有三條引腳輸出,分別是輸入端、接地端和輸出端。

5.    9012三極管:
9012是非常常見的PNP型晶體三極管,在收音機以及各種放大電路中經(jīng)?吹剿瑧梅秶軓V,它是PNP型小功率三極管。該三極管由發(fā)射極、基極、集電極。

6.    熱釋電紅外傳感器:
熱釋電紅外傳感器主要是由一種高熱電系數(shù)的材料,如鋯鈦酸鉛系陶瓷、鉭酸鋰、硫酸三甘鈦等制成尺寸為2*1mm的探測元件。在每個探測器內(nèi)裝入一個或兩個探測元件,并將兩個探測元件以反極性串聯(lián),以抑制由于自身溫度升高而產(chǎn)生的干擾。由探測元件將探測并接收到的紅外輻射轉(zhuǎn)變成微弱的電壓信號,經(jīng)裝在探頭內(nèi)的場效應管放大后向外輸出。為了提高探測器的探測靈敏度以增大探測距離,一般在探測器的前方裝設一個菲涅爾透鏡,該透鏡用透明塑料制成,將透鏡的上、下兩部分各分成若干等份,制成一種具有特殊光學系統(tǒng)的透鏡,它和放大電路相配合,可將信號放大70分貝以上,這樣就可以測出10~20米范圍內(nèi)人的行動。品種全、型號多,可供選擇的余地大。應用于人體感應開關(guān)、報警器等自動開關(guān)領(lǐng)域。

7.    LCD1602:
LCD1602是一種工業(yè)字符型液晶,能夠同時顯示16x02即32個字符。LCD1602液晶顯示的原理是利用液晶的物理特性,通過電壓對其顯示區(qū)域進行控制,即可以顯示出圖形。

8.    Ds18b20溫度傳感器
DS18B20是常用的數(shù)字溫度傳感器,其輸出的是數(shù)字信號,具有體積小,硬件開銷低,抗干擾能力強,精度高的特點 DS18B20數(shù)字溫度傳感器接線方便,封裝成后可應用于多種場合。

耐磨耐碰,體積小,使用方便,封裝形式多樣,適用于各種狹小空間設備數(shù)字測溫和控制領(lǐng)域。

單片機源程序如下:
  1. /*******************************************************************************
  2. * 實驗名                           :溫度顯示實驗
  3. * 使用的IO             :
  4. * 實驗效果       :1602顯示溫度
  5. *        注意                                         :
  6. *******************************************************************************/
  7. #include<reg51.h>
  8. #include"lcd.h"
  9. #include"temp.h"
  10. typedef unsigned int u16;          //對數(shù)據(jù)類型進行聲明定義
  11. typedef unsigned char u8;
  12. uchar xiao=29,da=32;
  13. sbit hong=P3^6;
  14. sbit h=P2^4;
  15. int wendu;
  16. sbit t=P2^0;

  17. sbit K1=P1^2;
  18. sbit K2=P1^3;
  19. sbit K3=P1^4;
  20. sbit K4=P1^5;
  21. uchar CNCHAR[6] = "攝氏度";
  22. //unsigned char datae[] = {0, 0, 0, 0};
  23. void LcdDisplay(int);
  24. void dianji();
  25. void dianji_1();
  26. void key() ;

  27. sbit IRIN=P3^2;

  28. u8 IrValue[6];
  29. u8 Time;
  30. int x=0;

  31. /*******************************************************************************
  32. * 函 數(shù) 名         : delay
  33. * 函數(shù)功能                   : 延時函數(shù),i=1時,大約延時10us
  34. *******************************************************************************/
  35. void delay_1(u16 i)
  36. {
  37.         while(i--);        
  38. }




  39. /*******************************************************************************
  40. * 函數(shù)名         : IrInit()
  41. * 函數(shù)功能                   : 初始化紅外線接收
  42. * 輸入           : 無
  43. * 輸出                  : 無
  44. *******************************************************************************/

  45. void IrInit()
  46. {
  47.         IT0=1;//下降沿觸發(fā)
  48.         EX0=1;//打開中斷0允許
  49.         EA=1;        //打開總中斷
  50.         IRIN=1;//初始化端口
  51. }


  52. /*******************************************************************************
  53. * 函 數(shù) 名       : main
  54. * 函數(shù)功能                 : 主函數(shù)
  55. * 輸    入       : 無
  56. * 輸    出             : 無
  57. *******************************************************************************/

  58. /*******************************************************************************
  59. * 函數(shù)名         : ReadIr()
  60. * 函數(shù)功能                   : 讀取紅外數(shù)值的中斷函數(shù)
  61. * 輸入           : 無
  62. * 輸出                  : 無
  63. *******************************************************************************/

  64. void ReadIr() interrupt 0
  65. {
  66.         u8 j,k;
  67.         u16 err;
  68.         Time=0;                                         
  69.         delay_1(700);        //7ms
  70.         if(IRIN==0)                //確認是否真的接收到正確的信號
  71.         {         
  72.                
  73.                 err=1000;                                //1000*10us=10ms,超過說明接收到錯誤的信號
  74.                 /*當兩個條件都為真是循環(huán),如果有一個條件為假的時候跳出循環(huán),免得程序出錯的時
  75.                 侯,程序死在這里*/        
  76.                 while((IRIN==0)&&(err>0))        //等待前面9ms的低電平過去                  
  77.                 {                        
  78.                         delay_1(1);
  79.                         err--;
  80.                 }
  81.                 if(IRIN==1)                        //如果正確等到9ms低電平
  82.                 {
  83.                         err=500;
  84.                         while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高電平過去
  85.                         {
  86.                                 delay_1(1);
  87.                                 err--;
  88.                         }
  89.                         for(k=0;k<4;k++)                //共有4組數(shù)據(jù)
  90.                         {                                
  91.                                 for(j=0;j<8;j++)        //接收一組數(shù)據(jù)
  92.                                 {

  93.                                         err=60;               
  94.                                         while((IRIN==0)&&(err>0))//等待信號前面的560us低電平過去
  95.                                         {
  96.                                                 delay_1(1);
  97.                                                 err--;
  98.                                         }
  99.                                         err=500;
  100.                                         while((IRIN==1)&&(err>0))         //計算高電平的時間長度。
  101.                                         {
  102.                                                 delay_1(10);         //0.1ms
  103.                                                 Time++;
  104.                                                 err--;
  105.                                                 if(Time>30)
  106.                                                 {
  107.                                                         return;
  108.                                                 }
  109.                                         }
  110.                                         IrValue[k]>>=1;         //k表示第幾組數(shù)據(jù)
  111.                                         if(Time>=8)                        //如果高電平出現(xiàn)大于565us,那么是1
  112.                                         {
  113.                                                 IrValue[k]|=0x80;
  114.                                         }
  115.                                         Time=0;                //用完時間要重新賦值                                                        
  116.                                 }
  117.                         }
  118.                 }
  119.                 if(IrValue[2]!=~IrValue[3])
  120.                 {
  121.                         return;
  122.                 }
  123.         }                        
  124. }

  125. /*******************************************************************************
  126. * 函數(shù)名         : main
  127. * 函數(shù)功能                   : 主函數(shù)
  128. * 輸入           : 無
  129. * 輸出                  : 無
  130. *******************************************************************************/

  131. void delay(uchar ms)
  132. {       // 延時子程序
  133.          uchar i ;
  134.          while(ms--)
  135.          {
  136.                   for(i = 0 ; i<250;i++) ;
  137.          }
  138. }

  139. void main()
  140. {
  141.         IrInit();
  142.         LcdInit();                         //初始化LCD1602
  143.         while(1)
  144.         {
  145.              key();
  146.             dianji();
  147.                 LcdDisplay(Ds18b20ReadTemp());
  148.          if(IrValue[2]==0x5A)
  149.                 {
  150.                 delay_1(500);
  151.                 if(IrValue[2]==0x5A)
  152.         {xiao=xiao+1;
  153.                  if(xiao>=da)
  154.                  { xiao=da-1;}
  155.         
  156.                 IrValue[2]=0x00;
  157.                 }
  158.                 }        
  159.                 if(IrValue[2]==0x08)
  160.                 {
  161.                 delay_1(500);
  162.                 if(IrValue[2]==0x08)
  163.         {xiao=xiao-1;
  164.                 IrValue[2]=0x00;
  165.                 }
  166.                 }                        
  167.                
  168.                
  169.                
  170.                 if(IrValue[2]==0x18)
  171.                 {
  172.                 delay_1(500);
  173.                 if(IrValue[2]==0x18)
  174.         {da=da+1;
  175.                 IrValue[2]=0x00;
  176.                 }
  177.                 }        
  178.                 if(IrValue[2]==0x52)
  179.                 {
  180.                 delay_1(500);
  181.                 if(IrValue[2]==0x52)
  182.         {da=da-1;
  183.                 if(da<=xiao)
  184.                 { da=xiao+1;}
  185.                 IrValue[2]=0x00;
  186.                 }
  187.                 }                        
  188.                                        
  189.                 }}

  190. /*******************************************************************************
  191. * 函數(shù)名         : LcdDisplay()
  192. * 函數(shù)功能                   : LCD顯示讀取到的溫度
  193. * 輸入           : v
  194. * 輸出                  : 無
  195. *******************************************************************************/

  196. void LcdDisplay(int temp)          //lcd顯示
  197. {
  198.    
  199.           unsigned char i, datas[] = {0, 0, 0, 0, 0},datae[] = {0, 0, 0, 0}; //定義數(shù)組
  200.         float tp;  
  201.         if(temp< 0)                                //當溫度值為負數(shù)
  202.           {
  203.                   LcdWriteCom(0x80);                //寫地址 80表示初始地址
  204.                 SBUF='-';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  205.                 while(!TI);                                 //等待發(fā)送數(shù)據(jù)完成
  206.                 TI=0;                                                 //清除發(fā)送完成標志位
  207.             LcdWriteData('-');                  //顯示負
  208.                 //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
  209.                 temp=temp-1;
  210.                 temp=~temp;
  211.                 tp=temp;
  212.                 temp=tp*0.0625*100+0.5;        
  213.                 //留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
  214.                 //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  215.                 //算由?.5,還是在小數(shù)點后面。

  216.           }
  217.          else
  218.           {                        
  219.                   LcdWriteCom(0x82);                //寫地址 80表示初始地址
  220.             LcdWriteData('+');                 //顯示正
  221.                 SBUF='+';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  222.                 while(!TI);                                 //等待發(fā)送數(shù)據(jù)完成
  223.                 TI=0;                                                 //清除發(fā)送完成標志位
  224.                 tp=temp;//因為數(shù)據(jù)處理有小數(shù)點所以將溫度賦給一個浮點型變量
  225.                 //如果溫度是正的那么,那么正數(shù)的原碼就是補碼它本身
  226.                 temp=tp*0.0625*100+0.5;        
  227.                 //留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
  228.                 //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  229.                 //算加上0.5,還是在小數(shù)點后面。
  230.         }
  231.         wendu=temp/100;
  232.         datas[0] = temp / 10000;
  233.         datas[1] = temp % 10000 / 1000;
  234.         datas[2] = temp % 1000 / 100;
  235.         datas[3] = temp % 100 / 10;
  236.         datas[4] = temp % 10;

  237.         datae[0] = xiao/10;
  238.         datae[1] = xiao-datae[0]*10;
  239.         datae[2] = da/10;
  240.         datae[3] = da-datae[2]*10;

  241.         LcdWriteCom(0x80);                //寫地址 80+40表示初始地址
  242.         LcdWriteData('T');         

  243.         LcdWriteCom(0x80+0x40);                //寫地址 80+40表示初始地址
  244.         LcdWriteData('x');                 
  245.         LcdWriteCom(0x80+0x41);                //寫地址 80+40表示初始地址
  246.         LcdWriteData(':');
  247.          LcdWriteCom(0x80+0x44);                //寫地址 80+40表示初始地址
  248.         LcdWriteData(' ');         
  249.     LcdWriteCom(0x80+0x45);                //寫地址 80+40表示初始地址
  250.         LcdWriteData('s');                 
  251.         LcdWriteCom(0x80+0x46);                //寫地址 80+40表示初始地址
  252.         LcdWriteData(':');
  253.         
  254.         LcdWriteCom(0x80+0x42);                 //寫地址 80表示初始地址
  255.         LcdWriteData('0'+datae[0]); //十位
  256.         SBUF = '0'+datae[0];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  257.         while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
  258.         TI = 0;        
  259.         LcdWriteCom(0x80+0x43);                 //寫地址 80表示初始地址
  260.         LcdWriteData('0'+datae[1]); //ge位
  261.         SBUF = '0'+datae[1];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  262.         while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
  263.         TI = 0;        



  264.         LcdWriteCom(0x80+0x47);                 //寫地址 80表示初始地址
  265.         LcdWriteData('0'+datae[2]); //十位
  266.         SBUF = '0'+datae[0];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  267.         while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
  268.         TI = 0;        
  269.         LcdWriteCom(0x80+0x48);                 //寫地址 80表示初始地址
  270.         LcdWriteData('0'+datae[3]); //ge位
  271.         SBUF = '0'+datae[1];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  272.         while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
  273.         TI = 0;        



  274.         LcdWriteCom(0x81);                //寫地址 80表示初始地址
  275.         LcdWriteData(':');
  276.         
  277.         LcdWriteCom(0x8a);                //寫地址 80表示初始地址
  278.         LcdWriteData('C');                 

  279.         LcdWriteCom(0x83);                  //寫地址 80表示初始地址
  280.         LcdWriteData('0'+datas[0]); //百位
  281.         SBUF = '0'+datas[0];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  282.         while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
  283.         TI = 0;
  284.         
  285.         LcdWriteCom(0x84);                 //寫地址 80表示初始地址
  286.         LcdWriteData('0'+datas[1]); //十位
  287.         SBUF = '0'+datas[1];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  288.         while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
  289.         TI = 0;

  290.         LcdWriteCom(0x85);                //寫地址 80表示初始地址
  291.         LcdWriteData('0'+datas[2]); //個位
  292.         SBUF = '0'+datas[2];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  293.         while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
  294.         TI = 0;

  295.         LcdWriteCom(0x86);                //寫地址 80表示初始地址
  296.         LcdWriteData('.');                 //顯示 ‘.’
  297.         SBUF = '.';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  298.         while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
  299.         TI = 0;

  300.         LcdWriteCom(0x87);                 //寫地址 80表示初始地址
  301.         LcdWriteData('0'+datas[3]); //顯示小數(shù)點  
  302.         SBUF = '0'+datas[3];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  303.         while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
  304.         TI = 0;

  305.         LcdWriteCom(0x88);                 //寫地址 80表示初始地址
  306.         LcdWriteData('0'+datas[4]); //顯示小數(shù)點
  307.         SBUF = '0'+datas[4];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  308.         while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
  309.         TI = 0;
  310.         for(i=0; i<6; i++)
  311.         {
  312.                  SBUF = CNCHAR[i];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  313.                 while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
  314.                 TI = 0;
  315.         }         
  316. }

  317. /****************************************/
  318. void dianji_1()
  319. {
  320.      t=0;
  321.          delay(20);
  322.          t=1;
  323.          delay(30);
  324. }
  325. void dianji()
  326. {
  327.    if(hong==1||h==0)
  328.    {
  329.            if(wendu<xiao)
  330.         {
  331.          t=1;
  332.         }
  333.         else
  334.         
  335.         if(wendu>=xiao&&wendu<da)
  336.         {
  337. dianji_1();
  338.         }
  339.         else
  340.         if(wendu>=da)
  341.         {
  342.          t=0;
  343.         }
  344.    
  345.    
  346.    }
  347.    else
  348.    {
  349.             t=1;
  350.    }


  351. ……………………

  352. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有程序51hei提供下載(缺少原理圖 不要下載):
d.zip (54.1 KB, 下載次數(shù): 21)

評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:1 發(fā)表于 2019-6-13 06:32 | 只看該作者
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

板凳
ID:479983 發(fā)表于 2019-6-16 12:22 | 只看該作者
admin 發(fā)表于 2019-6-13 06:32
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)

已補全
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表