找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 84884|回复: 151
收起左侧

51单片机温控风扇(含程序+原理图+仿真+PCB)

  [复制链接]
ID:143796 发表于 2016-11-10 16:19 | 显示全部楼层 |阅读模式
·        1.本设计基于STC89C51/52(与AT89S51/52、AT89C51/52通用,可任选)单片机
·        2.采用DS18B20温度传感器测温,74HC573驱动数码管显示温度和风扇的档位。
·        3.共3个按键:设置、加、减。按一下设置可以设置上限,再按下设置下限,均可以按键加减调整。
·        4.利用PWM调速,当温度低于下限时,风扇不转动,当温度处于上、下限之间时1档转动(50%的转速),当温度超过上限时,全速转动。
使用说明:
一共3个按键:设置、加、减
按下设置键的时候才可以加减。
按一下设置键,是设置温度的上限,再按下设置键,是设置温度的下限,再按下设置键是退出并保存。
元件清单:
1) 7*9万用板
2) 风扇
3) STC89C51单片机
4) 74hc573
5) 40脚IC座
6) 20脚IC座
7) 0.56四位一体共阴数码管
8) 10k电阻*3
9) 1k电阻*2
10)      103排阻
11)      DS18B20
12)      10uf电容
13)      12M晶振
14)      30pf瓷片电容*2
15)      8550三极管
16)      8050三极管
17)      3p排针
18)      按键*3
19)      DC电源接口
20)      自锁开关
21)      导线若干
22)      焊锡若干

