这个是官方提供的,使用库函数做的PWM呼吸灯程序,使用很方便,不需要了解太多繁琐的底层寄存器
单片机源程序如下:
- #include "config.h"
- #include "STC8A_GPIO.h"
- #include "STC8A_Delay.h"
- #include "STC8A_PWM15bit.h"
- /************* 功能说明 ***************
- 输出4路PWM信号:
- PWM0 输出"呼吸灯"效果PWM.
- PWM1 循环输出1秒钟PWM,1秒钟高电平,1秒钟低电平.
- PWM2,PWM3 固定PWM.
- 下载时, 选择时钟 24MHz (用户可在"config.h"修改频率).
- ******************************************/
- /************* 本地常量声明 **************/
- /************* 本地变量声明 **************/
- u16 pwm0,pwm1;
- bit B_PWM0_Dir; //方向, 0为+, 1为-.
- /************* 本地函数声明 **************/
- /************* 外部函数和变量声明 *****************/
- /******************** IO口配置 ********************/
- void GPIO_config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure; //结构定义
- GPIO_InitStructure.Pin = GPIO_Pin_All; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
- GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
- GPIO_Inilize(GPIO_P2,&GPIO_InitStructure); //初始化
- }
- /******************** PWM15配置 ********************/
- void PWM15_config(void)
- {
- PWM15_InitTypeDef PWM15_InitStructure;
- PWM15_InitStructure.PWM_Enable = ENABLE; //PWM使能, ENABLE, DISABLE
- PWM15_InitStructure.PWM_Period = 0x1000; //PWM周期, 0~0x7fff
- PWM15_InitStructure.PWM_Clock_Sel = PWM_CLK_SYS; //时钟源选择, PWM_CLK_SYS, PWM_CLK_TM2
- PWM15_InitStructure.PWM_Clock_PS = 0; //系统时钟分频参数(PS+1分频), 0~15
- PWM15_InitStructure.PWM_CInt = DISABLE; //计数器归零中断使能, ENABLE, DISABLE
- PWM15_InitStructure.PWM_Counter = ENABLE; //计数器使能, ENABLE, DISABLE
- PWM15_Init(&PWM15_InitStructure);
-
- PWM15Duty(PWM15_0,0x000,0x200); //PWM_ID, 输出低电平位置, 输出高电平位置
- PWM15Duty(PWM15_1,0x200,0xc00); //PWM_ID, 输出低电平位置, 输出高电平位置
- PWM15Duty(PWM15_2,0x400,0x800); //PWM_ID, 输出低电平位置, 输出高电平位置
- PWM15Duty(PWM15_3,0x800,0xe00); //PWM_ID, 输出低电平位置, 输出高电平位置
- PWMChannelCtrl(PWM15_0,ENABLE,0,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
- PWMChannelCtrl(PWM15_1,ENABLE,0,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
- PWMChannelCtrl(PWM15_2,ENABLE,0,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
- PWMChannelCtrl(PWM15_3,ENABLE,0,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
- }
- /******************** task A **************************/
- void main(void)
- {
- GPIO_config();
- PWM15_config();
- pwm0 = 0;
- pwm1 = 0;
- B_PWM0_Dir = 0;
- // EA = 1;
-
- while (1)
- {
- delay_ms(1);
- if(B_PWM0_Dir)
- {
- if(--pwm0 <= 0x100) B_PWM0_Dir = 0; //PWM0
- }
- else if(++pwm0 >= 0xf00) B_PWM0_Dir = 1; //PWM0
- PWM15Duty(PWM15_0,0,pwm0);
- if(pwm1 >= 3000)
- {
- pwm1 = 0;
- }
- else if(pwm1 >= 2000)
- {
- PWMLevelSet(PWM15_1,ENABLE,DISABLE); //PWM_ID, 强制输出低电平, 强制输出高电平
- }
- else if(pwm1 >= 1000)
- {
- PWMLevelSet(PWM15_1,DISABLE,ENABLE); //PWM_ID, 强制输出低电平, 强制输出高电平
- }
- else
- {
- PWMLevelSet(PWM15_1,DISABLE,DISABLE); //PWM_ID, 强制输出低电平, 强制输出高电平
- }
- pwm1++;
- }
- }
复制代码
Keil代码下载:
20-15位增强型PWM模式呼吸灯程序.rar
(297.69 KB, 下载次数: 63)
|