18344371880 发表于 2024-12-19 09:13:40

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

<p>单片机爱好者,来个大佬瞅瞅,手里也没有设备,不知道波形咋样,功能是通过串口发送阿拉伯数字,单片机解析去闪灯</p>
<pre><code>#include &lt;STC8H.H&gt;
#include &quot;stc32_stc8_usb.h&quot;
#include &quot;intrins.h&quot;

#define Fosc 24000000UL

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = &quot;@STCISP#&quot;;

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 &amp;= 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&lt;size;i++)
        {
                if(i&gt;0)
                {
                        num = 1;
                        for(j=0;j&lt;i;j++)
                        {
                                num = num * 10;
               
                        }
                        tmp = tmp + (buffer-0x30) * num;
                }
                else
                {
                        tmp = tmp + (buffer-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 &amp; 0x01)
        {
                flag_pwm++;
                PWMA_SR1 &amp;= 0xfe;
                PWMA_CR1 &amp;= 0xfe;

                if(flag_ua &gt; 1)
                {
                        USB_SendData(&quot;OK\r\n&quot;, 4);
                        flag_ua = 0;
                }
                if(flag_pwm &gt; 1)
                {
                        PWMA_CR1 |= 0x01;
                        flag_pwm = 0;
                }
                flag_ua++;
        }
}
</code></pre>
页: [1]
查看完整版本: 8H8K64U实现用重复计数器指定次数闪灯(中断方式)