找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于stm32单片机的温控风扇代码

[复制链接]
跳转到指定楼层
楼主
ID:1155874 发表于 2025-7-4 08:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
按键1 用于切换模式
按键2 用于模式2调速
模式1 为温控模式

单片机源程序如下:
  1. #include "stm32f10x.h"                 // Device header
  2. #include "OLED.h"
  3. #include "Delay.h"
  4. #include "Key.h"
  5. #include "dht11.h"
  6. #include "motor.h"
  7. #include "pwm.h"
  8. #include "encoder.h"
  9. #include "Timer.h"


  10. uint8_t Key_num,Key_down,Key_up,Key_old;//模式控制按键       PB1数为1,PB11数为2
  11. uint8_t jishu = 0;//按键控制电机
  12. u8 temp;//温度
  13. u8 humi;//湿度
  14. u8 mode = 0;//模式 0-关机 1-温控风扇 2-按键控制
  15. u8 check = 0;
  16. u8 i;
  17. u16 t;
  18. u16 Speed;


  19. //void TIM2_IRQHandler(void)
  20. //{
  21. //        if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
  22. //        {
  23. //                                Speed = Encoder3_Get();       
  24. //                TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
  25. //        }
  26. //}

  27. //电机A4高A5低
  28. int main(void)
  29. {
  30. //        PWM2_Init();
  31.         Key_Init();//按键初始化
  32.         OLED_Init();//显示屏初始化
  33.         Motor_Init();//电机初始化
  34.         Encoder_Init();
  35.         Encoder4_Init();
  36. //        Timer_Init();                       
  37.        
  38.         OLED_ShowString(1,1,"T:");
  39.         OLED_ShowString(2,1,"S:");
  40.         OLED_ShowString(3,1,"mode:");
  41.         OLED_ShowString(4,1,"Gear:");
  42.                 while(DHT11_Init())//初始化DHT11的IO口 DQ 同时检测DHT11的存在
  43.         {
  44. //                Delay_ms(200);
  45.                 OLED_ShowString(3,5,"error");
  46.         }
  47.        
  48.         while(1)
  49.         {
  50.                 Key_num = Key_GetNum();
  51. //                Key_down = Key_num & (Key_old ^ Key_num);//下降沿输出
  52. //                Key_up = Key_num & (Key_old ^ Key_num);//上升沿输出
  53. //                Key_old = Key_num;//长按
  54. //               
  55.                

  56.                 check = DHT11_Read_Data(&temp,&humi);
  57.                
  58.                 if(check == 1)                
  59.                 {
  60.                         OLED_ShowString(2,5,"error");
  61.                        
  62.                 } //温度范围检查
  63.                
  64. //                t = Encoder3_Get();
  65.                        
  66.                 Delay_ms(500);               
  67.                 OLED_ShowNum(1,3,temp,2);//温度值显示
  68.                 OLED_ShowNum(2,3,humi,2);//湿度值显示
  69.                 OLED_ShowNum(3,6,mode,1);//模式显示
  70.                 OLED_ShowNum(1,6,Encoder3_Get(),5);
  71.                 OLED_ShowNum(2,6,Encoder4_Get(),5);               
  72.                 if(Key_num == 1)
  73.                 {
  74.                         if(++mode == 3) mode = 0; //模式切换

  75.                 }
  76. //                if(mode == 1)
  77. //                        Motor_SetSpeed(humi);//温控
  78. //                else if(mode == 2)
  79. //                {

  80. //                                Motor_SetSpeed(jishu*10);
  81. //                               
  82. //                        if(Key_num == 2)
  83. //                        {
  84. //                                if(++jishu == 11) jishu = 1;
  85. //                        }//按键控制
  86. ////                          OLED_ShowNum(4,6,jishu,2);//模式二档位
  87. //                }
  88.                 switch(mode)
  89.                 {
  90.                         case 0:
  91.                                         jishu = 0;
  92.                                         Motor_SetSpeed(0);
  93.                                         OLED_ShowNum(4,6,jishu,2);
  94. //                                        PWM_SetCompare1(0);
  95.                                         for (i = 0; i <= Encoder3_Get()/10; i++)
  96.                                                 {
  97.                                                         PWM_SetCompare1(i);                        //依次将定时器的CCR寄存器设置为0~100,PWM占空比逐渐增大,LED逐渐变亮
  98.                                                         Delay_ms(10);
  99.                                                 }
  100.                                         for (i = 0; i <= Encoder3_Get()/10; i++)
  101.                                                 {
  102.                                                         PWM_SetCompare1(100 - i);        //依次将定时器的CCR寄存器设置为100~0,PWM占空比逐渐减小,LED逐渐变暗
  103.                                                         Delay_ms(10);
  104.                                                 }
  105.                         break; //模式0——关机
  106.                         case 1:
  107.                                                 if(humi<25)                        Motor_SetSpeed(0);
  108.                                                 else if(humi>=25 && humi<100)
  109.                                                 {
  110.                                                 Motor_SetSpeed(humi);
  111.                                                 PWM_SetCompare1(humi);
  112.                                                 for (i = 0; i <= (100-humi); i++)
  113.                                                 {
  114.                                                         PWM_SetCompare1(i);                        //依次将定时器的CCR寄存器设置为0~100,PWM占空比逐渐增大,LED逐渐变亮
  115.                                                         Delay_ms(10);                                //延时10ms
  116.                                                 }
  117.                                                 for (i = 0; i <= (100-humi); i++)
  118.                                                 {
  119.                                                         PWM_SetCompare1(100 - i);        //依次将定时器的CCR寄存器设置为100~0,PWM占空比逐渐减小,LED逐渐变暗
  120.                                                         Delay_ms(10);                                //延时10ms
  121.                                                 }                       
  122.                                                
  123.                                                 }
  124.                                                 else         OLED_ShowString(2,5,"error");
  125.                                                
  126.                         break;//模式1——温控
  127.                         case 2:
  128.                                                 if(Key_num == 2)
  129.                                                 {
  130.                                                         if(++jishu == 11) jishu = 0;
  131.                                                 }
  132.                                                 OLED_ShowNum(4,6,jishu,2);
  133.                                                 Motor_SetSpeed(jishu*10);
  134.                                                         for (i = 0; i <= (100-jishu*10); i++)
  135.                                                 {
  136.                                                         PWM_SetCompare1(i);                        //依次将定时器的CCR寄存器设置为0~100,PWM占空比逐渐增大,LED逐渐变亮
  137.                                                         Delay_ms(10);                                //延时10ms
  138.                                                 }
  139.                                                 for (i = 0; i <= (100-jishu*10); i++)
  140.                                                 {
  141.                                                         PWM_SetCompare1(100 - i);        //依次将定时器的CCR寄存器设置为100~0,PWM占空比逐渐减小,LED逐渐变暗
  142.                                                         Delay_ms(10);                                //延时10ms
  143.                                                 }                       
  144.                                                        
  145.                         break;//模式2——
  146.                 }
  147.                
  148.                
  149.         }
  150. }               
复制代码

原理图: 无
仿真: 无
代码: 按键完全实现.7z (187.04 KB, 下载次数: 0)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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