单片机爱好者,来个大佬瞅瞅,手里也没有设备,不知道波形咋样,功能是通过串口发送阿拉伯数字,单片机解析去闪灯
#include <STC8H.H>
#include "stc32_stc8_usb.h"
#include "intrins.h"
#define Fosc 24000000UL
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void io_init()
{
P0M0 = 0x00; P0M1 = 0xff;
P1M0 = 0x00; P1M1 = 0xff;
P2M0 = 0x01; P2M1 = 0xfe;
P3M0 = 0x00; P3M1 = 0xfc;
P4M0 = 0x00; P4M1 = 0xff;
P5M0 = 0x00; P5M1 = 0xff;
}
void pwm_init()
{
PWMA_CCER1 = 0x00; //写CCMRx前必须先清零CCERx关闭通道
PWMA_PS &= 0xfc; PWMA_PS |= 0x01; //通道1输出脚选择P2.0 P2.1
PWMA_CCMR1 = 0x60; //设置CC1为PWMA输出模式
PWMA_CCER1 = 0x01; //使能CC1通道
PWMA_PSCRH = 0x01; PWMA_PSCRL = 0x90; //设置预分频器
PWMA_CCR1H = 0x75; PWMA_CCR1L = 0x30; //设置占空比时间
PWMA_ARRH = 0xea; PWMA_ARRL = 0x60; //设置周期时间
PWMA_ENO = 0x01; //使能PWM1P端口输出
PWMA_BKR = 0x80; //使能主输出
PWMA_IER = 0x01; //使能中断
PWMA_EGR = 0x01; //主动跟新事件
PWMA_CR1 = 0x05; //开始计数
}
int str_to_num(char buffer[], char size)
{
char i = 0;
char j = 0;
int num = 0;
int tmp = 0;
for(i=0;i<size;i++)
{
if(i>0)
{
num = 1;
for(j=0;j<i;j++)
{
num = num * 10;
}
tmp = tmp + (buffer[size-i-1]-0x30) * num;
}
else
{
tmp = tmp + (buffer[size-i-1]-0x30);
}
}
return tmp;
}
void main()
{
P_SW2 |= 0x80; //允许访问特殊功能寄存器
usb_init(); //USB CDC 接口配置
io_init(); //io口初始化
pwm_init(); //pwma通道1初始化
EA = 1;
while(1);
}
/************************************************
函数功能:USB-CDC串口接收数据的回调函数
函数描述:回调函数由USB中断在接收到串口数据时自动调用
回调函数处理完成串口数据后需要返回1
函数返回:返回1:USB中断服务程序自动完成后续的收尾工作
返回0:USB会暂停接收串口数据,直到用户自行调用
usb_OUT_done()函数后USB才会重新恢复接收数据
注意事项:当函数返回1时用户无需调用usb_OUT_done()
只有返回0时才需要调用usb_OUT_done()进行手动收尾
强烈建议usb_OUT_callback返回1
************************************************/
BOOL usb_OUT_callback()
{
int num;
// USB_SendData(UsbOutBuffer, OutNumber); //串口发送函数,UsbOutBuffer是接收数据的数组,OutNumber是数组的大小
num = str_to_num(UsbOutBuffer, OutNumber); //阿拉伯数字的字符串转整数
PWMA_RCR = (char)num - 2;
PWMA_EGR = 0x01;
PWMA_CR1 |= 0x01;
return 1;
}
void PWM_UIFA() interrupt 26
{
static char flag_pwm = 0;
static char flag_ua = 0;
if(PWMA_SR1 & 0x01)
{
flag_pwm++;
PWMA_SR1 &= 0xfe;
PWMA_CR1 &= 0xfe;
if(flag_ua > 1)
{
USB_SendData("OK\r\n", 4);
flag_ua = 0;
}
if(flag_pwm > 1)
{
PWMA_CR1 |= 0x01;
flag_pwm = 0;
}
flag_ua++;
}
}