基于STM32单片机的体温检测系统的设计程序
时间: 2023-12-20 08:06:31 浏览: 116
基于STM32单片机的心率计步体温显示系统设计.doc
5星 · 资源好评率100%
这里提供一个基于STM32单片机的体温检测系统的设计程序,仅供参考。
#include "stm32f10x.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "delay.h"
#define LCD_RS_LOW() GPIO_ResetBits(GPIOA,GPIO_Pin_1) //RS低电平
#define LCD_RS_HIGH() GPIO_SetBits(GPIOA,GPIO_Pin_1) //RS高电平
#define LCD_RW_LOW() GPIO_ResetBits(GPIOA,GPIO_Pin_2) //RW低电平
#define LCD_RW_HIGH() GPIO_SetBits(GPIOA,GPIO_Pin_2) //RW高电平
#define LCD_EN_LOW() GPIO_ResetBits(GPIOA,GPIO_Pin_3) //EN低电平
#define LCD_EN_HIGH() GPIO_SetBits(GPIOA,GPIO_Pin_3) //EN高电平
//LCD初始化
void LCD_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //初始化GPIOA时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
LCD_EN_LOW();
LCD_RW_LOW();
LCD_RS_LOW();
delay_ms(15);
LCD_RS_LOW();
LCD_EN_HIGH();
GPIO_Write(GPIOA,0x30);
LCD_EN_LOW();
delay_ms(5);
LCD_EN_HIGH();
GPIO_Write(GPIOA,0x30);
LCD_EN_LOW();
delay_ms(1);
LCD_EN_HIGH();
GPIO_Write(GPIOA,0x30);
LCD_EN_LOW();
delay_ms(1);
LCD_EN_HIGH();
GPIO_Write(GPIOA,0x20);
LCD_EN_LOW();
delay_ms(1);
LCD_WriteCommand(0x28);
LCD_WriteCommand(0x08);
LCD_WriteCommand(0x01);
LCD_WriteCommand(0x06);
LCD_WriteCommand(0x0C);
}
//LCD写命令函数
void LCD_WriteCommand(uint8_t cmd)
{
LCD_RS_LOW();
LCD_RW_LOW();
delay_us(5);
LCD_EN_HIGH();
GPIO_Write(GPIOA,cmd);
delay_us(5);
LCD_EN_LOW();
}
//LCD写数据函数
void LCD_WriteData(uint8_t dat)
{
LCD_RS_HIGH();
LCD_RW_LOW();
delay_us(5);
LCD_EN_HIGH();
GPIO_Write(GPIOA,dat);
delay_us(5);
LCD_EN_LOW();
}
//LCD写字符串函数
void LCD_WriteString(char *str)
{
while(*str)
{
LCD_WriteData(*str++);
}
}
//温度传感器初始化
void DS18B20_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //初始化GPIOB时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_5);
delay_us(500);
GPIO_ResetBits(GPIOB, GPIO_Pin_5);
delay_us(500);
GPIO_SetBits(GPIOB, GPIO_Pin_5);
delay_us(500);
}
//读取温度传感器数据
void DS18B20_ReadData(uint8_t *data)
{
uint8_t i;
GPIO_ResetBits(GPIOB, GPIO_Pin_5);
delay_us(500);
GPIO_SetBits(GPIOB, GPIO_Pin_5);
delay_us(60);
GPIO_ResetBits(GPIOB, GPIO_Pin_5);
delay_us(5);
GPIO_SetBits(GPIOB, GPIO_Pin_5);
delay_us(5);
GPIO_ResetBits(GPIOB, GPIO_Pin_5);
delay_us(5);
GPIO_SetBits(GPIOB, GPIO_Pin_5);
delay_us(5);
GPIO_ResetBits(GPIOB, GPIO_Pin_5);
delay_us(5);
for(i=0;i<8;i++)
{
GPIO_SetBits(GPIOB, GPIO_Pin_5);
delay_us(5);
data[i] = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5);
delay_us(60);
GPIO_ResetBits(GPIOB, GPIO_Pin_5);
delay_us(5);
}
}
int main(void)
{
LCD_Init();
DS18B20_Init();
uint8_t data[8];
char temp[10];
while(1)
{
DS18B20_ReadData(data);
sprintf(temp, "%d.%d", data[0], data[1]/10);
LCD_WriteCommand(0x80);
LCD_WriteString("Temperature:");
LCD_WriteCommand(0x8F);
LCD_WriteString(temp);
LCD_WriteCommand(0xC0);
if(data[1]>=37)
{
LCD_WriteString("Warning: High");
}
else if(data[1]<=35)
{
LCD_WriteString("Warning: Low");
}
else
{
LCD_WriteString("Normal");
}
delay_ms(1000);
}
}
阅读全文