利用stm32f103c8编写lcd1602和DS18b20完成温度检测的程序
时间: 2023-10-24 08:04:31 浏览: 79
好的,以下是基于STM32F103C8的LCD1602和DS18B20温度检测的程序:
```
#include "stm32f10x.h"
#include "delay.h"
#include "lcd1602.h"
#define DS18B20_GPIO GPIOB
#define DS18B20_PIN GPIO_Pin_12
void RCC_Configuration(void);
void GPIO_Configuration(void);
void Delay_us(uint32_t nus);
void Delay_ms(uint32_t nms);
void DS18B20_Init(void);
void DS18B20_WriteByte(uint8_t dat);
uint8_t DS18B20_ReadByte(void);
void DS18B20_Start(void);
float DS18B20_GetTemperature(void);
int main(void)
{
float temperature;
char str[16];
RCC_Configuration();
GPIO_Configuration();
LCD1602_Init();
DS18B20_Init();
while(1)
{
temperature = DS18B20_GetTemperature();
sprintf(str, "Temperature:%.1f", temperature);
LCD1602_ShowString(0, 0, (uint8_t *)str);
Delay_ms(1000);
}
}
void RCC_Configuration(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void Delay_us(uint32_t nus)
{
uint32_t i;
for(i=0; i<nus*8; i++);
}
void Delay_ms(uint32_t nms)
{
uint32_t i;
for(i=0; i<nms; i++)
{
Delay_us(1000);
}
}
void DS18B20_Init(void)
{
GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DS18B20_GPIO, &GPIO_InitStructure);
}
void DS18B20_WriteByte(uint8_t dat)
{
uint8_t i;
for(i=0; i<8; i++)
{
if((dat>>i) & 0x01)
{
GPIO_SetBits(DS18B20_GPIO, DS18B20_PIN);
}
else
{
GPIO_ResetBits(DS18B20_GPIO, DS18B20_PIN);
}
Delay_us(5);
GPIO_SetBits(DS18B20_GPIO, DS18B20_PIN);
Delay_us(5);
}
}
uint8_t DS18B20_ReadByte(void)
{
uint8_t i, temp = 0;
for(i=0; i<8; i++)
{
temp >>= 1;
GPIO_SetBits(DS18B20_GPIO, DS18B20_PIN);
Delay_us(5);
if(GPIO_ReadInputDataBit(DS18B20_GPIO, DS18B20_PIN))
{
temp |= 0x80;
}
Delay_us(15);
}
return temp;
}
void DS18B20_Start(void)
{
GPIO_ResetBits(DS18B20_GPIO, DS18B20_PIN);
Delay_us(480);
GPIO_SetBits(DS18B20_GPIO, DS18B20_PIN);
Delay_us(60);
GPIO_ResetBits(DS18B20_GPIO, DS18B20_PIN);
Delay_us(240);
}
float DS18B20_GetTemperature(void)
{
uint8_t temp[2];
float temperature;
DS18B20_Start();
DS18B20_WriteByte(0xCC);
DS18B20_WriteByte(0x44);
Delay_ms(750);
DS18B20_Start();
DS18B20_WriteByte(0xCC);
DS18B20_WriteByte(0xBE);
temp[0] = DS18B20_ReadByte();
temp[1] = DS18B20_ReadByte();
temperature = (float)((temp[1]<<8) + temp[0]) / 16.0;
return temperature;
}
```
这个程序使用了STM32F103C8的GPIOB口来控制LCD1602和DS18B20,其中LCD1602的控制使用了另外一个文件"lcd1602.c"和"delay.c",需要在项目中添加这两个文件。DS18B20的控制则是直接在这个程序中实现的。
程序的主要流程是在main函数中初始化LCD1602和DS18B20,然后循环读取温度值并将其显示在LCD1602上。DS18B20的读取使用了DS18B20_Start、DS18B20_WriteByte和DS18B20_ReadByte三个函数来实现。其中DS18B20_Start函数用于启动DS18B20,DS18B20_WriteByte函数用于向DS18B20写入数据,DS18B20_ReadByte函数用于从DS18B20读取数据。最后,DS18B20_GetTemperature函数用于获取DS18B20的温度值,并将其返回给主函数。
希望这个程序对你有所帮助!
阅读全文