利用板载温度传感器18B20,测试温度,通过led灯提示温度高低,温度越高则越亮
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;
}
}