標(biāo)題: 單片機(jī)紅外感應(yīng)的溫控轉(zhuǎn)速型風(fēng)扇設(shè)計(jì)電路+源程序 [打印本頁(yè)]

作者: 啊豬豬    時(shí)間: 2020-7-20 21:28
標(biāo)題: 單片機(jī)紅外感應(yīng)的溫控轉(zhuǎn)速型風(fēng)扇設(shè)計(jì)電路+源程序


單片機(jī)源程序如下:
  1. #include<reg52.h>

  2. sbit IN1=P2^7;
  3. sbit IN2=P2^6;
  4. sbit ENA=P2^5;

  5. bit flag1s=0;//1s定時(shí)標(biāo)志
  6. unsigned char T0RH=0;
  7. unsigned char T0RL=0;

  8. int temp;//讀取到的當(dāng)前溫度值
  9. unsigned char len;
  10. int intT,decT;//溫度值的整數(shù)和小數(shù)部分
  11. unsigned char str[12];

  12. void Compare();
  13. void GetTemp();
  14. void ConfigTimer0(unsigned int ms);
  15. unsigned char IntToString(unsigned char *str,int dat);
  16. extern bit Start18B20();
  17. extern bit Get18B20Temp(int *temp);
  18. extern void InitLcd1602();
  19. extern void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str);

  20. void main()
  21. {
  22.         bit res;

  23.         EA=1;
  24.         ConfigTimer0(10);//T0定時(shí)10ms
  25.         Start18B20();//啟動(dòng)DS18B20
  26.         InitLcd1602();//初始化液晶

  27.         while(1)
  28.         {               
  29.                 if(flag1s)//每秒更新一次溫度
  30.                 {
  31.                         flag1s=0;
  32.                         res=Get18B20Temp(&temp);//讀取當(dāng)前溫度
  33.                         if(res)//讀取成功時(shí),刷新當(dāng)前溫度顯示
  34.                         {
  35.                                 GetTemp();
  36.                         
  37.                                 LcdShowStr(0,0,"Welcome to use");//顯示字符及溫度值
  38.                                 LcdShowStr(0,1,"Current T:");
  39.                                 LcdShowStr(10,1,str);
  40.                                         Compare();
  41.                         }
  42.                         else //讀取失敗時(shí),提示錯(cuò)誤信息
  43.                         {
  44.                                 LcdShowStr(0,0,"error!");

  45.                         }
  46.                         Start18B20();//重新啟動(dòng)下一次轉(zhuǎn)換                                         
  47.                 }
  48.         }
  49. }
  50. /*溫度獲取函數(shù),獲取當(dāng)前環(huán)境溫度值并保存在str數(shù)組中*/
  51. void GetTemp()
  52. {

  53.         intT=temp>>4;//分離出溫度值整數(shù)部分
  54.         decT=temp &0x0F;//分離出溫度值小數(shù)部分
  55.                         
  56.         len=IntToString(str,intT);//整數(shù)部分轉(zhuǎn)換成字符串
  57.                         
  58.         str[len++]='.';
  59.         decT=(decT*10)/16;//二進(jìn)制的小數(shù)部分轉(zhuǎn)換為1位十進(jìn)制位
  60.         str[len++]=decT+'0';//十進(jìn)制小數(shù)位再轉(zhuǎn)換為ASCII字符
  61.         while(len<6)//用空格補(bǔ)齊到6個(gè)字符長(zhǎng)度
  62.         {
  63.                 str[len++]=' ';
  64.         }
  65.         str[len++]='\0';
  66. }
  67. /*延時(shí)函數(shù),用于PWM控制*/
  68. void delay(unsigned int z)
  69. {
  70.         unsigned int x,y;
  71.         for(x=z;x>0;x--)
  72.                 for(y=110;y>0;y--);
  73. }
  74. /*比較函數(shù),通過溫度值的比較設(shè)置電機(jī)的轉(zhuǎn)速*/
  75. void Compare()
  76. {
  77.         unsigned int i=0;
  78.         unsigned char j;

  79.         if((intT>= 24) && (intT<26))   //以兩度為一個(gè)溫差范圍,并設(shè)溫度范圍索引
  80.         {
  81.                 j=0;        
  82.         }
  83.         else if((intT>=26) &&(intT<28))
  84.         {
  85.                 j=1;
  86.         }
  87.         else if((intT>=28) &&(intT<30))
  88.         {
  89.                 j=2;
  90.         }
  91.         else if(intT>=30)
  92.         {
  93.                 j=3;
  94.         }
  95.         switch(j)                  //根據(jù)溫度索引設(shè)置電機(jī)轉(zhuǎn)速
  96.         {
  97.                 case 0:        IN1=1;
  98.                                 IN2=0;
  99.                                   for(i=0;i<200;i++)
  100.                               {
  101.                                         ENA=1;
  102.                                      delay(20);
  103.                                   ENA=0;
  104.                                         delay(30);
  105.                                 }
  106.                                 break;
  107.         
  108.                 case 1:        IN1=1;
  109.                                 IN2=0;
  110.                                   for(i=0;i<200;i++)
  111.                               {
  112.                                         ENA=1;
  113.                                      delay(30);
  114.                                   ENA=0;
  115.                                         delay(30);
  116.                                 }
  117.                                 break;         
  118.         
  119.                 case 2:        IN1=1;
  120.                                 IN2=0;
  121.                                   for(i=0;i<200;i++)
  122.                               {
  123.                                         ENA=1;
  124.                                      delay(55);                        
  125.                                   ENA=0;
  126.                                         delay(30);
  127.                                 }
  128.                                 break;         
  129.                                                         
  130.                 case 3:        IN1=1;
  131.                                 IN2=0;
  132.                               ENA=1;
  133.                                 break;

  134.                 default:break;                  
  135.         }
  136. }  

  137. /*整型數(shù)轉(zhuǎn)換為字符串,str-字符串指針,dat-待轉(zhuǎn)換數(shù),返回值-字符串長(zhǎng)度*/
  138. unsigned char IntToString(unsigned char *str,int dat)
  139. {
  140.         signed char i=0;
  141.         unsigned char len=0;
  142.         unsigned char buf[6];

  143.         if(dat<0)//如果為負(fù)數(shù),首先取絕對(duì)值,并在指針上添加負(fù)號(hào)
  144.         {
  145.                  dat=-dat;
  146.                 *str++='-';
  147.                 len++;
  148.         }
  149.         do{           //先轉(zhuǎn)換為低位在前的十進(jìn)制數(shù)組
  150.                 buf[i++]=dat%10;
  151.                 dat /=10;
  152.         }while(dat>0);
  153.         len += i;//i最后的值就是有效字符的個(gè)數(shù)
  154.         while(i-->0)//將數(shù)組值轉(zhuǎn)換為ASCII碼反向拷貝到接收指針上
  155.         {
  156.                 *str++=buf[i]+'0';
  157.         }
  158.         *str='\0';
  159.         return len;
  160. }
  161. void ConfigTimer0(unsigned int ms)
  162. {
  163.         unsigned long tmp;

  164.         tmp=11059200/12;
  165.         tmp=(tmp*ms)/1000;
  166.         tmp=65536-tmp;
  167.         tmp=tmp+12;
  168. ……………………

  169. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
基于紅外感應(yīng)的溫控轉(zhuǎn)速型風(fēng)扇設(shè)計(jì)資料.7z (72.26 KB, 下載次數(shù): 62)



作者: jemery1030    時(shí)間: 2020-9-2 13:31
正在找L298N控制風(fēng)扇的資料,非常詳細(xì),感謝了。
作者: hq_zhu    時(shí)間: 2020-9-11 19:48
PWM控制的嗎?
作者: 5201314@    時(shí)間: 2020-12-28 21:09
有大神能根據(jù)這個(gè)電路畫個(gè)proteus電路仿真來學(xué)習(xí)下嗎?

作者: 5201314@    時(shí)間: 2020-12-28 21:23
有proteus仿真嘛??.





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1