找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机智能温控风扇仿真加程序 可设置温度上下限

  [复制链接]
跳转到指定楼层
楼主
STC89C52单片机的温控智能风扇,而且可设置温度上下限
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


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

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

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

  207. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
智能风扇.rar (88.99 KB, 下载次数: 348)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:276554 发表于 2018-3-4 17:07 | 只看该作者
好 66666
回复

使用道具 举报

板凳
ID:261370 发表于 2018-3-13 21:38 | 只看该作者
谢谢分享
回复

使用道具 举报

地板
ID:89286 发表于 2018-3-14 07:58 | 只看该作者
thanks for sharing
回复

使用道具 举报

5#
ID:322712 发表于 2018-6-17 10:54 | 只看该作者
用来参考学习,感谢!
回复

使用道具 举报

6#
ID:281912 发表于 2018-6-17 11:56 | 只看该作者
用来参考学习,感谢!
回复

使用道具 举报

7#
ID:168799 发表于 2018-6-17 22:08 | 只看该作者
万分感谢
回复

使用道具 举报

8#
ID:396585 发表于 2018-9-11 16:33 | 只看该作者
学习学习,挺好
回复

使用道具 举报

9#
ID:420892 发表于 2018-11-6 14:14 | 只看该作者
学习学习  
回复

使用道具 举报

10#
ID:435755 发表于 2018-12-2 14:48 | 只看该作者
谢谢兄弟的分享啦
回复

使用道具 举报

11#
ID:272625 发表于 2018-12-3 06:09 | 只看该作者
感谢楼主分享资料,学习中!
回复

使用道具 举报

12#
ID:441012 发表于 2018-12-6 16:24 | 只看该作者
谢谢分享,十分感谢
回复

使用道具 举报

13#
ID:95682 发表于 2018-12-7 11:49 | 只看该作者
学习了谢谢啊
回复

使用道具 举报

14#
ID:442132 发表于 2018-12-8 18:14 | 只看该作者
nice!
回复

使用道具 举报

15#
ID:217038 发表于 2019-3-24 13:54 | 只看该作者
学习一下
回复

使用道具 举报

16#
ID:498958 发表于 2019-3-28 19:17 | 只看该作者
在不有时间的话回个消息可以购买一下你的程序和原理图不
回复

使用道具 举报

17#
ID:511008 发表于 2019-4-13 14:06 来自手机 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

18#
ID:425446 发表于 2019-4-13 17:09 | 只看该作者

谢谢分享
回复

使用道具 举报

19#
ID:542989 发表于 2019-5-22 19:15 | 只看该作者
我下载到89c52单片机后温度不能显示在一个整体的数码管,求解
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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