呼吸灯(MUC辉芒微P61f145)

//********************************************************* 
/* 文件名: TEST_61F14x_TIM2_INTERRUPT.c
* 功能:   FT61F14x-TIM2_INTERRUPT功能演示
* IC:      FT61F145 TSSOP-20
* 内部:   16M/2T                              
* 说明:   TIM2通过中断在RB3输出频率为16kHz的方波
*		   
*                FT61F145  TSSOP-20 
*              ---------------------
* NC----------|1(PA5)   	(PA4)20|-----------NC     
* NC----------|2(PA6)   	(PA3)19|-----------NC
* NC----------|3(PA7)   	(PA2)18|-----------NC
* NC----------|4(PC0)   	(PA1)17|-----------NC
* NC----------|5(PC1)		(PA0)16|-----------NC	
* NC----------|6(PB7)		(PB0)15|-----------NC
* GND---------|7(GND)		(PB1)14|-----------NC
* NC----------|8(PB6)	    (PB2)13|-----------NC
* VDD-------- |9(VDD)	    (PB3)12|--DemoPortOut
* NC----------|10(PB5)      (PB4)11|-----------NC
*			   ----------------------
*/
//*********************************************************
#include "SYSCFG.h"
//***********************宏定义****************************
#define  DemoPortOut	PB3   
#define  LED	             PB7  
#define  BreathLedRed	       PB7   
#define  BreathledBlue		   PC1

//====================呼吸灯定义========

 typedef unsigned char u8;			//别名
 u8 Tcount, dutyfactor, direct=0;		//一个PWM周期内的:周期计数,占空比,方向
 int breatheTime=0;

void breatheLED();					//呼吸灯主程序的函数声明

//====================呼吸灯定义========



/*-------------------------------------------------
* 函数名:interrupt ISR
* 功能:  定时器2的中断处理
* 输入:  无
* 输出:  无
 --------------------------------------------------*/



void interrupt ISR(void)            	
{ 
    
	if(T2UIE && T2UIF)                	
	{
       
  //============================定时器控制时 end ======================================
    breatheTime++; //T8S: 4S:亮变,4S暗变 4s/100次 = 40M一次(呼的小格格)40ms/200us=200次
    
    Tcount++;						//一个PWM周期内,计数
    T2UIF = 1;                    	//写1清零标志位  
	} 
    



}

void UART_INITIAL(void)
{
	PCKEN |=0B00100000;	//打开UART时钟
    
    URIER =0B00100001;  //使能发送接收完成中断
    URLCR =0B00000001;  //8位数据,停止位1,无奇偶校验
    URMCR =0B00011000;
    
    URDLL =104;         //9600波特率 = Fosc/16*[URDLH:URDLL]
    URDLH =0;
    TCF=1;
	INTCON=0B11000000;
    
    //TCF: 发送完成标志
    //TXEF:1发送寄存器为空
    //RXNEF:1接收寄存器非空
}
  
/*-------------------------------------------------
* 函数名:POWER_INITIAL
* 功能:  上电系统初始化
* 输入:  无
* 输出:  无
 --------------------------------------------------*/	
void POWER_INITIAL (void) 
{
	OSCCON = 0B01110001;	//16MHz 1:1
	INTCON = 0B01000000;  		
    
	PORTA = 0B00000000;		
	TRISA = 0B00000000;		//PA输入输出 0-输出 1-输入
	PORTB = 0B00000000;		
	TRISB = 0B00000000;		//PB输入输出 0-输出 1-输入	PB3输出						
	PORTC = 0B00000000; 	
	TRISC = 0B00000000;		//PC输入输出 0-输出 1-输入  	
	
	WPUA = 0B00000000;     	//PA端口上拉控制 1-开上拉 0-关上拉
	WPUB = 0B00000000;     	//PB端口上拉控制 1-开上拉 0-关上拉
	WPUC = 0B00001000;     	//PC端口上拉控制 1-开上拉 0-关上拉
    
    WPDA = 0B00000000;     	//PA端口下拉控制 1-开下拉 0-关下拉
	WPDB = 0B00000000;     	//PB端口下拉控制 1-开下拉 0-关下拉
	WPDC = 0B00000000;     	//PC端口下拉控制 1-开下拉 0-关下拉
    
    PSRC0 = 0B11111111;  	//PORTA,PORTB源电流设置最大
    PSRC1 = 0B11111111;     //PORTC,PORTD源电流设置最大    
    
    PSINK0 = 0B11111111;  	//PORTA灌电流设置最大 0:最小,1:最大
    PSINK1 = 0B11111111; 	//PORTB灌电流设置最大 0:最小,1:最大
    PSINK2 = 0B11111111;	//PORTC灌电流设置最大 0:最小,1:最大
	
    ANSELA = 0B00000000;    //全为数字管脚
}
/*-------------------------------------------------
* 函数名:TIMER2_INIT
* 功能:  TIME2初始化
* 输入:  无
* 输出:  无
 -------------------------------------------------*/
