欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1349|回復: 4
打印 上一主題 下一主題
收起左側

這是stm32根據環境亮度自動調節燈光亮度的代碼,跑不起來求大佬看一看

[復制鏈接]
跳轉到指定樓層
樓主
ID:1039168 發表于 2023-12-13 09:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
下載到單片機里燈閃一下就滅了,不知道是什么原因main.c


#include "led.h"
#include "delay.h"
#include "sys.h"
#include "adc.h"
#include "lsens.h"
#include "timer.h"
   
u8 adcx=0;                           //光敏傳感器ADC轉換值


int main(void)
{         
        delay_init();                          //延時函數初始化          
        LED_Init();                                      //初始化與LED連接的硬件接口
                            
        Lsens_Init();                               //初始化光敏傳感器
       
        TIM3_PWM_Init(100,0);
        TIM4_Int_Init(1999,35999);
                      
   
         while(1)
                        {
                        adcx=Lsens_Get_Val();
                                       
                                if((adcx>0)&&(adcx<=20))                        //當前環境亮度小于20,燈光亮度調至最高的第五檔
                                {
                                        TIM_SetCompare2(TIM3,100);
                                        delay_ms(10);
                                }
                                if((adcx>20)&&(adcx<=40))                       //當前環境亮度小于40大于20,燈光亮度調至第四檔
                                {
                                        TIM_SetCompare2(TIM3,80);
                                        delay_ms(10);
                                }
                                if((adcx>40)&&(adcx<=60))                       //當前環境亮度小于60大于40,燈光亮度調至第三檔
                                {
                                        TIM_SetCompare2(TIM3,60);
                                        delay_ms(10);
                                }
                                if((adcx>60)&&(adcx<=80))                        //當前環境亮度小于80大于60,燈光亮度調至第二檔
                                {
                                        TIM_SetCompare2(TIM3,40);
                                        delay_ms(10);
                                }
                                if((adcx>80)&&(adcx<=95))                        //當前環境亮度小于95大于80,燈光亮度調至第一檔
                                {
                                        TIM_SetCompare2(TIM3,20);
                                        delay_ms(10);
                                }
                                if((adcx>95)&&(adcx<=100))                       //當前環境亮度小于100大于95,關閉燈光
                                {
                                        TIM_SetCompare2(TIM3,0);
                                        delay_ms(10);
                                }
                        }
       
}




adc.c


#include "delay.h"
#include "sys.h"


//初始化ADC1
                                                                                                                                          
void  Adc1_Init(void)
{      
        ADC_InitTypeDef ADC_InitStructure;


        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1        , ENABLE );          //使能ADC1通道時鐘
       
  RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);//ADC復位
       
  RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);//復位結束            
       
        ADC_DeInit(ADC1);  //復位ADC1,將外設 ADC1的全部寄存器重設為缺省值
       
       
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC工作模式: 獨立模式
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;        //模數轉換工作在單通道模式
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;        //模數轉換工作在單次轉換模式
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //轉換由軟件而不是外部觸發啟動
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //ADC數據右對齊
        ADC_InitStructure.ADC_NbrOfChannel = 1;        //順序進行規則轉換的ADC通道的數目
        ADC_Init(ADC1, &ADC_InitStructure);        //根據ADC_InitStruct中指定的參數初始化外設ADCx的寄存器  


       
        ADC_Cmd(ADC1, ENABLE);        //使能指定的ADC1
       
        ADC_ResetCalibration(ADC1);        //使能復位校準  
         
        while(ADC_GetResetCalibrationStatus(ADC1));        //等待復位校準結束
       
        ADC_StartCalibration(ADC1);         //開啟AD校準

        while(ADC_GetCalibrationStatus(ADC1));         //等待校準結束
}                 
//獲得ADC1某個通道的值
//ch:通道值 0~16
//返回值:轉換結果
u16 Get_Adc1(u8 ch)   
{
  //設置指定ADC的規則組通道,一個序列,采樣時間
        ADC_RegularChannelConfig(ADC1,ch,1, ADC_SampleTime_239Cycles5 );        //ADC1,ADC通道,采樣時間為239.5周期                                      
  
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的軟件轉換啟動功能       
         
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待轉換結束


        return ADC_GetConversionValue(ADC1);        //返回最近一次ADC1規則組的轉換結果
}



lsens.c光敏電阻


