標(biāo)題:
基于stm32f103c8t6的溫度檢測(cè)程序-涂益豪
[打印本頁]
作者:
涂益豪
時(shí)間:
2020-7-25 14:19
標(biāo)題:
基于stm32f103c8t6的溫度檢測(cè)程序-涂益豪
一、實(shí)現(xiàn)的功能
1.OLED 屏幕顯示溫度變化和進(jìn)行溫度閾值設(shè)置;
2.不同的閾值對(duì)應(yīng)不同的電風(fēng)扇轉(zhuǎn)速(電風(fēng)扇燒壞了,電機(jī)沒買,用舵機(jī)代替,轉(zhuǎn)動(dòng)不同的角度對(duì)應(yīng)的占空比)
3.高于閾值風(fēng)扇啟動(dòng)和蜂鳴器響,可以通過按鍵關(guān)閉這兩個(gè)
二.矩陣鍵盤功能
1
2
3
重置閾值
4
5
6
關(guān)閉蜂鳴器
7
8
9
關(guān)閉風(fēng)扇
確認(rèn)
0
.
三、接線
舵機(jī)的pwm口接PB5;
蜂鳴器的I/O口接PB13;
矩陣鍵盤接PA0-PA7;
OLED 屏幕的SCL接PB10,SDA接PB11
四、演示的視頻太大了,需要的私聊
單片機(jī)源程序如下:
#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 <string.h>
#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個(gè)
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(); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
TIM3_PWM_Init(1999,719); //PWM頻率=72000000/(719+1)/(1999+1)=50hz=20mS
delay_init(72); //初始化延時(shí)函數(shù)
LED_Init(); //初始化LED端口
IIC_Init();
OLED_Init();
DS18B20_Init();
buzzer_init();
a=29;
/**下面是通過直接操作庫函數(shù)的方式實(shí)現(xiàn)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<a)){flag_blow=0;flag_swt=0;}
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<a)){GPIO_SetBits(GPIOB, GPIO_Pin_13);flag_buzz=0;}
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') )//如果第一個(gè)字符是0,判讀第二個(gè)字符
{
if((num=='.')&&(flag_2==0)) //如果是小數(shù)點(diǎn)則正常輸入,光標(biāo)位置加1
{
temp[1]='.';
OLED_P8x16Str(88,3,(unsigned char*)".");
i++;
flag_2=1;
}
else
{
temp[0]=num+'0'; //如果是1-9數(shù)字,說明0沒有用,則直接替換第一位0
m=num;
for(s=0;s<16;s++) //賦值完成后把緩沖區(qū)清零,防止下次輸入影響結(jié)果
w[s]=0;
sprintf((char *)w,"%g",m);
OLED_P8x16Str(80,3,(unsigned char*)w); //輸出數(shù)據(jù)
}
}
else if((num!='=')&&(num!='+')&&(num!='-')&&(num!='x')&&(num!='/'))
{
if(num!='.'){
temp[i]=num+'0';
n=num;
for(s=0;s<16;s++) //賦值完成后把緩沖區(qū)清零,防止下次輸入影響結(jié)果
t[s]=0;
sprintf((char *)t,"%g",n);
OLED_P8x16Str(80+i*8,3,(unsigned char*)t); //輸出數(shù)據(jù)
i++;
if(i>3){i=3;} }//輸入數(shù)值累加
else if((num=='.')&&(flag_2==0))
{
temp[i]=num;
OLED_P8x16Str(80+i*8,3,(unsigned char*)".");//輸出數(shù)據(jù)
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);
}
void blower_init()
{
if(a<29.3){flag_blow=1;}
else if((a>=29.3)&&(a<30)){flag_blow=2;}
else flag_blow=3;
}
void blower_opr()
{
if(flag_blow==0){ TIM_SetCompare2(TIM3,1750);}
else if(flag_blow==1){
if(!flag_bit)
TIM_SetCompare2(TIM3,1750);
else if(flag_bit)
TIM_SetCompare2(TIM3,1800); }
else if(flag_blow==2)
{
if(!flag_bit)
TIM_SetCompare2(TIM3,1750);
else if(flag_bit)
TIM_SetCompare2(TIM3,1850);
}
else if(flag_blow==3){
if(!flag_bit)
TIM_SetCompare2(TIM3,1750);
else if(flag_bit)
TIM_SetCompare2(TIM3,1900);}
}
復(fù)制代碼
所有程序51hei提供下載:
I2C_OLED.7z
(206.97 KB, 下載次數(shù): 57)
2020-7-25 14:59 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
涂益豪
時(shí)間:
2020-7-25 14:21
蜂鳴器和舵機(jī)的供電記得用5v穩(wěn)壓管,記得與單片機(jī)共地
作者:
涂益豪
時(shí)間:
2020-7-25 21:07
補(bǔ)充一點(diǎn),溫度傳感器用的是DS18B20,進(jìn)行i2c協(xié)議的I/O口是PB0
作者:
wang_01809
時(shí)間:
2020-7-25 23:34
學(xué)習(xí)了,代碼能多點(diǎn)備注就好了
作者:
涂益豪
時(shí)間:
2020-7-26 10:12
wang_01809 發(fā)表于 2020-7-25 23:34
學(xué)習(xí)了,代碼能多點(diǎn)備注就好了
好滴,繼續(xù)改進(jìn)
作者:
涂益豪
時(shí)間:
2020-7-26 10:16
有兩個(gè)器件用到了i2c,分別是ds18b20,oled屏幕。這兩個(gè)都是通過軟件模擬i2c
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1