void Time2Initial(void)
{
	PCKEN |= 0B00000100;    //使能timer2时钟模块
    CKOCON = 0B00100000;
    TCKSRC = 0B00110000;    //TIM2时钟为HIRC的2倍频
	//Bit7:  低频内振模式: 1 = 256K 振荡频率模式,0 = 32K 振荡频率模式
	//Bit[6:4]:TIM2时钟源选择位
	//值	时钟源
	//0		系统时钟/主时钟
	//1		HIRC
	//2		XT时钟/外部时钟
	//3		HIRC的2倍频
	//4		XT时钟/外部时钟的2倍频
	//5		LIRC
	//6		LP时钟/外部时钟
	//7		LP时钟/外部时钟的2位频
	//Bit3:   保留位
	//Bit[2:1]:TIM1时钟源选择位
	//值	时钟源
	//0		系统时钟/主时钟
	//1		HIRC
	//2		XT时钟/外部时钟
	//3		HIRC的2倍频
	//4		XT时钟/外部时钟的2倍频
	//5		LIRC
	//6		LP时钟/外部时钟
	//7		LP时钟/外部时钟的2位频

    TIM2CR1 =0B10000101;  //预载允许,边沿对齐向上计数器,计数器使能
	//Bit7:自动预装载允许位
	//0: TIM2_ARR寄存器没有缓冲,它可以被直接写入;
	//1: TIM2_ARR寄存器由预装载缓冲器缓冲。

	//Bit[6:4]:保留位
	
	//Bit3:单脉冲模式
	//0: 在发生更新事件时,计数器不停止;
	//1: 在发生下一次更新事件(清除CEN位)时,计数器停止。
	
	//Bit2:更新请求源
	//0: 如果UDIS允许产生更新事件,则下述任一事件产生一个更新中断: 
	//寄存器被更新(计数器上溢/下溢)
	//1: 如果UDIS允许产生更新事件,则只有当下列事件发生时才产生更新中断,并UIF置1: 
	//寄存器被更新(计数器上溢/下溢)
	
	//Bit1:禁止更新
	//0: 一旦下列事件发生,产生更新(UEV)事件: 
	//计数器溢出/下溢
	//产生软件更新事件
	//1: 不产生更新事件,影子寄存器(ARR、PSC、CCRx)保持它们的值。
	
	//Bit0:允许计数器
	//0: 禁止计数器;
	//1: 使能计数器。
            
    TIM2IER =0B00000001;
	//Bit[7:4]: 保留位
	
	//Bit3: 允许捕获/比较3中断
	//0: 禁止捕获/比较3中断;
	//1: 允许捕获/比较3中断。

	//Bit2: 允许捕获/比较2中断
	//0: 禁止捕获/比较2中断;
	//1: 允许捕获/比较2中断。

	//Bit1: 允许捕获/比较1中断
	//0: 禁止捕获/比较1中断;
	//1: 允许捕获/比较1中断。

	//Bit0: 允许更新中断
	//0: 禁止更新中断;
	//1: 允许更新中断。
    
    TIM2ARRH =0x02;        //自动重载,周期
    TIM2ARRL =0x71;
      
    GIE =1;                //开总中断
}

/*-------------------------------------------------
* 函数名:UART_INTTIAL_INIT
* 功能:  TIME2初始化
* 输入:  无
* 输出:  无
 -------------------------------------------------*/




//呼吸灯主程序
void breatheLED() {
   // dutyfactor=100;
	if(Tcount >= 100) {				//一个PWM周期(100次*200us)
		Tcount = 0;					//下一个PWM周期内,重新计数
   
	//根据方向判断占空比增加或减少,用于控制时间
		if(direct == 0) {			//正方向,占空比增加
          //占空比变化一次时要延时后再进行下一次,
          //4s的呼吸时间 /100次为40MS变化一次,40MS\200us=200次。
           
        
           if(breatheTime>=1000){  //如果时间大于4ms下一个PWM周期,占空比增加1
            breatheTime=0;
			dutyfactor++;			
           }

		} else if(direct == 1) {	//负方向,占空比减少
           //占空比变化一次时要延时后再进行下一次。
           
              if(breatheTime>=1000){
            breatheTime=0;
			dutyfactor--;			//下一个PWM周期,占空比减少1
              }
           }
	 }
     

	//根据占空比值判断方向是否需要改变
	if(dutyfactor <= 0) {			//占空比减少到0
       
		direct = 0;					//正方向,占空比开始增加
        
        
	} else if(dutyfactor >= 100) {	//占空比增加到100
    
		direct = 1;					//负方向,占空比开始减少
        
	}
	

	//占空比:通电时间相对于总时间所占的比例(此程序中:低电平时间相对于PWM周期所占的比例) 
	//一个PWM周期计数100次,占空比相当于低电平的计数周期次数。即:0~占空比:低电平,灯亮;占空比~100:高电平,灯灭 
	//在一个PWM周期内,根据周期计数是否小于占空比,判断LED灯的亮灭
	if(Tcount < dutyfactor) {		//周期计数值<占空比
		//LED = 0;					//当前PWM周期的当前计数周期内灯亮
        BreathLedRed=1;
        BreathledBlue=1;

	} else {
          BreathLedRed=0;
         BreathledBlue=0;
		//LED = 1;					//当前PWM周期的当前计数周期内灯灭
	       }
}



/*-------------------------------------------------
* 函数名: main 
* 功能:  主函数
* 输入:  无
* 输出:  无
 --------------------------------------------------*/
void main()
{
	POWER_INITIAL();		//系统初始化
    Time2Initial();
    int i=0;;
	while(1)
	{
      
   breatheLED();
   
	}
    

}


你可能感兴趣的:(单片机,stm32,c语言)