23)      电源线或电池盒+DC电源插头
  1. <font color="#000000">#include<reg51.h>
  2. #include<intrins.h>                         //包含头文件
  3. #define uchar unsigned char
  4. #define uint unsigned int                 //宏定义
  5. ////////////////////
  6. sbit dj=P1^0;//电机控制端接口
  7. sbit DQ=P1^6;//温度传感器接口
  8. //////////按键接口/////////////////////////////////
  9. sbit key1=P3^5;//设置温度
  10. sbit key2=P3^6;//温度加
  11. sbit key3=P3^7;//温度减
  12. //////////////////////////////////////////////////////
  13. sbit w1=P2^4;
  14. sbit w2=P2^5;
  15. sbit w3=P2^6;
  16. sbit w4=P2^7;                          //数码管的四个位
  17. /////共阴数码管段选//////////////////////////////////////////////
  18. uchar table[22]=
  19. {0x3F,0x06,0x5B,0x4F,0x66,
  20. 0x6D,0x7D,0x07,0x7F,0x6F,
  21. 0x77,0x7C,0x39,0x5E,0x79,0x71,
  22. 0x40,0x38,0x76,0x00,0xff,0x37};//'-',L,H,灭,全亮,n         16-21
  23. uint wen_du;                                                //温度变量  
  24. uint shang,xia; //对比温度暂存变量
  25. uchar dang;//档位显示
  26. uchar flag;
  27. uchar d1,d2,d3;//显示数据暂存变量
  28. void delay(uint ms)                //延时函数,大约延时25us
  29. {
  30.         uchar x;
  31.         for(ms;ms>0;ms--)
  32.                 for(x=10;x>0;x--);
  33. }
  34. /***********ds18b20延迟子函数(晶振12MHz )*******/
  35. void delay_18B20(uint i)
  36. {
  37.         while(i--);
  38. }
  39. /**********ds18b20初始化函数**********************/
  40. void Init_DS18B20()
  41. {
  42.          uchar x=0;
  43.          DQ=1;          //DQ复位
  44.          delay_18B20(8);  //稍做延时
  45.          DQ=0;          //单片机将DQ拉低
  46.          delay_18B20(80); //精确延时 大于 480us
  47.          DQ=1;          //拉高总线
  48.          delay_18B20(14);
  49.          x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  50.          delay_18B20(20);
  51. }
  52. /***********ds18b20读一个字节**************/  
  53. uchar ReadOneChar()
  54. {
  55.         uchar i=0;
  56.         uchar dat=0;
  57.         for (i=8;i>0;i--)
  58.          {
  59.                   DQ=0; // 给脉冲信号
  60.                   dat>>=1;
  61.                   DQ=1; // 给脉冲信号
  62.                   if(DQ)
  63.                   dat|=0x80;
  64.                   delay_18B20(4);
  65.          }
  66.         return(dat);
  67. }
  68. /*************ds18b20写一个字节****************/  
  69. void WriteOneChar(uchar dat)
  70. {
  71.         uchar i=0;
  72.         for (i=8;i>0;i--)
  73.         {
  74.                   DQ=0;
  75.                 DQ=dat&0x01;
  76.             delay_18B20(5);
  77.                 DQ=1;
  78.             dat>>=1;
  79.         }
  80. }
  81. /**************读取ds18b20当前温度************/
  82. void ReadTemperature()
  83. {
  84.         uchar a=0;
  85.         uchar b=0;
  86.         uchar t=0;
  87.         Init_DS18B20();
  88.         WriteOneChar(0xCC);            // 跳过读序号列号的操作
  89.         WriteOneChar(0x44);         // 启动温度转换
  90.         delay_18B20(100);       // this message is wery important
  91.         Init_DS18B20();
  92.         WriteOneChar(0xCC);         //跳过读序号列号的操作
  93.         WriteOneChar(0xBE);         //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
  94.         delay_18B20(100);
  95.         a=ReadOneChar();            //读取温度值低位
  96.         b=ReadOneChar();                   //读取温度值高位
  97.         wen_du=((b*256+a)>>4);    //当前采集温度值除16得实际温度值
  98. }
  99. void display()//显示温度
  100. {
  101.         w1=0;P0=table[d1];delay(10); //第1位
  102.         P0=0x00;w1=1;delay(1);
  103.          
  104.         w2=0;P0=table[16];delay(10);//第2位
  105.         P0=0x00;w2=1;delay(1);

  106.         w3=0;P0=table[d2]; delay(10);//第3位
  107.         P0=0x00;w3=1;delay(1);

  108.         w4=0;P0=table[d3];delay(10);//第4位
  109.         P0=0x00;w4=1;delay(1);
  110. }
  111. void zi_keyscan()//自动模式按键扫描函数
  112. {
  113.         if(key1==0)                                                          //设置键按下
  114.         {
  115.                 delay(30);                                                  //延时去抖
  116.                 if(key1==0)flag=1;                                  //再次判断按键,按下的话进入设置状态
  117.                 while(key1==0);//松手检测                  //按键释放
  118.         }
  119.         while(flag==1)                                                  //进入设置上限状态
  120.         {
  121.                 d1=18;d2=shang/10;d3=shang%10;          //显示字母H 和上限温度值
  122.                 display();                                                  //调用显示函数
  123.                 if(key1==0)                                                  //判断设置键是否按下
  124.                 {
  125.                         delay(30);                                          //延时去抖
  126.                         if(key1==0)flag=2;                          //按键按下,进入设置下限模式
  127.                         while(key1==0);//松手检测
  128.                 }
  129.                 if(key2==0)                                                  //加键按下
  130.                 {
  131.                         delay(30);                                          //延时去抖
  132.                         if(key2==0)                                          //加键按下
  133.                         {
  134.                                 shang+=5;                                  //上限加5
  135.                                 if(shang>=100)shang=100;  //上限最大加到100
  136.                         }while(key2==0);//松手检测
  137.                 }
  138.                 if(key3==0)                                                  //减键按下
  139.                 {
  140.                         delay(30);                                          //延时去抖
  141.                         if(key3==0)                                          //减键按下
  142.                         {
  143.                                 shang-=1;                                  //上限减1
  144.                                 if(shang<=10)shang=10;          //上限最小减到10
  145.                         }while(key3==0);//松手检测
  146.                 }               
  147.         }
  148.         while(flag==2)                                                  //设置下限
  149.         {
  150.                 d1=17;d2=xia/10;d3=xia%10;                  //显示字母L 显示下限温度值
  151.                 display();                                                  //以下注释同上
  152.                 if(key1==0)
  153.                 {
  154.                         delay(30);
  155.                         if(key1==0)flag=0;
  156.                         while(key1==0);//松手检测
  157.                 }
  158.                 if(key2==0)
  159.                 {
  160.                         delay(30);
  161.                         if(key2==0)
  162.                         {
  163.                                 xia+=5;
  164.                                 if(xia>=95)xia=95;       
  165.                         }while(key2==0);//松手检测
  166.                 }
  167.                 if(key3==0)
  168.                 {
  169.                         delay(30);
  170.                         if(key3==0)
  171.                         {
  172.                                 xia-=1;
  173.                                 if(xia<=0)xia=0;       
  174.                         }while(key3==0);//松手检测
  175.                 }               
  176.         }
  177. }
  178. void zi_dong()//自动温控模式
  179. {
  180.         uchar i;
  181.         d1=dang;d2=wen_du/10;d3=wen_du%10;                //显示档位,显示当前温度值
  182.         zi_keyscan();//按键扫描函数
  183.         display();         //调用显示函数
  184.         if(wen_du<xia){dj=0;dang=0;}//低于下限  档位为0 电机停止
  185.         if((wen_du>=xia)&&(wen_du<=shang))//温度大于下限,小于上限  1挡
  186.         {
  187.                 dang=1;                                                                                        //档位置1
  188.                 for(i=0;i<3;i++){dj=0;display();zi_keyscan();}        //PWM通过延时得到
  189.                 for(i=0;i<6;i++){dj=1;display();zi_keyscan();}               
  190.         }
  191.         if(wen_du>shang){dj=1;dang=2;}//高温全速
  192. }
  193. void main()                  //主函数
  194. {
  195.         uchar j;
  196.         dj=0;                  //电机开
  197.         shang=30;
  198.         xia=20;                  //初始上下限值
  199.         for(j=0;j<80;j++)          //先读取温度值,防止开机显示85
  200.         ReadTemperature();
  201.         while(1)                          //进入while循环
  202.         {       
  203.                 ReadTemperature();        //读取温度值
  204.                 for(j=0;j<100;j++)zi_dong();//自动温控模式
  205.         }
  206. }</font>
复制代码


实物图正面

实物图正面

实物图反面

实物图反面

温控风扇.zip

790.79 KB, 下载次数: 1784, 下载积分: 黑币 -5

评分

参与人数 18黑币 +187 收起 理由
sksknssy + 10 绝世好帖!
tieq1952 + 12 赞一个!
892313600 + 4 很给力!
lmd1208 + 5 很给力!
小发发 + 5
想方设法 + 5 哇 牛逼
KolalaSA + 5 赞一个!
lyMarvin + 10 很给力!谢谢分享!
bb1982 + 5 很给力!
啦啦啦啦111 + 1 赞一个!
今晚打老虎11 + 5 很给力!
梦魂 + 1 很给力!
滚滚方 + 5 绝世好帖!
TIANGEYIFANG + 5 共享资料的黑币奖励!
c09002360172 + 1 共享资料的黑币奖励!
zxtw + 3 很给力!
黄梓晏 + 5 很给力!
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1106478 发表于 2023-12-26 15:57 | 显示全部楼层
做得不错,精致,支持一下。继续努力
回复

使用道具 举报

ID:1021284 发表于 2022-4-24 16:45 | 显示全部楼层
风扇往哪插
回复

使用道具 举报

ID:848824 发表于 2021-1-14 08:14 来自触屏版 | 显示全部楼层
有电路图就好了
回复

使用道具 举报

ID:120677 发表于 2021-1-6 20:20 | 显示全部楼层
很不错的代码
回复

使用道具 举报

ID:873975 发表于 2021-1-5 21:05 | 显示全部楼层
这个必须点个赞,帮助很大
回复

使用道具 举报

ID:684871 发表于 2021-1-5 20:36 来自触屏版 | 显示全部楼层
洞洞板的vcc和gnd怎么焊?
回复

使用道具 举报

ID:366464 发表于 2020-12-7 21:41 来自触屏版 | 显示全部楼层
下载观摩备用!
回复

使用道具 举报

ID:255559 发表于 2020-11-13 07:25 | 显示全部楼层
非常不错的东西,学习学习
回复

使用道具 举报

ID:684871 发表于 2020-11-12 21:54 来自触屏版 | 显示全部楼层
请问没有数据接口,那么程序是怎样烧录进去的
回复

使用道具 举报

ID:776391 发表于 2020-6-19 22:17 来自触屏版 | 显示全部楼层
学习一下
回复

