找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3176|回复: 5
收起左侧

基于stm32f103c8t6的温度检测程序-涂益豪

[复制链接]
ID:492026 发表于 2020-7-25 14:19 | 显示全部楼层 |阅读模式
一、实现的功能
1.OLED 屏幕显示温度变化和进行温度阈值设置;
2.不同的阈值对应不同的电风扇转速(电风扇烧坏了,电机没买,用舵机代替,转动不同的角度对应的占空比)
3.高于阈值风扇启动和蜂鸣器响,可以通过按键关闭这两个
二.矩阵键盘功能
1
2
3
重置阈值
4
5
6
关闭蜂鸣器
7
8
9
关闭风扇
确认
0
.

三、接线
舵机的pwm口接PB5;
蜂鸣器的I/O口接PB13;
矩阵键盘接PA0-PA7;
OLED 屏幕的SCL接PB10,SDA接PB11
四、演示的视频太大了,需要的私聊

单片机源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "oled.h"
  6. #include "myiic.h"
  7. #include "stm32f10x.h"
  8. #include "keyscan.h"
  9. #include "stdio.h"
  10. #include "stdlib.h"
  11. #include <string.h>
  12. #include "ds18b20.h"
  13. #include "timer.h"
  14. #define uchar unsigned char
  15. #define uint unsigned int
  16. uchar num,i,sign,j;
  17. short temperature;   
  18. float temp_1,temp_2,temp_3;
  19. uchar temp[16];        //最大输入16个
  20. uchar flag_2,flag_buzz,flag_blow,flag_swt,flag_bit;
  21. uchar tt,dd;
  22. float a,m=0,n=0;
  23. uchar w[16],t[16],d[16],h[16];
  24. uchar s,c;
  25. void set_temp(void);
  26. void buzzer_init(void);
  27. void blower_init(void);
  28. void blower_opr(void);
  29. int main(void)
  30. {
  31.         NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  32.          TIM3_PWM_Init(1999,719);         //PWM频率=72000000/(719+1)/(1999+1)=50hz=20mS
  33.         delay_init(72);                  //初始化延时函数
  34.         LED_Init();                        //初始化LED端口
  35.         IIC_Init();
  36.   OLED_Init();
  37.         DS18B20_Init();
  38.         buzzer_init();        
  39.         a=29;
  40.   /**下面是通过直接操作库函数的方式实现IO控制**/        
  41.         while(1)
  42.         {
  43.                 blower_opr();
  44.                 temperature=DS18B20_Get_Temp();
  45.                 temp_1=        temperature/10;temp_2=temperature%10;
  46.                 temp_3=temp_1+temp_2*0.1;sprintf((char *)d,"%g",temp_3);               
  47.     tt++;dd++;               
  48.                 if(tt==10){
  49.                 tt=0;
  50.                 OLED_P8x16Str(80,0,(unsigned char*)d);
  51.                 }
  52.                 if(dd==6)
  53.     {if(flag_bit==0)flag_bit=1;
  54.                         else if(flag_bit==1)flag_bit=0;
  55.                         dd=0;
  56.                 }
  57.                 num=keyscan();
  58.                 if((temp_3>=a)&&(flag_swt!=10)){ blower_init();}
  59.           else if((temp_3<a)){flag_blow=0;flag_swt=0;}
  60.                 else if(flag_swt==10){flag_blow=0;}
  61.                 if((temp_3>=a)&&(flag_buzz==0)){ GPIO_ResetBits(GPIOB, GPIO_Pin_13);}
  62.           else if((temp_3<a)){GPIO_SetBits(GPIOB, GPIO_Pin_13);flag_buzz=0;}
  63.                 else if(flag_buzz==1){GPIO_SetBits(GPIOB, GPIO_Pin_13);}
  64.                 OLED_P16x16Ch(0,0,0);      
  65.                 OLED_P16x16Ch(18,0,1);      
  66.                 OLED_P16x16Ch(36,0,2);      
  67.                 OLED_P16x16Ch(54,0,3);
  68.                 OLED_P16x16Ch(0,3,4);      
  69.                 OLED_P16x16Ch(18,3,5);      
  70.                 OLED_P16x16Ch(36,3,6);      
  71.                 OLED_P16x16Ch(54,3,7);                     
  72.                 OLED_P8x16Str(70,0,(unsigned char*)":");
  73.                 OLED_P8x16Str(70,3,(unsigned char*)":");
  74.                 if(num!=0xff)  
  75.    {
  76.       set_temp();
  77.             if(num=='-'){flag_buzz=1;}
  78.                         if(num=='x'){flag_swt=10;}
  79.          }
  80.          
  81.         }
  82. }
  83. void set_temp()
  84. {
  85.         
  86.          if((1==i)&& (temp[0]=='0') )//如果第一个字符是0,判读第二个字符
  87.         {
  88.         if((num=='.')&&(flag_2==0))  //如果是小数点则正常输入,光标位置加1
  89.         {
  90.                 temp[1]='.';
  91.                 OLED_P8x16Str(88,3,(unsigned char*)".");        
  92.           i++;
  93.                 flag_2=1;
  94.                         }
  95. else
  96. {
  97.           temp[0]=num+'0'; //如果是1-9数字,说明0没有用,则直接替换第一位0
  98.           m=num;
  99.           for(s=0;s<16;s++) //赋值完成后把缓冲区清零,防止下次输入影响结果
  100.                 w[s]=0;
  101.           sprintf((char *)w,"%g",m);
  102.                 OLED_P8x16Str(80,3,(unsigned char*)w);        //输出数据
  103. }
  104. }
  105. else if((num!='=')&&(num!='+')&&(num!='-')&&(num!='x')&&(num!='/'))
  106. {
  107.            if(num!='.'){
  108.                  temp[i]=num+'0';
  109.            n=num;
  110.            for(s=0;s<16;s++) //赋值完成后把缓冲区清零,防止下次输入影响结果
  111.                  t[s]=0;
  112.      sprintf((char *)t,"%g",n);         
  113.                 OLED_P8x16Str(80+i*8,3,(unsigned char*)t);        //输出数据
  114.            i++;
  115.      if(i>3){i=3;}                   }//输入数值累加
  116.                  else if((num=='.')&&(flag_2==0))
  117.                  {
  118.                          temp[i]=num;
  119.                          OLED_P8x16Str(80+i*8,3,(unsigned char*)".");//输出数据
  120.              i++;if(i>3){i=3;}
  121.                          flag_2=1;
  122.                  }
  123. }
  124. if(num=='=')
  125. {
  126.         sscanf((char *)temp,"%f",&a);
  127.         OLED_P16x16Ch(0,6,8);      
  128.         OLED_P16x16Ch(18,6,9);      
  129.         OLED_P16x16Ch(36,6,10);      
  130.   OLED_P16x16Ch(54,6,11);
  131.         delay_ms(1000);
  132.         for(s=0;s<16;s++){h[s]=' ';
  133.   OLED_P8x16Str(0,6,(unsigned char*)h);}
  134.         for(s=0;s<16;s++){h[s]=0;}
  135. }
  136. if(num=='+')
  137. {
  138.          i=0;flag_2=0;
  139.          for(s=0;s<6;s++){temp[s]=' ';
  140.                  OLED_P8x16Str(80,3,(unsigned char*)temp);}
  141.          for(s=0;s<16;s++){temp[s]=0;}
  142. }
  143. }
  144. void buzzer_init()
  145. {
  146.         GPIO_InitTypeDef GPIO_InitStructure;
  147.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);        
  148.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  149.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  150.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  151.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  152. }        
  153. void blower_init()
  154. {
  155.         if(a<29.3){flag_blow=1;}
  156.         else if((a>=29.3)&&(a<30)){flag_blow=2;}
  157.         else flag_blow=3;
  158. }
  159. void blower_opr()
  160. {
  161.         if(flag_blow==0){                TIM_SetCompare2(TIM3,1750);}
  162.         else if(flag_blow==1){               
  163.                 if(!flag_bit)                                                                                          
  164.                 TIM_SetCompare2(TIM3,1750);  
  165.                 else if(flag_bit)                                                                                          
  166.                 TIM_SetCompare2(TIM3,1800); }
  167.           else if(flag_blow==2)
  168.                 {
  169.                 if(!flag_bit)                                                                                          
  170.                 TIM_SetCompare2(TIM3,1750);  
  171.                 else if(flag_bit)                                                                                          
  172.                 TIM_SetCompare2(TIM3,1850);
  173.                 }                        
  174.           else if(flag_blow==3){
  175.                 if(!flag_bit)                                                                                          
  176.                 TIM_SetCompare2(TIM3,1750);  
  177.                 else if(flag_bit)                                                                                          
  178.                 TIM_SetCompare2(TIM3,1900);}
  179. }
复制代码

所有程序51hei提供下载:
I2C_OLED.7z (206.97 KB, 下载次数: 57)
回复

使用道具 举报

ID:492026 发表于 2020-7-25 14:21 | 显示全部楼层
蜂鸣器和舵机的供电记得用5v稳压管,记得与单片机共地
回复

使用道具 举报

ID:492026 发表于 2020-7-25 21:07 | 显示全部楼层
补充一点,温度传感器用的是DS18B20,进行i2c协议的I/O口是PB0
回复

使用道具 举报

ID:808034 发表于 2020-7-25 23:34 | 显示全部楼层
学习了,代码能多点备注就好了
回复

使用道具 举报

ID:492026 发表于 2020-7-26 10:12 | 显示全部楼层
wang_01809 发表于 2020-7-25 23:34
学习了,代码能多点备注就好了

好滴,继续改进
回复

使用道具 举报

ID:492026 发表于 2020-7-26 10:16 | 显示全部楼层
有两个器件用到了i2c,分别是ds18b20,oled屏幕。这两个都是通过软件模拟i2c
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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