#include "lsens.h"
#include "delay.h"

//初始化光敏傳感器
void Lsens_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
       
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTF時鐘       
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PF8 anolog輸入
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //模擬輸入引腳
        GPIO_Init(GPIOA, &GPIO_InitStructure);       
        Adc1_Init();
}
//讀取Light Sens的值
//0~100:0,最暗;100,最亮
u8 Lsens_Get_Val(void)
{
        u32 temp_val=0;
        u8 t;
        for(t=0;t<LSENS_READ_TIMES;t++)
        {
                temp_val+=Get_Adc1(LSENS_ADC_CHX);        //讀取ADC值
                delay_ms(5);
        }
        temp_val/=LSENS_READ_TIMES;//得到平均值
        if(temp_val>4000)temp_val=4000;
        return (u8)(100-(temp_val/40));
}


timer.c

#include "timer.h"
#include "led.h"
#include "usart.h"
#include "lsens.h"
#include "adc.h"
#include "lsens.h"           
//通用定時器3中斷初始化
//這里時鐘選擇為APB1的2倍,而APB1為36M
//arr:自動重裝值。
//psc:時鐘預分頻數




void TIM3_Int_Init(u16 arr,u16 psc)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;


        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //時鐘使能


        TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值         計數到5000為500ms
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置用來作為TIMx時鐘頻率除數的預分頻值  10Khz的計數頻率  
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數模式
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位

        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中斷,允許更新中斷


        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中斷
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占優先級0級
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //從優先級3級
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
        NVIC_Init(&NVIC_InitStructure);  //根據NVIC_InitStruct中指定的參數初始化外設NVIC寄存器


        TIM_Cmd(TIM3, ENABLE);  //使能TIMx外設
                                                         
}




//定時器3中斷服務程序
void TIM3_IRQHandler(void)   //TIM3中斷
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //檢查指定的TIM中斷發生與否:TIM 中斷源
                {
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中斷待處理位:TIM 中斷源
                LED0=!LED0;
                }
}


//TIM3 PWM部分初始化
//PWM輸出初始化
//arr:自動重裝值
//psc:時鐘預分頻數
void TIM3_PWM_Init(u16 arr,u16 psc)
{  
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
       


        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        //使能定時器3時鐘
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外設和AFIO復用功能模塊時鐘
       
        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5   

   //設置該引腳為復用輸出功能,輸出TIM3 CH2的PWM脈沖波形        GPIOB.5
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //復用推挽輸出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

   //初始化TIM3
        TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置用來作為TIMx時鐘頻率除數的預分頻值
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數模式
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位
       
        //初始化TIM3 Channel2 PWM模式         
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //選擇定時器模式:TIM脈沖寬度調制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
        TIM_OCInitStructure.TIM_Pulse=0;
        TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根據T指定的參數初始化外設TIM3 OC2


        TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的預裝載寄存器

        TIM_Cmd(TIM3, ENABLE);  //使能TIM3
       


}


void TIM4_Int_Init(u16 arr,u16 psc)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;


        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //時鐘使能


        TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值         計數到5000為500ms
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置用來作為TIMx時鐘頻率除數的預分頻值  10Khz的計數頻率  
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數模式
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位

        TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能指定的TIM4中斷,允許更新中斷


        NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;  //TIM3中斷
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占優先級0級
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  //從優先級3級
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
        NVIC_Init(&NVIC_InitStructure);  //根據NVIC_InitStruct中指定的參數初始化外設NVIC寄存器


        TIM_Cmd(TIM4, ENABLE);  //使能TIMx外設
                                                         
}
void PWM_SetCompare1(uint16_t Compare)
{
        TIM_SetCompare1(TIM2, Compare);
}





分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:883242 發表于 2023-12-13 09:41 | 只看該作者
沒接光敏傳感器。
回復

使用道具 舉報

板凳
ID:895440 發表于 2023-12-13 09:52 | 只看該作者
跑不起來的現象是什么?是編譯不通過還是不會自動調整
回復

使用道具 舉報

地板
ID:94031 發表于 2023-12-13 10:24 | 只看該作者
這和光敏電阻特性有關,自己要根據實際光敏電阻特性修改一下程序。
回復

使用道具 舉報

5#
ID:958310 發表于 2023-12-13 11:16 | 只看該作者
把ADC值打印出來看跑到哪個步驟。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表