找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 3874|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

單片機紅外感應(yīng)的溫控轉(zhuǎn)速型風(fēng)扇設(shè)計電路+源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:806027 發(fā)表于 2020-7-20 21:28 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式


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

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

  5. bit flag1s=0;//1s定時標(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定時10ms
  25.         Start18B20();//啟動DS18B20
  26.         InitLcd1602();//初始化液晶

  27.         while(1)
  28.         {               
  29.                 if(flag1s)//每秒更新一次溫度
  30.                 {
  31.                         flag1s=0;
  32.                         res=Get18B20Temp(&temp);//讀取當(dāng)前溫度
  33.                         if(res)//讀取成功時,刷新當(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 //讀取失敗時,提示錯誤信息
  43.                         {
  44.                                 LcdShowStr(0,0,"error!");

  45.                         }
  46.                         Start18B20();//重新啟動下一次轉(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;//二進制的小數(shù)部分轉(zhuǎn)換為1位十進制位
  60.         str[len++]=decT+'0';//十進制小數(shù)位再轉(zhuǎn)換為ASCII字符
  61.         while(len<6)//用空格補齊到6個字符長度
  62.         {
  63.                 str[len++]=' ';
  64.         }
  65.         str[len++]='\0';
  66. }
  67. /*延時函數(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è)置電機的轉(zhuǎn)速*/
  75. void Compare()
  76. {
  77.         unsigned int i=0;
  78.         unsigned char j;

  79.         if((intT>= 24) && (intT<26))   //以兩度為一個溫差范圍,并設(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è)置電機轉(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ù),返回值-字符串長度*/
  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)//如果為負數(shù),首先取絕對值,并在指針上添加負號
  144.         {
  145.                  dat=-dat;
  146.                 *str++='-';
  147.                 len++;
  148.         }
  149.         do{           //先轉(zhuǎn)換為低位在前的十進制數(shù)組
  150.                 buf[i++]=dat%10;
  151.                 dat /=10;
  152.         }while(dat>0);
  153.         len += i;//i最后的值就是有效字符的個數(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. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

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


評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:585455 發(fā)表于 2020-9-2 13:31 | 只看該作者
正在找L298N控制風(fēng)扇的資料,非常詳細,感謝了。
回復(fù)

使用道具 舉報

板凳
ID:817695 發(fā)表于 2020-9-11 19:48 | 只看該作者
PWM控制的嗎?
回復(fù)

使用道具 舉報

地板
ID:869719 發(fā)表于 2020-12-28 21:09 | 只看該作者
有大神能根據(jù)這個電路畫個proteus電路仿真來學(xué)習(xí)下嗎?
回復(fù)

使用道具 舉報

5#
ID:869719 發(fā)表于 2020-12-28 21:23 | 只看該作者
有proteus仿真嘛??.
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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