基于辉芒51单片机的5档调光灯

程序思想逻辑:1.采用12v供电的2835灯珠

2.通过一个按键执行0-5档的循环切换,本程序以松开按键有效来执行,所以短按长按都可以

3.调光理论是改变PWM值,设定5个参数,同步按键的档位即可

4.设定定时器的溢出时间,这里是设置TMR0定时时长=1/系统时钟频率x4x预分频值x255

=(1/16000000)x4x2x255=0.127ms

5.设置调光频率,通过修改 if(count>120) 这个参数,来调整档位效果,通过测试,100-120效果比较好,150就

会有明显的频闪 ,值越小档位越不清晰,值越大,频闪越明显.

实测1-5档位波形:




c 复制代码
//                  FT60E011A  SOP8 
//                 ----------------
//  VDD-----------|1(VDD)    (GND)8|------------GND     
//  NC------------|2(PA2)    (PA4)7|----DemoPortOut 
//  NC------------|3(PA1)    (PA5)6|-------------NC
//  NC------------|4(PA3)    (PA0)5|-------------NC
//			       ----------------
// 
//*********************************************************
#include "SYSCFG.h"
//***********************宏定义****************************
#define  unchar         unsigned char 
#define  unint         unsigned int
#define  LED_DR	PA5 
#define  KEY1	PA3                                                                                                                                                                                                                                                                                                                         
#define  key_short	100
unchar led_cur_level=0;                 //按键档位
unint levels[]={0,25,50,75,100};        //灯光亮度
unint DUTY=0;                           //驱动占空比
unchar DIRECTION=1;                     //呼吸灯状态
/*-------------------------------------------------
 * 函数名:interrupt ISR
 * 功能:  TMR0中断处理函数
 * 输入:  无
 * 输出:  无
 --------------------------------------------------*/
void interrupt ISR(void)			
{ 
	//if(T0IE && T0IF)					//16.384ms翻转一次≈30Hz//T0IF为定时器溢出标志位,必须软件清0
//	{
//		T0IF = 0;
//		DemoPortOut = ~DemoPortOut; 	//翻转电平
//	} 
       
	if(T0IE && T0IF)					
	{
          T0IF = 0;
		  static unint count=0;
		  count++;
		  if(count<DUTY){LED_DR=1;}
		  else{LED_DR=0;}
		  if(count>120)                 //0.127MS X120=15.24MS  65hz
		  {
		    count=0;
	        DUTY=levels[led_cur_level];	   
		  }
     }
} 
/*-------------------------------------------------
 * 函数名:POWER_INITIAL
 * 功能:  上电系统初始化
 * 输入:  无
 * 输出:  无
 --------------------------------------------------*/	
void POWER_INITIAL (void) 
{
	OSCCON = 0B01110000;				//IRCF=111=16MHz/4T=4MHz,0.25us                           
	INTCON = 0;  						//暂禁止所有中断
	OPTION = 0B00001000;				//Bit3=1,WDT MODE,PS=000=WDT RATE 1:1

	PORTA = 0B00000000;					
	TRISA  = 0B00001000;					//PA输入输出 0-输出 1-输入
                                        //PA4-OUT
	WPUA = 0B00000000;     				//PA端口上拉控制 1-开上拉 0-关上拉						
	MSCKCON = 0B00000000;
	//Bit4=0,禁止LVR(60e01x O版之前)       
	//Bit4=0,LVREN使能时,开启LVR(60e01x O版及O版之后)  
    //Bit4=1,LVREN使能时,工作时开启LVR,睡眠时自动关闭LVR(60e01x O版及O版后)       
}
/*----------------------------------------------------
 * 函数名:TIMER0_INITIAL
 * 功能:  初始化设置定时器0
 * 设置TMR0定时时长=1/系统时钟频率*4*预分频值*255
                    =(1/16000000)*4*2*255=0.127ms                    
 ----------------------------------------------------*/
void TIMER0_INITIAL (void)  
{
	OPTION = 0B00000000;	 			//时钟源为指令时钟,预分频比为1:2
	//Bit5:	T0CS Timer0时钟源选择 
	//		1-外部引脚电平变化T0CKI 0-内部时钟(FOSC/4)
	//Bit4:	T0SE T0CKI引脚触发方式 1-下降沿 0-上升沿
	//Bit3:	PSA 预分频器分配位 0-Timer0 1-WDT 
	//Bit[2:0]:PS 8位预分频比 111 - 1:256   000-1:2
	T0IF = 0;							//清空T0软件中断
}
/*-------------------------------------------------
 * 函数名: main 
 * 功能:  主函数
 * 输入:  无
 * 输出:  无
 --------------------------------------------------*/
void main()
{       
    DUTY=0; 
	POWER_INITIAL();	 //系统初始化	
    unint key_cnt;
	LED_DR=0;		  
	key_cnt=0;
    TIMER0_INITIAL();        //Timer0初始化
	GIE = 1; 		//开全局中断
	T0IE = 1;		//开Timer0中断
    led_cur_level=0;
	while(1)
	{
          if(!KEY1)
          {    		 		   
	        key_cnt++;		  
          }        			                
	     while((KEY1)&&(key_cnt>0))
	     {
	         if(key_cnt>=key_short)            		  	            	
              key_cnt=0;
              //led_cur_level=(led_cur_level+1)%5;
             led_cur_level++;
             if(led_cur_level>5) {led_cur_level=0;}		      			  
	     }
	  
	}
}
相关推荐
xuxie998 小时前
start9 霍尔双相编码器
单片机
兆龙电子单片机设计8 小时前
【STM32项目开源】STM32单片机语音分类垃圾桶-蓝牙APP
stm32·单片机·嵌入式硬件·物联网·开源·自动化·毕业设计
2601_954526759 小时前
【工业传感与算法实战】温漂补偿与零点抗漂破局:基于二阶多项式拟合的 C/C++ 边缘校准算法,深度拆解“压力变送器什么牌子好”的技术硬指标
c语言·c++·算法
qq_448011169 小时前
C语言中的变量和函数的定义与声明
android·c语言·开发语言
零涂毕业设计9 小时前
毕业设计模块开发-OLED显示屏(IIC协议0.96寸)STM32 ESP32 FPGA Linux驱动免费分享
linux·stm32·单片机·嵌入式·esp32·fpga·oled
阿龙的工作记录10 小时前
深入理解Linux设备驱动模型
linux·嵌入式硬件·工作记录
ye1501277745511 小时前
220V转5V1A隔离芯片WT5602
单片机·嵌入式硬件·其他·硬件工程
武汉万象奥科11 小时前
AGV导航控制器方案 | 基于HD-RK3576系列核心板的算控融合一体化平台
arm开发·嵌入式硬件·arm核心板·单板机
aaaameliaaa12 小时前
指针之总结
c语言·笔记·算法
ye1501277745512 小时前
DC24V-100V转3.3V500mA隔离芯片WT5602
单片机·嵌入式硬件·其他·硬件工程