基于stm32f103c8t6的温度检测程序

2020-08-02来源: 51hei关键字:stm32f103c8t6  温度检测  温度阈值

一、实现的功能
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

四、演示的视频太大了,需要的私聊

单片机源程序如下:

#include "sys.h"

#include "delay.h"

#include "usart.h"

#include "led.h"

#include "oled.h"

#include "myiic.h"

#include "stm32f10x.h"

#include "keyscan.h"

#include "stdio.h"

#include "stdlib.h"

#include

#include "ds18b20.h"

#include "timer.h"

#define uchar unsigned char

#define uint unsigned int

uchar num,i,sign,j;

short temperature;   

float temp_1,temp_2,temp_3;

uchar temp[16];        //最大输入16个

uchar flag_2,flag_buzz,flag_blow,flag_swt,flag_bit;

uchar tt,dd;

float a,m=0,n=0;

uchar w[16],t[16],d[16],h[16];

uchar s,c;

void set_temp(void);

void buzzer_init(void);

void blower_init(void);

void blower_opr(void);

int main(void)

{

        NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级

         TIM3_PWM_Init(1999,719);         //PWM频率=72000000/(719+1)/(1999+1)=50hz=20mS

        delay_init(72);                  //初始化延时函数

        LED_Init();                        //初始化LED端口

        IIC_Init();

  OLED_Init();

        DS18B20_Init();

        buzzer_init();        

        a=29;

  /**下面是通过直接操作库函数的方式实现IO控制**/        

        while(1)

        {

                blower_opr();

                temperature=DS18B20_Get_Temp();

                temp_1=        temperature/10;temp_2=temperature%10;

                temp_3=temp_1+temp_2*0.1;sprintf((char *)d,"%g",temp_3);               

    tt++;dd++;               

                if(tt==10){

                tt=0;

                OLED_P8x16Str(80,0,(unsigned char*)d);

                }

                if(dd==6)

    {if(flag_bit==0)flag_bit=1;

                        else if(flag_bit==1)flag_bit=0;

                        dd=0;

                }

                num=keyscan();

                if((temp_3>=a)&&(flag_swt!=10)){ blower_init();}

          else if((temp_3

                else if(flag_swt==10){flag_blow=0;}

                if((temp_3>=a)&&(flag_buzz==0)){ GPIO_ResetBits(GPIOB, GPIO_Pin_13);}

          else if((temp_3

                else if(flag_buzz==1){GPIO_SetBits(GPIOB, GPIO_Pin_13);}

                OLED_P16x16Ch(0,0,0);      

                OLED_P16x16Ch(18,0,1);      

                OLED_P16x16Ch(36,0,2);      

                OLED_P16x16Ch(54,0,3);

                OLED_P16x16Ch(0,3,4);      

                OLED_P16x16Ch(18,3,5);      

                OLED_P16x16Ch(36,3,6);      

                OLED_P16x16Ch(54,3,7);                     

                OLED_P8x16Str(70,0,(unsigned char*)":");

                OLED_P8x16Str(70,3,(unsigned char*)":");

                if(num!=0xff)  

   {

      set_temp();

            if(num=='-'){flag_buzz=1;}

                        if(num=='x'){flag_swt=10;}

         }

         

        }

}

void set_temp()

{

        

         if((1==i)&& (temp[0]=='0') )//如果第一个字符是0,判读第二个字符

        {

        if((num=='.')&&(flag_2==0))  //如果是小数点则正常输入,光标位置加1

        {

                temp[1]='.';

                OLED_P8x16Str(88,3,(unsigned char*)".");        

          i++;

                flag_2=1;

                        }

else

{

          temp[0]=num+'0'; //如果是1-9数字,说明0没有用,则直接替换第一位0

          m=num;

          for(s=0;s<16;s++) //赋值完成后把缓冲区清零,防止下次输入影响结果

                w[s]=0;

          sprintf((char *)w,"%g",m);

                OLED_P8x16Str(80,3,(unsigned char*)w);        //输出数据

}

}

else if((num!='=')&&(num!='+')&&(num!='-')&&(num!='x')&&(num!='/'))

{

           if(num!='.'){

                 temp[i]=num+'0';

           n=num;

           for(s=0;s<16;s++) //赋值完成后把缓冲区清零,防止下次输入影响结果

                 t[s]=0;

     sprintf((char *)t,"%g",n);         

                OLED_P8x16Str(80+i*8,3,(unsigned char*)t);        //输出数据

           i++;

     if(i>3){i=3;}                   }//输入数值累加

                 else if((num=='.')&&(flag_2==0))

                 {

                         temp[i]=num;

                         OLED_P8x16Str(80+i*8,3,(unsigned char*)".");//输出数据

             i++;if(i>3){i=3;}

                         flag_2=1;

                 }

}

if(num=='=')

{

        sscanf((char *)temp,"%f",&a);

        OLED_P16x16Ch(0,6,8);      

        OLED_P16x16Ch(18,6,9);      

        OLED_P16x16Ch(36,6,10);      

  OLED_P16x16Ch(54,6,11);

        delay_ms(1000);

        for(s=0;s<16;s++){h[s]=' ';

  OLED_P8x16Str(0,6,(unsigned char*)h);}

        for(s=0;s<16;s++){h[s]=0;}

}

if(num=='+')

{

         i=0;flag_2=0;

         for(s=0;s<6;s++){temp[s]=' ';

                 OLED_P8x16Str(80,3,(unsigned char*)temp);}

         for(s=0;s<16;s++){temp[s]=0;}

}

}

void buzzer_init()

{

        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);        

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;

        GPIO_Init(GPIOB, &GPIO_InitStructure);

}

[1] [2]
关键字:stm32f103c8t6  温度检测  温度阈值 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic504972.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32串口接收不定长数据原理与源程序
下一篇:STM32驱动OV7670摄像头寻迹(直线)初步调试成功

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32F103C8T6的RC522 RFID模块调试程序
单片机源程序如下:#include "usart.h"#include "stm32f10x_spi.h"#include "RC522.h"#include "delay.h"#include "string.h"#include "spi_driver.h"#include "stdio.h"/******************************************************************************硬件连接STM32F103C8T6
发表于 2020-07-23
<font color='red'>STM32F103C8T6</font>的RC522 RFID模块调试程序
windows 下vscode+platformio开发stm32f103c8t6最小系统
-stm32cubeplatformioldscriptsSTM32F103C8_DEFAULT.ld,打开。把红框里的内容改为 _estack = 0x20005000; 加一个0,就这一个0,天大的坑的存在,对于熟悉使用gcc编译的人,可能并不很难,但对于我等新手,这个问题实在太难找!!!之后,把这个文件另存为STM32F103C8_flash.ld,不另存也可以,但我喜欢完美,Platformio的源码是先寻找_FLASH.ld再寻找DEFAULT.ld的。好了,再编译,上传(CTRL+ALT+B,CTRL+ALT+U)。享受使用vscode编写stm32的乐趣吧!main.c#include <stm32f1xx_hal.h>  #define
发表于 2020-04-15
windows 下vscode+platformio开发<font color='red'>stm32f103c8t6</font>最小系统
一种keil5锁死STM32F103C8T6的解决方法
先前画的一款电机驱动板,今天总算有时间调试了,,,效果如上,实验室里面的洗板水用没了。。。。没有办法收拾的干净了,LED 没了。。。 接线端子开关也没了。。。条件很艰苦 进入正题,上图主控是STM32F103C8T6就是网上卖的最便宜的那种。出现的问题时keil下载不进去程序。提示是这样玩的我先用j-link自带的工具j-flash进行了测试确定了芯片是可以通讯并且可以进行hex文件的烧录的。这样定位问题应该是keil 的配置出了问题。 keil也不是一直出问题。某一次 也是可以下载的。经过多次尝试,我发现当我用j-flash擦除芯片并且解锁unsecure芯片之后keil可以正常的下载程序。 然后就
发表于 2020-04-11
一种keil5锁死<font color='red'>STM32F103C8T6</font>的解决方法
STM32F103C8T6引脚功能分布
引脚分布:数据手册中的:
发表于 2020-03-29
<font color='red'>STM32F103C8T6</font>引脚功能分布
stm32f103c8t6最小系统AD工程,封装
7*7厘米大小,稳压用的LM1117s,已经打印焊接过了,可以用。两边的是焊盘不能焊排针。因为是新手画的板子比较大。反正能用,LED灯的焊盘稍微有点问题,焊盘距离有点大,但也能焊上。其他封装都没什么问题。当初画的时候找封装找了好久,在这里发一下,看到的直接用就好了。
发表于 2020-02-22
<font color='red'>stm32f103c8t6</font>最小系统AD工程,封装
基于51单片机实钟、土壤湿度检测、空气温度检测程序
项目是在相应环境中检测土壤湿度,以及检测空气温度。软件环境:Keil C51软件     硬件环境:KST 51开发( 自带 温度、显示器模块)使用模块:土壤湿度传感器    PCF8591 AD转换模块 DS1302时钟模块土壤湿度传感器1.传感器适用于土壤的湿度检测2.比较器采用LM393芯片,工作性能稳定3.工作电压3.3V-5V4.模块中蓝色的电位器是用于土壤湿度的阀值调节,顺时针调节,控制的湿度会越大,逆时针越小;5.数字量输出D0可以与单片机直接相连,通过单片机来检测高低电平,由此来检测土壤湿度;6.小板模拟量输出AO可以和AD模块相连
发表于 2020-02-09
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved