找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8184|回复: 8
收起左侧

单片机智能风扇控制系统源码与仿真原理图(自然,睡眠模式与风速调节功能)

  [复制链接]
ID:272634 发表于 2018-4-19 12:53 | 显示全部楼层 |阅读模式
分享一个自己做的单片机设计
智能风扇控制系统仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
功能非常多多,带三挡风速调节,还有正常,睡眠,自然3个模式,是按键控制的。
0.png 0.png 0.jpg

单片机风扇源程序如下:
  1. //数码管低电平有效
  2. #include <reg51.h>
  3. #include <absacc.h>
  4. #include <ctype.h>
  5. #include <math.h>
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include "set.h"
  9. #include "myinit.h"
  10. #include "function.h"

  11. uint  signal;
  12. uint  q;                //用于DS18B20  j秒读取一次数据
  13. uchar code a[]={                //定义数组,用于数码管显示
  14. 0x3f,0x06,0x5b,0x4f,
  15. 0x66,0x6d,0x7d,0x07,
  16. 0x7f,0x6f,0x40
  17. };
  18. /*******************************************************************************/
  19. uchar  TH=50,TL=10;    //定义温度上下限
  20. uchar  t[2]={20,20},*pt;                //用来存放温度值,测温程序就是通过这个数组与主函数通信的
  21. uchar  TempBuffer1[9]={0x2b,0x31,0x32,0x32,0x2e,0x30,0x30,0x43,'\0'};
  22.                                                                 //显示实时温度,上电时显示+125.00C
  23. uchar  TempBuffer0[17]={0x54,0x48,0x3a,0x2b,0x31,0x32,0x35,0x20,
  24.                                                                 0x54,0x4c,0x3a,0x2b,0x31,0x32,0x34,0x43,'\0'};
  25.                                                                 //显示温度上下限,上电时显示TH:+125 TL:+124C                                                        
  26. uchar code dotcode[4]={0,25,50,75};
  27. /*******************************************************************************/
  28. void main()
  29. {
  30. //        unsigned char TH=50,TL=10;    //定义温度上下限        
  31.         init_timer();        //初始化
  32.         init();                        //初始化
  33.         pt=ReadTemperature(TH,TL,0x3f);                 //上限温度-22,下限-24,分辨率10位,也就是0.25C
  34.                                                                                  //读取温度,温度值存放在一个两个字节的数组
  35.         covert1();                //将温度转换为LCD显示的据数
  36.         while(1)                //等待启动
  37.         {
  38.                 scan();
  39.                 if(flag_modle==1)
  40.                 {
  41.                         led_normal=1;
  42.                         led_style=1;
  43.                         break;
  44.                 }
  45.         }
  46.         close_motor=1;        //打开电机电源
  47.         while(1)                //启动后进入循环扫面状态
  48.         {
  49.                 scan();
  50.                 switch(flag_modle)
  51.                 {
  52.                         case 1:
  53.                                 choice_speed();
  54.                                 break;
  55.                         case 2:
  56.                                 choice_modle();
  57.                                 flag_modle=1;
  58.                                 break;
  59.                         case 3:
  60.                                 stop_operation();                                
  61.                                 break;
  62.                 }
  63. /*                if(q>60)                    //3S读取一次温度
  64.                 {        
  65.                         pt=ReadTemperature(TH,TL,0x3f);                 //上限温度-22,下限-24,分辨率10位,也就是0.25C
  66.                                                                                                  //读取温度,温度值存放在一个两个字节的数组
  67.                         covert1();                                                                                                
  68.                 }   */                        
  69.         }
  70. }

  71. //中断函数
  72. void timer0() interrupt 1
  73. {        
  74.         if(i>=20)            //定时1S
  75.         {        
  76.                 i=0;
  77.                 time--;
  78.                 if(time<=0)
  79.                         time=0;
  80.         }
  81.         if(q>20)           //定时3S,3S测一次温度
  82.         {
  83.                 q=0;
  84.                 pt=ReadTemperature(TH,TL,0x3f);
  85.                 covert1();
  86.         }
  87.         if((t[1]>TH)|(t[1]<TL))        //温度  TL<t[1]<TH  时,关闭电机
  88.         {
  89.                 close_motor=0;                //关闭电机电源
  90.                 init();                                //初始化
  91.         }
  92.         else
  93.                 close_motor=1;            //打开电机电源        

  94.         i++,q++;
  95.         TH0=(65536-50000)/256;
  96.         TL0=(65536-50000)%256;        
  97. }
