找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2995|回复: 4
收起左侧

单片机红外感应的温控转速型风扇设计电路+源程序

[复制链接]
ID:806027 发表于 2020-7-20 21:28 | 显示全部楼层 |阅读模式
51hei.png

单片机源程序如下:
  1. #include<reg52.h>

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

  5. bit flag1s=0;//1s定时标志
  6. unsigned char T0RH=0;
  7. unsigned char T0RL=0;

  8. int temp;//读取到的当前温度值
  9. unsigned char len;
  10. int intT,decT;//温度值的整数和小数部分
  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);//读取当前温度
  33.                         if(res)//读取成功时,刷新当前温度显示
  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();//重新启动下一次转换                                         
  47.                 }
  48.         }
  49. }
  50. /*温度获取函数,获取当前环境温度值并保存在str数组中*/
  51. void GetTemp()
  52. {

  53.         intT=temp>>4;//分离出温度值整数部分
  54.         decT=temp &0x0F;//分离出温度值小数部分
  55.                         
  56.         len=IntToString(str,intT);//整数部分转换成字符串
  57.                         
  58.         str[len++]='.';
  59.         decT=(decT*10)/16;//二进制的小数部分转换为1位十进制位
  60.         str[len++]=decT+'0';//十进制小数位再转换为ASCII字符
  61.         while(len<6)//用空格补齐到6个字符长度
  62.         {
  63.                 str[len++]=' ';
  64.         }
  65.         str[len++]='\0';
  66. }
  67. /*延时函数,用于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. /*比较函数,通过温度值的比较设置电机的转速*/
  75. void Compare()
  76. {
  77.         unsigned int i=0;
  78.         unsigned char j;

  79.         if((intT>= 24) && (intT<26))   //以两度为一个温差范围,并设温度范围索引
  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)                  //根据温度索引设置电机转速
  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. /*整型数转换为字符串,str-字符串指针,dat-待转换数,返回值-字符串长度*/
  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)//如果为负数,首先取绝对值,并在指针上添加负号
  144.         {
  145.                  dat=-dat;
  146.                 *str++='-';
  147.                 len++;
  148.         }
  149.         do{           //先转换为低位在前的十进制数组
  150.                 buf[i++]=dat%10;
  151.                 dat /=10;
  152.         }while(dat>0);
  153.         len += i;//i最后的值就是有效字符的个数
  154.         while(i-->0)//将数组值转换为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黑下载附件…………
复制代码

所有资料51hei提供下载:
基于红外感应的温控转速型风扇设计资料.7z (72.26 KB, 下载次数: 61)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:585455 发表于 2020-9-2 13:31 | 显示全部楼层
正在找L298N控制風扇的資料,非常詳細,感謝了。
回复

使用道具 举报

ID:817695 发表于 2020-9-11 19:48 | 显示全部楼层
PWM控制的吗?
回复

使用道具 举报

ID:869719 发表于 2020-12-28 21:09 | 显示全部楼层
有大神能根据这个电路画个proteus电路仿真来学习下吗?
回复

使用道具 举报

ID:869719 发表于 2020-12-28 21:23 | 显示全部楼层
有proteus仿真嘛??.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表