V.111 2022-06-23 02:01 采纳率: 50%
浏览 37
已结题

有偿,有大手给个文件不

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

  • 写回答

1条回答 默认 最新

  • 乐观的study123 2022-06-23 05:42
    关注

    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;
            
    

    }
    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 7月1日
  • 已采纳回答 6月23日
  • 创建了问题 6月23日

悬赏问题

  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥20 java在应用程序里获取不到扬声器设备