own_head.h
需要添加的头文件,名称可以自己改
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "string.h"
#include "stm32f1xx_hal.h"
/* USER CODE END Includes */
/*USERCODE BEGIN PD */
//I0操作
#define DS18B20_DQ_H HAL_GPIO_WritePin(GPIOA,GPIO_PIN_11,GPIO_PIN_SET)
#define DS18B20_DQ_L HAL_GPIO_WritePin(GPIOA,GPIO_PIN_11,GPIO_PIN_RESET)
#define DS18B20_DQ_ReadPin HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_11)
#define PWM_H HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_SET)
#define PWM_L HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_RESET)
/*USER CODE END PD */
//添加LCD需要的变量
/*USER CODE BEGIN PV */
uint8_t const table1[]="Temp=";
uint8_t const table2[]="DC Motor opened";
uint8_t const table3[]="DC Motor closed";
TIM_HandleTypeDef htim3;
char buff[16];
/*USER CODE END PV */
// us级定时模块
void Delay_us (uint16_t us)
{
uint16_t differ = 0xffff-us-5;
__HAL_TIM_SET_COUNTER(&htim3,differ);
HAL_TIM_Base_Start(&htim3);
while(differ<0xffff-6)
differ=__HAL_TIM_GET_COUNTER(&htim3);
HAL_TIM_Base_Stop(&htim3);
}
//添加LCD 显示控制模块
void LcdWriteCom (uint8_t com)
{
Delay_us(20);
GPIOA->BSRR = 0x00ff0000;
GPIOA->BSRR = (com);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_15,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_14,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_13,GPIO_PIN_RESET);
Delay_us(10);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_13,GPIO_PIN_SET);
Delay_us(10);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_13,GPIO_PIN_RESET);
Delay_us(10);
}
void LcdWriteDate (uint8_t date)
{
Delay_us(20);
GPIOA->BSRR = 0x00ff0000;
GPIOA->BSRR = (date) ;
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_15,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_14,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_13,GPIO_PIN_RESET);
Delay_us (10);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_13,GPIO_PIN_SET);
Delay_us (10);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_13,GPIO_PIN_RESET);
Delay_us (10);
}
void LCD1602Init(void)
{
uint8_t index=0;
HAL_Delay(100);
LcdWriteCom(0x38); //设置16*2显示,8位数据接口
LcdWriteCom(0x0c); //开显示,显示光标且闪烁
LcdWriteCom(0x06);//写一个指针自动加一
LcdWriteCom(0x01);//清屏
HAL_Delay(100);//延时一段时间时间,等待LCD1602稳定
LcdWriteCom(0x80);//设置第一行 数据地址指针
for(index=0;index<13;index++)
LcdWriteDate(table1[index]); //写入数据
}
void LCD1602WriteCommand(uint8_t comm)
{
LcdWriteCom(0xc0 + 14);
LcdWriteDate(comm); //写入数据
}
//DS18B20 驱动模块 用的是 PA11,输入 0 配置为输入,输入 1 配置为输出
void DS18B20_DQ_DDR(uint8_t ddr){
if (ddr == 1){
GPIOA->CRH&=0xFFFF1FFF;
GPIOA->CRH|=0x00001000;
}
else{
GPIOA->CRH&=0xFFFF8FFF;
GPIOA->CRH|=0x00008000;
}
}
//从 DS18B20 读取一个字节
uint8_t DS18B20_Rbit(void)
{
uint8_t date,x ;
DS18B20_DQ_DDR(1);
DS18B20_DQ_L; //拉低
Delay_us(2); //延时2us
DS18B20_DQ_H;//释放,输出高
DS18B20_DQ_DDR(0);
Delay_us(12); //延时12us
x = DS18B20_DQ_ReadPin;
if(x)
date=0x80; //判断输入的电平,如果为高电平则该位数据为1
else
date=0; //如果为低电平则该位数据为0
Delay_us(50);
return date;
}
uint8_t DS18B20_Rbyte(void){
uint8_t rbyte = 0,i = 0, tempbit =0;
for (i= 1; i <= 8; i++)
{
tempbit = DS18B20_Rbit();
rbyte = rbyte >> 1;
rbyte = rbyte | tempbit;
}
return rbyte;
}
//写一个字节到 DS18B20
void DS18B20_Wbyte(uint8_t xbyte){
uint8_t i,x = 0;
DS18B20_DQ_DDR(1) ;
for(i = 1;i <= 8; i++)
{
x = xbyte & 0x01;
if(x)//输出高,也就是写1
{
DS18B20_DQ_L;
Delay_us(2);
DS18B20_DQ_H;
Delay_us(60);
}
else //输出低,也就是写0
{
DS18B20_DQ_L;
Delay_us(60);
DS18B20_DQ_H;
Delay_us(2);
}
xbyte = xbyte >> 1;
}
}
//DS18B20 复位函数
void DS18B20_Reset(void){
//改变DQ引脚为输出
DS18B20_DQ_DDR(1);//先置高
DS18B20_DQ_H;
Delay_us(700); //延时700us,使总线稳定
DS18B20_DQ_L;//复位脉冲,低电位
Delay_us(500);//保持至少480us,这里500us
DS18B20_DQ_DDR(0);//改变DQ引脚为输入
//拉高数据线,释放总线
DS18B20_DQ_H;
Delay_us(40) ;//等待15-60us,这里33us
Delay_us(33);//等待35us,这里33us
DS18B20_DQ_ReadPin;//聆听,判断有没有初始化成功(DS18B20有没有发送应答脉冲)
Delay_us(500);//至少480us后进入接收状态,这里500us
}
//从 DS18B20 得到温度值
short DS18B20_Get_Temp (void){
uint8_t fg;
uint8_t TL,TH;
short data ;
DS18B20_Reset(); // DS18B20初始化
DS18B20_Wbyte(0xcc); //跳过读取序列号
DS18B20_Wbyte(0x44); //启动温度转换
DS18B20_Reset();
DS18B20_Wbyte(0xcc);
DS18B20_Wbyte(0xbe) ; //读温度寄存器
TL = DS18B20_Rbyte();
TH = DS18B20_Rbyte();
//符号位为负
if(TH > 0x7){
TL = ~TL;
TH = ~TH;
fg = 0;
}
else
fg = 1;//整数部分
data = TH;
data <<= 8;
data += TL;
data = (float)data*0.0625;
if(fg)
return data;
else
return -data ;
}
版权声明:本文为zsdoujiang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。