复制代码
  1. #include "function.h"
  2. #include "set.h"
  3. //按键扫描函数
  4. void scan(void)
  5. {
  6.         if(speed==1)//风速
  7.         {
  8.                 delay(10);
  9.                 if(speed==1)
  10.                 {
  11.                         while(speed);
  12.                         flag_modle=1;        //模式标志位
  13.                         flag_speed++;
  14.                         signal=1;                //按键信号标志,用于选择模式
  15.                         if(flag_speed>4)
  16.                                 flag_speed=1;
  17.                 }
  18.         }
  19.         if(style==1)//模式
  20.         {
  21.                 delay(10);
  22.                 if(style==1)
  23.                 {
  24.                         while(style);
  25.                         flag_modle=2;        //模式标志位
  26.                         flag_style++;
  27.                         signal=1;                //按键信号标志,用于选择模式
  28.                         if(flag_style>3)
  29.                                 flag_style=1;
  30.                 }
  31.         }
  32.         if(stop==1)//停止
  33.         {
  34.                 delay(10);
  35.                 if(stop==1)
  36.                 {
  37.                         while(stop);
  38.                         flag_modle=3;        //模式标志位
  39.                         signal=1;                //按键信号标志,用于选择模式
  40.                 }
  41.         }        
  42. }
复制代码
  1. #include "function.h"
  2. //风速选择 1:弱  2:中   3:强   4:超强
  3. void choice_speed(void)
  4. {
  5.         switch(flag_speed)
  6.         {
  7.                 case 1:
  8.                 //        led_style=0;
  9.                         led_stop=0;
  10.                         time=0;
  11.                         display();
  12.                         o_spuerhigh=0;
  13.                         o_high=0;
  14.                         o_middle=0;        
  15.                         o_low=1;    //开——低
  16.                         led_speed=1;
  17.                         c_display=0;
  18.                         
  19.                         if(flag_style==3)        //nature
  20.                         {
  21.                                 led_style=1;
  22.                                 time=8;
  23.                                 while(signal==0 && (time))
  24.                                 {
  25.                                         c_display=0;
  26.                                         display();
  27.                                         o_low=1;
  28.                                         scan();
  29.                                         if(signal)
  30.                                         {
  31.                                                 break;
  32.                                         }
  33.                                 }
  34.                                 c_display=1;        
  35.                                 time=8;//停转
  36.                                 while(signal==0 && (time))
  37.                                 {
  38.                                         c_display=0;
  39.                                         display();
  40.                                         o_low=0;
  41.                                         scan();
  42.                                         if(signal)
  43.                                         {
  44.                                                 break;
  45.                                         }
  46.                                 }
  47.                                 c_display=1;
  48.                                 signal=0;
  49.                         }
  50.                         if(flag_style==2)          //sleep
  51.                         {
  52.                                 led_normal=0;
  53.                                 led_sleep=1;
  54.                                 led_nature=0;
  55.                                 led_style=1;
  56.                                 time=4;//转4s
  57.                                 while(signal==0 && (time))
  58.                                 {
  59.                                         c_display=0;
  60.                                         display();
  61.                                         o_low=1;
  62.                                         scan();
  63.                                         if(signal)
  64.                                                 break;
  65.                                 }        
  66.                                 c_display=1;
  67.                                 time=8;//停转
  68.                                 while(signal==0 && (time))
  69.                                 {
  70.                                         c_display= 0;
  71.                                         display();
  72.                                         o_low=0;
  73.                                         scan();
  74.                                         if(signal)
  75.                                                 break;
  76.                                 }
  77.                                 c_display=1;
  78.                                 signal=0;
  79.                         }                        
  80.                         break;               
  81.                 case 2:
  82.                         //led_style=0;
  83.                         c_display=0;
  84.                         time=0;
  85.                         display();
  86.                         led_stop=0;
  87.                         o_low=0;
  88.                         o_high=0;
  89.                         o_spuerhigh=0;
  90.                         o_middle=1;        //开——中
  91.                         led_speed=1;
  92.                         
  93.                         if(flag_style==3)        //nature
  94.                         {
  95.                                 led_style=1;
  96.                                 time=8;
  97.                                 while(signal==0 && (time))
  98.                                 {
  99.                                         c_display=0;
  100.                                         display();
  101.                                         o_middle=1;
  102.                                         scan();
  103.                                         if(signal)
  104.                                         {
  105.                                                 break;
  106.                                         }
  107.                                 }
  108.                                 c_display=1;        
  109.                                 time=8;//停转
  110.                                 while(signal==0 && (time))
  111.                                 {
  112.                                         c_display=0;
  113.                                         display();
  114.                                         o_middle=0;
  115.                                         scan();
  116.                                         if(signal)
  117.                                         {
  118.                                                 break;
  119.                                         }
  120.                                 }
  121.                                 c_display=1;
  122.                                 signal=0;
  123.                         }
  124.                         if(flag_style==2)          ///////////
  125.                         {
  126.                                 led_sleep=0;
  127.                                 led_normal=1;
  128.                                 led_nature=0;
  129.                         }                        
  130.                         break;
  131.                 case 3:                        
  132.                 //        led_style=0;
  133.                         c_display=0;
  134.                         time=0;
  135.                         display();
  136.                         led_stop=0;
  137.                         o_low=0;
  138.                         o_middle=0;
  139.                         o_spuerhigh=0;
  140.                         led_speed=1;//开——强
  141.                         o_high=1;
  142.                         
  143.                         if(flag_style==3)          ////////////////
  144.                         {
  145.                                 led_style=1;
  146.                                 time=8;
  147.                                 while(signal==0 && (time))
  148.                                 {
  149.                                         c_display=0;
  150.                                         display();
  151.                                         o_high=1;
  152.                                         scan();
  153.                                         if(signal)
  154.                                                 break;
  155.                                 }
  156.                                 c_display=1;        
  157.                                 time=8;//停转
  158.                                 while(signal==0 && (time))
  159.                                 {
  160.                                         c_display=0;
  161.                                         display();
  162.                                         o_high=0;
  163.                                         scan();
  164.                                         if(signal)
  165.                                                 break;
  166.                                 }
  167.                                 c_display=1;
  168.                                 signal=0;
  169.                         }
  170.                         if(flag_style==2)          /////////////
  171.                         {
  172.                                 led_sleep=0;
  173.                                 led_normal=1;
  174.                                 led_nature=0;
  175.                         }
  176.                         break;
  177.                 case 4:                        
  178.                 //        led_style=0;
  179.                         c_display=0;
  180.                         time=0;
  181.                         display();
  182.                         led_stop=0;
  183.                         o_low=0;
  184.                         o_middle=0;
  185.                         o_high=0;
  186.                         led_speed=1;//开——超强
  187.                         o_spuerhigh=1;
  188.                         
  189.                         if(flag_style==3)          ////////////////
  190.                         {
  191.                                 led_style=1;
  192.                                 time=8;
  193.                                 while(signal==0 && (time))
  194.                                 {
  195.                                         c_display=0;
  196.                                         display();
  197.                                         o_spuerhigh=1;
  198.                                         scan();
  199.                                         if(signal)
  200.                                                 break;
  201.                                 }
  202.                                 c_display=1;        
  203.                                 time=8;//停转
  204.                                 while(signal==0 && (time))
  205.                                 {
  206.                                         c_display=0;
  207.                                         display();
  208.                                         o_spuerhigh=0;
  209.                                         scan();
  210.                                         if(signal)
  211.                                                 break;
  212.                                 }
  213.                                 c_display=1;
  214.                                 signal=0;
  215.                         }
  216.                         if(flag_style==2)          /////////////
  217.                         {
  218.                                 led_sleep=0;
  219.                                 led_normal=1;
  220.                                 led_nature=0;
  221.                         }
  222.                         break;
  223.         }
  224. }
  225. /*******************************************************************************/
  226. //模式选择         1:正常   2:睡眠   3:自然
  227. void choice_modle(void)
  228. {
  229.         switch(flag_style)
  230.         {
  231.                 case 1:                                //正常
  232.                         led_style=1;
  233.                         led_normal=1;
  234.                         led_nature=0;
  235.                         led_sleep=0;                        
  236.                         break;
  237.                 case 2:                            //睡眠         //////////
  238.                         led_style=1;
  239.                         time=4;//转4s
  240.                         flag_speed=1;
  241.                         led_normal=0;
  242.                         led_nature=0;
  243.                         led_sleep=1;
  244.                 case 3:                            //自然风         /////
  245.                         led_style=1;
  246.                         time=8;//转8s
  247.                         led_normal=0;
  248.                         led_nature=1;
  249.                         led_sleep=0;                        
  250.                         break;
  251.                                        
  252.                         break;
  253.         }
  254. }
