own_head.h

  • Post author:
  • Post category:其他

需要添加的头文件,名称可以自己改

/* 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 版权协议,转载请附上原文出处链接和本声明。