有偿,有大手给个文件不

利用板载温度传感器18B20,测试温度,通过led灯提示温度高低,温度越高则越亮

img


///////////////////////////////////////采用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; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值     计数到5000500ms
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;
        

}
}