//*********************************************************
/* 文件名: 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();
}
}
呼吸灯(MUC辉芒微P61f145)
最新推荐文章于 2024-01-18 14:09:07 发布