利用板载温度传感器18B20,测试温度,通过led灯提示温度高低,温度越高则越亮
1条回答 默认 最新
- 乐观的study123 2022-06-23 05:42关注
///////////////////////////////////////采用PWM控制亮度
#include "delay.h"
#include "sys.h"
#include "string.h"
#include "stdio.h"float temp_avrg=0;//按键函数
u8 Temperature4=0;
#define DQ_READ GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)u8 teml=10,temh=40;
u16 count = 0,count_h=0,count_l=0;//串口相关
extern unsigned char RxCounter,Usart1RecBuf[64];
extern char bUsart1RecFlag;unsigned char cur_conn_id;
char *strx=0;
#define LED1 PBout(7)
u16 pwm_h=0;
void Clear_Buffer(void)//清空缓存
{
u8 i;
for(i=0;i<64;i++)
Usart1RecBuf[i]=0;//缓存
RxCounter=0;
}
void DS18B20_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
// 配置IO口
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //配置IO为浮空输入模式
GPIO_Init(GPIOB,&GPIO_InitStructure);
}//函数名称:DQ_Mode
// 功能描述:DS18B20 IO控制脚
void DQ_Mode(u8 mode)
{
GPIO_InitTypeDef GPIO_InitStructure;
if(mode==1)
{
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD; // 配置IO为开漏输出模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //配置IO口的输出速率是50M
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_WriteBit(GPIOB,GPIO_Pin_5,Bit_RESET);
}
else
{
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
}
//功能描述:DS18B20 初始化序列u8 DS18B20_Reset(void)
{
u8 ack = 1;
DQ_Mode(1);
delay_us(480);
DQ_Mode(0);
delay_us(60);
ack = DQ_READ;
delay_us(250);
return ack;
}
// 函数名称:DS18B20_Write
//功能描述:向DS18B20写入一个字节
void DS18B20_Write (u8 dat )
{
u8 i = 0;
for(i=0;i<8;i++)
{
DQ_Mode(1);
delay_us(1);
if(dat&0x01)
DQ_Mode(0);
else DQ_Mode(1);
delay_us(40);
DQ_Mode(0);
dat >>= 1;
delay_us(1);
}
}
//功能描述:读DS18B20 的数据
u8 DS18B20_Read (void)
{
u8 i = 0;
u8 dat = 0;
for(i=0;i<8;i++)
{
DQ_Mode(1);
delay_us(1);
DQ_Mode(0);
dat >>= 1;
delay_us(7);
if(DQ_READ)
{
dat |= 0x80;
}
delay_us(60);
}
return dat;
}
//功能描述:读DS18B20 的温度
u16 Get_DS18B20_Tmp(void)
{
u8 a[2];
u32 temp;
if(DS18B20_Reset()) return 0;
DS18B20_Write(0xCC);
DS18B20_Write(0x44);if(DS18B20_Reset()) return 0; DS18B20_Write(0xCC); DS18B20_Write(0xBE); a[0] = DS18B20_Read(); a[1]= DS18B20_Read(); temp = (a[1]<<8)|a[0]; if(temp&0xF000) { temp=(~temp+1)&0xffff; temp = temp*625/1000; temp =(~temp+1)&0xffff; } else temp = temp*625/1000; //温度值 return (u16)temp;
}
void TIM2_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM3中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1; //先占优先级0级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级3级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 TIM_Cmd(TIM2, ENABLE); //使能TIMx外设
}
u8 FLICKER = 0;
void TIM2_IRQHandler(void) //TIM3中断
{static int count = 0; if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 { if(count_h<pwm_h) count_h++; else LED1=0; count++; if(count--== 0 )//8毫秒闪烁一次 { count=833; LED1=1; count_h=0; } TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源 }
}
int main(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); delay_init(); //初始化 NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 TIM2_Int_Init(9,72-1); //定时器初始化,定时0.01MS DS18B20_Init();
count=833;
pwm_h=0;
while(1)
{Temperature4=Get_DS18B20_Tmp()/10.0; pwm_h=Temperature4*833/100;
}
}本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥50 三种调度算法报错 有实例
- ¥15 关于#python#的问题,请各位专家解答!
- ¥200 询问:python实现大地主题正反算的程序设计,有偿
- ¥15 smptlib使用465端口发送邮件失败
- ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
- ¥15 对于squad数据集的基于bert模型的微调
- ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
- ¥20 steam下载游戏占用内存
- ¥15 CST保存项目时失败
- ¥20 java在应用程序里获取不到扬声器设备