锦瑞单片机CA51F5呼吸灯程序

笔者认为呼吸灯实验最为关键点就是改变占空比,而所谓的占空比就是高电平持续的时间占整个周期的时间即占空比=Ton/Ton+Toff,锦瑞CA系列的单片机通过直接操作寄存器实现,与笔者之前所使用的STC51单片机有一定差异所以通过此代码笔记记录锦瑞单片机的操作过程:

//pwm.h

//PWMxCON
#define PWMIE(N) (N<<7) //N=0-1
#define PWMTOG(N) (N<<6) //N=0-1
#define PWMMOD(N) (N<<3) //N=0-7
#define PWMPOL(N) (N<<2) //N=0-1
#define PWMCKS_SYS 0
#define PWMCKS_IL 1
#define PWMCKS_IH 2


//PWMIF
#define PWM5IF (1<<5)
#define PWM4IF (1<<4)
#define PWM3IF (1<<3)
#define PWM2IF (1<<2)
#define PWM1IF (1<<1)
#define PWM0IF (1<<0)

//LEFLG
#define LEF1 (1<<7)
#define LEBSY1 (1<<6)
#define LEF0 (1<<3)
#define LEBSY0 (1<<2)

//main.c

#ifndef _MAIN_C_
#define _MAIN_C_
/*********************************************************************************************************************/
#include "include/ca51f5_config.h"
#include "include/ca51f5sfr.h"
#include "include/ca51f5xsfr.h"
#include "include/gpiodef_f5.h"
#include "include/system_clock.h"
#include "include/pwm.h"
#include "include/uart.h"
#include "include/delay.h"
#include <intrins.h>
/*********************************************************************************************************************

*********************************************************************************************************************/
#define PWMDIV_V (16000000/30000) //当PWM时钟为其他时钟频率时,需相应修改参数

/*******************************************************************************************************************/
#define PWM_CH0 0
#define PWM_CH1 1
#define PWM_CH2 2
#define PWM_CH3 3
#define PWM_CH4 4
#define PWM_CH5 5
/*********************************************************************************************************************/

void main(void)
{
int i=11,pmH[]={0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x02};
int Pml[]={0x00,0x35,0x6A,0x9F,0xd5,0x0A,0x3F,0x73,0xAA,0xDF,0x15};
EA = 1; //开全局中断

CKCON |= IHCKE; //打开IRCH时钟
P32F = P32_PWM0_SETTING; //设置P32为PWM引脚功能

PWM0CON = PWMIE(0) | PWMTOG(0) | PWMCKS_IH; //设置PWM时钟源为IRCH
PWM0CKD = 0;

//设置PWMDIV、PWMDUT
PWM0DIVH = 0x02;
PWM0DIVL = 0x15; // 16000000/30000=533=0x215
// PWM0DUTH = 0x01; //n/533=占空比,当n=53.3为10%,同理106,159,213,266,319,371,426,479
// PWM0DUTL = 0x0A; //对应16进制分别为0x35,0x6A,0x9F,0xd5,0x10A,0x13F,0x173,0x1AA,0x1DF,0x215

PWMEN = (1<<PWM_CH0); //PWM0使能
while(1)
{
if(i>0)
{ PWM0DUTH=pmH[i];
PWM0DUTL=Pml[i];
i--;
Delay_ms(1000);
if(i<=0)i=10;
}
}

}
#endif

posted @ 2022-11-02 10:12  鹿角上的晴天  阅读(337)  评论(0)    收藏  举报