复制代码

0.jpg

调试中的代码与Proteus7.8版本的仿真下载(代码存在一些Keil版本兼容性问题):
STC89C51_风扇控制系统.zip (433.14 KB, 下载次数: 279)

评分

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

查看全部评分

回复

使用道具 举报

ID:58110 发表于 2018-5-19 08:04 | 显示全部楼层
楼主您好!下载的程序无法通过编译,请指导,谢谢!
编译无法通过.jpg

回复

使用道具 举报

ID:631763 发表于 2019-10-30 12:26 | 显示全部楼层
大佬求教
回复

使用道具 举报

ID:760347 发表于 2020-5-25 09:00 | 显示全部楼层
大佬求教
回复

使用道具 举报

ID:741740 发表于 2020-5-31 20:10 来自手机 | 显示全部楼层
楼上的keil版本不支持
回复

使用道具 举报

ID:964334 发表于 2021-10-28 08:46 | 显示全部楼层
楼主  有详细的模块分析和使用说明吗
回复

使用道具 举报

ID:1051232 发表于 2022-11-10 21:52 | 显示全部楼层
lyMarvin 发表于 2018-5-19 08:04
楼主您好!下载的程序无法通过编译,请指导,谢谢!

怎么解决啊求求大佬
回复

使用道具 举报

ID:262 发表于 2022-11-11 04:45 | 显示全部楼层
xbc-2 发表于 2022-11-10 21:52
怎么解决啊求求大佬

unsigned定义问题,新版编译会报错,你下载楼主修复后的代码即可
回复

使用道具 举报

ID:796012 发表于 2023-3-14 17:01 | 显示全部楼层
xbc-2 发表于 2022-11-10 21:52
怎么解决啊求求大佬

是不是存储盘符不同。删了工程重建
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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