【CW32L052测评】 lcd 显示ds18b20测的温度
[复制链接]
本帖最后由 TL-LED 于 2023-8-5 09:12 编辑
这篇来学习下CW32L052驱动DS18B20温度芯片,在LCD上显示温度值。
一、硬件电路
1.1、DS18B20温度传感器内部框图
DS18B20芯片使用单总线通信,外部引脚只需要三个。使用时需要在数据线与电源线之间放置一个4.7K上拉电阻
温度测量范围是:-55~125℃
数据读写时序图
单总线协议没有同步信号,要按照协议规定的时间来读写操作。
1.2、开发板端口
DS18B20使用的模拟单总线方式,开发板上任选一个GPIO引脚。我这里选择PC11端口
二、程序
2.1、fun_ds18b20.c
#include "main.h"
void ds18b20_reset(void)
{
DS18B20_DAT_OUT(0);
delay_us(750);
DS18B20_DAT_OUT(1);
delay_us(15);
}
uint8_t ds18b20_check(void)
{
uint8_t rt = 0;
uint8_t rval = 0;
while (DS18B20_DAT_IN && rt < 200)
{
rt++;
delay_us(1);
}
if (rt >= 200)
{
rval = 1;
}
else
{
rt = 0;
while (!DS18B20_DAT_IN && rt < 240)
{
rt++;
delay_us(1);
}
if (rt >= 240) rval = 1;
}
return rval;
}
uint8_t ds18b20_read_bit(void)
{
uint8_t dat = 0;
DS18B20_DAT_OUT(0);
delay_us(2);
DS18B20_DAT_OUT(1);
delay_us(12);
if (DS18B20_DAT_IN)
{
dat = 1;
}
delay_us(50);
return dat;
}
uint8_t ds18b20_read_byte(void)
{
uint8_t i, b, dat = 0;
for (i = 0; i < 8; i++)
{
b = ds18b20_read_bit();
dat |= b << i;
}
return dat;
}
void ds18b20_write_byte(uint8_t dat)
{
uint8_t j;
for (j = 1; j <= 8; j++)
{
if (dat & 0x01)
{
DS18B20_DAT_OUT(0);
delay_us(2);
DS18B20_DAT_OUT(1);
delay_us(60);
}
else
{
DS18B20_DAT_OUT(0);
delay_us(60);
DS18B20_DAT_OUT(1);
delay_us(2);
}
dat >>= 1;
}
}
void ds18b20_start(void)
{
ds18b20_reset();
ds18b20_check();
ds18b20_write_byte(0xcc);
ds18b20_write_byte(0x44);
}
uint8_t init_ds18b20(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.IT = GPIO_IT_NONE;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_InitStruct.Pins = DS18B20_GPIO_PIN;
GPIO_Init(DS18B20_GPIO_PORT, &GPIO_InitStruct);
ds18b20_reset();
return ds18b20_check();
}
short ds18b20_get_temperature(void)
{
uint8_t flag = 1;
uint8_t TL, TH;
short temp;
ds18b20_start();
ds18b20_reset();
ds18b20_check();
ds18b20_write_byte(0xcc);
ds18b20_write_byte(0xbe);
TL = ds18b20_read_byte();
TH = ds18b20_read_byte();
if (TH > 7)
{
TH = ~TH;
TL = ~TL;
flag = 0;
}
temp = TH;
temp <<= 8;
temp += TL;
if (flag == 0)
{
temp = (double)(temp+1) * 0.625;
temp = -temp;
}
else
{
temp = (double)temp * 0.625;
}
return temp;
}
2.2、main.c
int32_t main(void)
{
uint8_t dp[8];
uint8_t i=0;
uint16_t tp=0;
uint32_t dp1=0;
uint32_t dp_temp=0;
short temperature=0;
float tmp=0;
GPIO_InitTypeDef GPIO_InitStruct = {0};
rcc_config();
init_uart();
init_led();
init_adc();
init_spi_flash();
init_i2c();
init_delay();
LCD_Configuration();
printf("cw32l052 board test! \r\n");
if(init_ds18b20()==0)
{
printf("ds18b20 init ok! \r\n");
}
dp[0]=disp[0];
dp[1]=disp[0];
dp[2]=disp[0];
dp[3]=disp[0];
dp[4]=disp[0];
dp[5]=disp[0];
dp[6]=disp[0];
dp[7]=disp[0];
// SPI_FLASH_Test();
// I2C_Test();
while (1)
{
temperature = ds18b20_get_temperature();
tmp=temperature;
printf("temperature value = %2.1f \r\n",tmp/10 );
tp=temperature;
dp[3]=disp[tp/100];
dp[2]=disp_p[(tp%100)/10];
dp[1]=disp[(tp%100)%10];
led2_tog();
delay_ms(100);
lcd_disp(dp);
}
}
三、运行结果
3.1、串口输出温度值
3.2、运行视频
18b20
|