使用道具 举报

ID:777123 发表于 2020-6-12 12:14 | 显示全部楼层
根据程序直接连的仿真,十分感谢
回复

使用道具 举报

ID:772357 发表于 2020-6-8 04:00 | 显示全部楼层
刚好要用到,试试看
回复

使用道具 举报

ID:770056 发表于 2020-6-5 10:17 | 显示全部楼层
谢谢楼主
回复

使用道具 举报

ID:770056 发表于 2020-6-5 10:15 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:769782 发表于 2020-6-5 09:03 | 显示全部楼层
绝世好贴,以前就是不知道风扇的温控部分怎么实现,现在学会了
回复

使用道具 举报

ID:762484 发表于 2020-5-27 20:03 | 显示全部楼层
谢谢,对我很有帮助
回复

使用道具 举报

ID:691130 发表于 2020-5-17 20:26 来自触屏版 | 显示全部楼层
学习了
回复

使用道具 举报

ID:747468 发表于 2020-5-15 09:03 | 显示全部楼层
棒!感谢资源共享
回复

使用道具 举报

ID:427205 发表于 2020-4-18 15:20 | 显示全部楼层
不错,很好的资料
回复

使用道具 举报

ID:727142 发表于 2020-4-11 19:52 | 显示全部楼层
做得不错,精致,支持一下。继续努力!
回复

使用道具 举报

ID:713135 发表于 2020-3-27 19:02 来自触屏版 | 显示全部楼层
很好,学习了
回复

使用道具 举报

ID:106347 发表于 2020-3-27 15:35 | 显示全部楼层
下来学习,多谢分享。
回复

使用道具 举报

ID:650790 发表于 2019-11-28 07:56 | 显示全部楼层
挺好的 谢谢楼主
回复

使用道具 举报

ID:624391 发表于 2019-10-15 11:55 | 显示全部楼层
参考参考
回复

使用道具 举报

ID:587292 发表于 2019-9-15 09:17 | 显示全部楼层
楼主高手啊!感谢分享,
回复

使用道具 举报

ID:409381 发表于 2019-6-8 15:02 | 显示全部楼层
感谢分享 学习学习
回复

使用道具 举报

ID:539393 发表于 2019-6-6 11:30 | 显示全部楼层
需要pcb的原理图
回复

使用道具 举报

ID:555644 发表于 2019-6-5 15:07 | 显示全部楼层
很有用 最近正好在学习单片机
回复

使用道具 举报

ID:356051 发表于 2019-1-11 12:40 | 显示全部楼层
很不错  值得学习一下
回复

使用道具 举报

ID:415937 发表于 2019-1-11 11:15 | 显示全部楼层
给力啊
回复

使用道具 举报

ID:464371 发表于 2019-1-10 10:45 | 显示全部楼层
厉害厉害正好自己试试
回复

使用道具 举报

ID:212352 发表于 2019-1-9 23:45 | 显示全部楼层

做得不错,精致,支持一下。继续努力!
回复

使用道具 举报

ID:301741 发表于 2019-1-8 13:32 | 显示全部楼层
超级nice!!!!加油哟
回复

使用道具 举报

ID:404723 发表于 2018-12-26 20:43 | 显示全部楼层
楼主  我想问一下我把数码管 改成工阳的   然后程序段码也改了     但是显示的话就是全亮   怎么办
回复

使用道具 举报

ID:434283 发表于 2018-11-29 16:04 | 显示全部楼层
很棒,我们现在最需要这个
回复

使用道具 举报

ID:434283 发表于 2018-11-29 16:03 | 显示全部楼层
很得劲,正需要
回复

使用道具 举报

ID:434733 发表于 2018-11-28 11:32 | 显示全部楼层

做得不错,精致,支持一下。继续努力!
回复

使用道具 举报

ID:433476 发表于 2018-11-27 19:53 | 显示全部楼层
封装可以发我吗qq2394693753
回复

使用道具 举报

ID:433476 发表于 2018-11-27 19:43 | 显示全部楼层
PCB图发一份呗
回复

使用道具 举报

ID:433219 发表于 2018-11-26 10:00 | 显示全部楼层
风扇都有个PF频率输出口和VF调速口,只是外部不一定给你引出来
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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