找回密码
 立即注册
查看: 215|回复: 0

8H8K64U实现用重复计数器指定次数闪灯(中断方式)

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:454
  • 最近打卡:2025-05-01 07:53:22

28

主题

162

回帖

1879

积分

金牌会员

积分
1879
发表于 2024-12-19 09:13:40 | 显示全部楼层 |阅读模式

单片机爱好者,来个大佬瞅瞅,手里也没有设备,不知道波形咋样,功能是通过串口发送阿拉伯数字,单片机解析去闪灯

#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++;
	}
}
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:50 , Processed in 0.254886 second(s), 53 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表