找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2078|回复: 1
打印 上一主题 下一主题
收起左侧

单片机温控风扇源程序和电路图

[复制链接]
跳转到指定楼层
楼主
ID:573884 发表于 2019-8-5 16:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本系统可由用户根据需要自由设置大小风档的切换温度值TH,TL,硬件上设计了3个按键,按下一次设置键K1,进入温度上限设置,此时按下“加”键K2,加一,按下“减”键K3,减一。再按一次设置键K1进入温度下限设置状态,此时按下“加”键K2,加一,按下“减”键K3,减一。再按一次设置键K1退出下限温度设置状态,恢复到当前温度显示状态。
注:温度上下限以及当前温度显示格式为H-XX L-XXD-XX.
XX为温度值;D为档位值。

单片机源程序如下:
  1. /**************************************************************************************
  2. *                              DS18B20温度传感器实验                                                                                                  *
  3. 实现现象:下载程序后,在温度传感器接口处,按照丝印方向插好温度传感器,数码管就会显示
  4.                         检测的温度值,
  5. 注意事项:                                                                                                                                                                  
  6. ***************************************************************************************/

  7. #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
  8. #include"temp.h"        
  9. #include<intrins.h>  
  10. typedef unsigned int u16;          //对数据类型进行声明定义
  11. typedef unsigned char u8;
  12. char i;

  13. sbit dj=P1^0;//电机
  14. sbit LSA=P2^2;
  15. sbit LSB=P2^3;
  16. sbit LSC=P2^4;
  17. sbit key1=P3^1;//设置温度
  18. sbit key2=P3^0;//温度加
  19. sbit key3=P3^2;//温度减

  20. u8 wen_du;//温度变量  
  21. u8 shang,xia; //对比温度暂存变量
  22. u16 dang;//档位显示
  23. u16 flag;
  24. u16 d1,d2,d3;//显示温度暂存变量
  25. u8 DisplayData[8];
  26. u8 code smgduan[22]={0x3F,0x06,0x5B,0x4F,0x66,
  27. 0x6D,0x7D,0x07,0x7F,0x6F,
  28. 0x77,0x7C,0x39,0x5E,0x79,0x71,
  29. 0x40,0x38,0x76,0x00,0xff,0x37};

  30. void delay(u16 i)
  31. {
  32.         while(i--);        
  33. }
  34. /*******************************************************************************
  35. * 函数名         :DigDisplay()
  36. * 函数功能                 :数码管显示函数
  37. * 输入           : 无
  38. * 输出                  : 无
  39. *******************************************************************************/
  40. void DigDisplay()
  41. {
  42.         u8 i;
  43.         for(i=0;i<4;i++)
  44.         {
  45.                 switch(i)         //位选,选择点亮的数码管,
  46.                 {
  47.                         case(3):
  48.                                 LSA=0;LSB=0;LSC=0; break;//显示第0位
  49.                         case(2):
  50.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  51.                         case(1):
  52.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  53.                         case(0):
  54.                                 LSA=1;LSB=1;LSC=0; break;//显示第3位
  55.                 }
  56.                 Ds18b20ReadTemp();
  57.                 P0=smgduan[DisplayData[i]];//发送数据
  58.                 delay(100); //间隔一段时间扫描        
  59.                 P0=0x00;//消隐
  60.         }               
  61. }
  62. /*******************************************************************************
  63. * 函 数 名         : Delay1ms
  64. * 函数功能                   : 延时函数
  65. * 输    入         : 无
  66. * 输    出         : 无
  67. *******************************************************************************/

  68. void Delay1ms(uint y)
  69. {
  70.         uint x;
  71.         for( ; y>0; y--)
  72.         {
  73.                 for(x=110; x>0; x--);
  74.         }
  75. }
  76. /*******************************************************************************
  77. * 函 数 名         : Ds18b20Init
  78. * 函数功能                   : 初始化
  79. * 输    入         : 无
  80. * 输    出         : 初始化成功返回1,失败返回0
  81. *******************************************************************************/

  82. uchar Ds18b20Init()
  83. {
  84.         uchar i;
  85.         DSPORT = 0;                         //将总线拉低480us~960us
  86.         i = 70;        
  87.         while(i--);//延时642us
  88.         DSPORT = 1;                        //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
  89.         i = 0;
  90.         while(DSPORT)        //等待DS18B20拉低总线
  91.         {
  92.                 Delay1ms(1);
  93.                 i++;
  94.                 if(i>5)//等待>5MS
  95.                 {
  96.                         return 0;//初始化失败
  97.                 }
  98.         
  99.         }
  100.         return 1;//初始化成功
  101. }

  102. /*******************************************************************************
  103. * 函 数 名         : Ds18b20WriteByte
  104. * 函数功能                   : 向18B20写入一个字节
  105. * 输    入         : 无
  106. * 输    出         : 无
  107. *******************************************************************************/

  108. void Ds18b20WriteByte(uchar dat)
  109. {
  110.         uint i, j;

  111.         for(j=0; j<8; j++)
  112.         {
  113.                 DSPORT = 0;                       //每写入一位数据之前先把总线拉低1us
  114.                 i++;
  115.                 DSPORT = dat & 0x01;  //然后写入一个数据,从最低位开始
  116.                 i=6;
  117.                 while(i--); //延时68us,持续时间最少60us
  118.                 DSPORT = 1;        //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
  119.                 dat >>= 1;
  120.         }
  121. }
  122. /*******************************************************************************
  123. * 函 数 名         : Ds18b20ReadByte
  124. * 函数功能                   : 读取一个字节
  125. * 输    入         : 无
  126. * 输    出         : 无
  127. *******************************************************************************/


  128. uchar Ds18b20ReadByte()
  129. {
  130.         uchar byte, bi;
  131.         uint i, j;        
  132.         for(j=8; j>0; j--)
  133.         {
  134.                 DSPORT = 0;//先将总线拉低1us
  135.                 i++;
  136.                 DSPORT = 1;//然后释放总线
  137.                 i++;
  138.                 i++;//延时6us等待数据稳定
  139.                 bi = DSPORT;         //读取数据,从最低位开始读取
  140.                 /*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
  141.                 byte = (byte >> 1) | (bi << 7);                                                  
  142.                 i = 4;                //读取完之后等待48us再接着读取下一个数
  143.                 while(i--);
  144.         }                                
  145.         return byte;
  146. }
  147. /*******************************************************************************
  148. * 函 数 名         : Ds18b20ChangTemp
  149. * 函数功能                   : 让18b20开始转换温度
  150. * 输    入         : 无
  151. * 输    出         : 无
  152. *******************************************************************************/

  153. void  Ds18b20ChangTemp()
  154. {
  155.         Ds18b20Init();
  156.         Delay1ms(1);
  157.         Ds18b20WriteByte(0xcc);                //跳过ROM操作命令                 
  158.         Ds18b20WriteByte(0x44);            //温度转换命令
  159.         //Delay1ms(100);        //等待转换成功,而如果你是一直刷着的话,就不用这个延时了
  160.    
  161. }
  162. /*******************************************************************************
  163. * 函 数 名         : Ds18b20ReadTempCom
  164. * 函数功能                   : 发送读取温度命令
  165. * 输    入         : 无
  166. * 输    出         : 无
  167. *******************************************************************************/

  168. void  Ds18b20ReadTempCom()
  169. {        

  170.         Ds18b20Init();
  171.         Delay1ms(1);
  172.         Ds18b20WriteByte(0xcc);         //跳过ROM操作命令
  173.         Ds18b20WriteByte(0xbe);         //发送读取温度命令
  174. }
  175. /*******************************************************************************
  176. * 函 数 名         : Ds18b20ReadTemp
  177. * 函数功能                   : 读取温度
  178. * 输    入         : 无
  179. * 输    出         : 无
  180. *******************************************************************************/

  181. int Ds18b20ReadTemp()
  182. {
  183.         int temp = 0;
  184.         uchar tmh, tml;
  185.         Ds18b20ChangTemp();                                 //先写入转换命令
  186.         Ds18b20ReadTempCom();                        //然后等待转换完后发送读取温度命令
  187.         tml = Ds18b20ReadByte();                //读取温度值共16位,先读低字节
  188.         tmh = Ds18b20ReadByte();//再读高字节
  189.   wen_du=((tmh*256+tml)>>4);        
  190.         temp = tmh;
  191.         temp <<= 8;
  192.         temp |= tml;
  193.         return temp;
  194. }
  195. void zi_keyscan()                  //自动模式按键扫描函数
  196. {
  197.         if(key1==0)                                                          //设置键按下
  198.         {
  199.                 delay(30);                                                  //延时去抖
  200.                 if(key1==0)flag=1;                                  //再次判断按键,按下的话进入设置状态
  201.                 while(key1==0);//????                  //按键释放
  202.         }
  203.                                 //显示上限温度H
  204.         while(flag==1)                                                  //进入设置按键上限状态
  205.         {
  206.                 d1=18;d2=shang/10;d3=shang%10;          //显示字母H 和上线温度值
  207.                 DisplayData[0]=d1;                                        //调用显示函数
  208.                                                                 DisplayData[1]=16;
  209.                                                                 DisplayData[2]=d2;
  210.                                                                 DisplayData[3]=d3;
  211.                                                                 DigDisplay();
  212.                 if(key1==0)                                                  //判断设置键是否按下
  213.                 {
  214.                         delay(30);                                          //延时去抖
  215.                         if(key1==0)flag=2;                          //按键按下,进入设置下限模式
  216.                         while(key1==0);//松手检测
  217.                 }
  218.                 if(key2==0)                                                  //加键按下
  219.                 {
  220.                         delay(30);                                          //延时去抖
  221.                         if(key2==0)                                          //加键按下
  222.                         {
  223.                                 shang+=1;                                  //上限加5
  224.                                 if(shang>=40)shang=40;  //上线最大加到100
  225.                         }while(key2==0);//松手检测
  226.                 }
  227.                 if(key3==0)                                                  //减键按下
  228.                 {
  229.                         delay(30);                                          //延时去抖
  230.                         if(key3==0)                                          //减键按下
  231.                         {
  232.                                 shang-=1;                                  //上限减1
  233.                                 if(shang<=15)shang=15;          //上限最小减到10
  234.                         }while(key3==0);//松手检测
  235.                 }               
  236.         }
  237.                                                                 //显示下限温度L
  238.         while(flag==2)                                                  //设置下限
  239.         {
  240.                 d1=17;d2=xia/10;d3=xia%10;                  //显示字母L 显示下限温度值
  241.                 DisplayData[0]=d1;                                        //调用显示函数
  242.                                                                 DisplayData[1]=16;
  243.                                                                 DisplayData[2]=d2;
  244.                                                                 DisplayData[3]=d3;
  245.                                                                 DigDisplay();                                                  
  246.                 if(key1==0)
  247.                 {
  248.                         delay(30);
  249.                         if(key1==0)flag=0;
  250.                         while(key1==0);
  251.                 }
  252.                 if(key2==0)
  253.                 {
  254.                         delay(30);
  255.                         if(key2==0)
  256.                         {
  257.                                 xia+=1;
  258.                                 if(xia>=40)xia=40;        
  259.                         }while(key2==0);//????
  260.                 }
  261.                if(key3==0)
  262.                 {
  263.                         delay(30);
  264.                        if(key3==0)
  265.                         {
  266.                                 xia-=1;
  267.                                 if(xia<=15)xia=15;        
  268.                         }while(key3==0);//????
  269.                 }               
  270.         }
  271. }
  272. void zi_dong()  //传感器采集温度以及挡位显示
  273. {
  274.         u16 i;
  275.         d1=dang;d2=wen_du/10;d3=wen_du%10;                //显示档位,显示当前温度值
  276.         zi_keyscan();               //按键扫描函数
  277.                                 DisplayData[0]=d1;                                        //调用显示函数
  278.                                 DisplayData[1]=16;
  279.                                 DisplayData[2]=d2;
  280.                                 DisplayData[3]=d3;
  281.                                 DigDisplay();               //调用显示函数
  282.        if(wen_du<xia){dj=0;dang=0;}      //低于下限  显示为0 电机停止
  283.        if((wen_du>=xia)&&(wen_du<=shang))//温度大于下限,小于上限  1档
  284.         {
  285.                 dang=1;
  286.                 for(i=0;i<2;i++){dj=0;DigDisplay();zi_keyscan();}        //PWM通过延时降低风扇转速
  287.                 for(i=0;i<4;i++){dj=1;DigDisplay();zi_keyscan();}               
  288.         }
  289.         if(wen_du>shang){dj=1;dang=2;}//高温全速
  290. }
  291. void main()                  //主函数
  292. {
  293.         u16 j;
  294.         dj=0;                    //电机开
  295.         shang=30;
  296.         xia=20;                  //初始上下限值
  297.         for(j=0;j<80;j++)          //现读取温度值,防止开机显示85
  298.         Ds18b20ReadTemp();
  299.         while(1)                          //进入while循环
  300.           {        
  301.                 Ds18b20ReadTemp();        //读取温度值
  302.                 for(j=0;j<100;j++)zi_dong();//自动温控模式
  303.         }
  304. }
复制代码

所有资料51hei提供下载:

fengshan (3).zip

22.81 KB, 下载次数: 10, 下载积分: 黑币 -5

温控风扇

温控风扇.7z

79.63 KB, 下载次数: 12, 下载积分: 黑币 -5

电路仿真图,51程序

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2019-8-5 22:31 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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