3
25
1333
金牌会员
#include "../comm/AI8051U.h" //包含此头文件后,不需要再包含"reg51.h"头文件 #include "usb.h" //USB调试及复位所需头文件 #include "T_SineTable.h" #include "stdio.h" #define MAIN_Fosc 35000000L //定义主时钟 char *USER_DEVICEDESC = NULL; char *USER_PRODUCTDESC = NULL; char *USER_STCISPCMD = "@STCISP#"; //设置自动复位到ISP区的用户接口命令 //P3.2口按键复位所需变量 bit Key_Flag; u16 Key_cnt; u16 PWMB_Duty; u8 PWMB_Index=0; //SPWM查表索引 u16 PWMA_Duty; u8 PWMA_Index=0; //SPWM查表索引 void sys_init(); void delay_ms(u8 ms); void KeyResetScan(void); //输出正弦波频率 = 35000000 / 175 / 200 = 1000 HZ. // 0xAF // //pwm void pwmA_Init() { PWMA_Duty = 1220; PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道 PWMA_CCER2 = 0x00; PWMA_CCMR1 = 0x68; //通道模式配置 PWMA_CCER1 = 0x01; //配置通道输出使能和极性 //PWMA_ARRH = 0x09; //设置周期时间 //PWMA_ARRL = 0x60; PWMA_ARRH = 0x00; //设置周期时间1k PWMA_ARRL = 0xAE; PWMA_CCR1H = (u8)(PWMA_Duty >> 8); //设置占空比时间 PWMA_CCR1L = (u8)(PWMA_Duty); //PWMA_DTR = 0x0C; //设置死区时间 PWMA_ENO = 0x00; PWMA_ENO |= 1; //使能输出 //PWMA_ENO |= 2; //使能输出 //高级PWM输出脚会自动设置为推挽输出模式 PWMA_PS = 0x00; //高级 PWM 通道输出脚选择位 PWMA_PS |= 0; //选择 PWM1_1 通道 PWMA_BKR = 0x80; //使能主输出 PWMA_IER = 0x01; //使能中断 PWMA_CR1 |= 0x81; //使能ARR预装载,开始计时 } void PWMA_ISR() interrupt PWMA_VECTOR { if(PWMA_SR1 & 0X01) { PWMA_SR1 &=~0X01; PWMA_Duty = T_SinTable[PWMA_Index]; if(++PWMA_Index >= 200) PWMA_Index = 0; PWMA_CCR1H = (u8)(PWMA_Duty >> 8); //设置占空比时间 PWMA_CCR1L = (u8)(PWMA_Duty); } PWMA_SR1 = 0; } //输出正弦波频率 = 35000000 / 175 / 200 = 1000 HZ. // 0xAF // //pwm void pwmB_Init() { PWMB_Duty = T_SinTable[0]; PWMB_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道 PWMB_CCER2 = 0x00; PWMB_CCMR1 = 0x68; //通道模式配置 PWMB_CCER1 = 0x01; //配置通道输出使能和极性 PWMB_ARRH = 0x00; //设置周期时间1k PWMB_ARRL = 0xAE; PWMB_CCR5H = (u8)(PWMB_Duty >> 8); //设置占空比时间 PWMB_CCR5L = (u8)(PWMB_Duty); PWMB_ENO = 0x00; PWMB_ENO |= 1; //使能输出 //PWMA_ENO |= 2; //使能输出 //高级PWM输出脚会自动设置为推挽输出模式 PWMB_PS = 0x03; //高级 PWM 通道输出脚选择位 P5.0 PWMB_BKR = 0x80; //使能主输出 PWMB_IER = 0x43; //使能中断 PWMB_CR1 |= 0x81; //使能ARR预装载,开始计时 } void PWMB_ISR() interrupt PWMB_VECTOR { if(PWMB_SR1 & 0x01) { PWMB_SR1 &=~0X01; PWMB_Duty = T_SinTable[PWMB_Index]; if(++PWMB_Index >= 200) PWMB_Index = 0; PWMB_CCR5H = (u8)(PWMB_Duty >> 8); //设置占空比时间 PWMB_CCR5L = (u8)(PWMB_Duty); } PWMB_SR1 = 0; } void main() { sys_init(); IRC48MCR = 0x80; while (!(IRC48MCR & 0x01)); USBCLK = 0x00; USBCON = 0x90; usb_init(); //USB CDC 接口配置 EUSB=1; //使能USB中断 EA = 1; while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置 pwmB_Init(); pwmA_Init(); while (1) { delay_ms(1); KeyResetScan(); //长按P3.2口按键触发软件复位,进入USB下载模式,不需要此功能可删除本行代码 if (bUsbOutReady) { USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度 usb_OUT_done(); } } } void sys_init() { WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快 EAXFR = 1; //扩展寄存器(XFR)访问使能 CKCON = 0; //提高访问XRAM速度 P0M1 = 0x00; P0M0 = 0x00; //设置为准双向口 P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口 P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口 P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口 P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口 P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口 P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口 P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口 P3M0 &= ~0x03; P3M1 |= 0x03; }复制代码
使用道具 举报 送花
77
4850
8388
超级版主
DebugLab
给力啊!
Debu*** 发表于 2024-9-26 16:17 PWMB_IER不要使能触发中断,不要允许捕获/比较5中断,仅允许更新中断
本版积分规则 发表回复 回帖后跳转到最后一页
|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )
GMT+8, 2025-5-3 00:45 , Processed in 0.124175 second(s), 61 queries .
Powered by Discuz! X3.5
© 2001-2025 Discuz! Team.