2401_83591674 2024-09-27 18:52 采纳率: 15.7%
浏览 3

应广工程烧录器做流水灯

代码部分:

#include    "extern.h"

bit        LED1        :    PA.5        //定义LED灯的引脚
bit        LED2        :    PA.3        //定义LED灯的引脚
bit        LED3        :    PA.4        //定义LED灯的引脚
bit        LED4        :    PA.0        //定义LED灯的引脚

byte    time_10ms;
word    reload_T16;

byte    time_01ms;
byte    PWM=5;

void    FPPA0 (void)
{
    .ADJUST_IC    SYSCLK=IHRC/4, IHRC=16MHz, VDD=5V;

    $ LED1 out,high;                //初始把灯点亮(高电平点灯)
    $ LED2 out,high;
    $ LED3 out,high;
    $ LED4 out,high;

    $ T16M SYSCLK,/1,bit10;    //T16的时钟源选择,内部的时钟分频器,中断源选择(当选择位由低到高或者由高到低时,发生中断事件);
                                //时钟源选择可以选择STOP, SYSCLK, PA4_F, IHRC, EOSC, ILRC, PA0_F;分频器可选择/1, /4, /16, /64
                                //中断源可选择BIT8, BIT9, BIT10, BIT11, BIT12, BIT13, BIT14, BIT15
//    reload_T16 = 1024 - 625;    //每次进中断为10ms;0.625ms
//                //计算公式为    [1/(时钟源/分频器)]*(中断源-reload_T16)=[1/(1M/16)]*(2^10-(1024-625))=0.01s
    reload_T16 = 1024 - (400-1);    //每次进中断为10ms;1ms
                //计算公式为    [1/(时钟源/分频器)]*(中断源-reload_T16)=[1/(1M/16)]*(2^10-(1024-625))=0.01s

    stt16 reload_T16;            //设定计数器初始值reload_T16,当计数器累加超过设定中断源时产生中断;
    $ INTEGS BIT_R;                //T16中断边缘选择,上升缘请求中断为BIT_R,下降缘请求中断为BIT_F;默认为上升缘请求。
    //使用下面两句时,会关闭其他中断的设置,一般推荐使用对位操作的方法来驱动
//    $ INTEN T16;                //中断允许寄存器,启用从T16的溢出中断;1:启用,0:停用。
//    $ INTRQ T16;                //中断请求寄存器,此位是由硬件置位并由软件清零;1:请求,0:不请求。

    INTEN.T16 = 1;                //中断允许寄存器,开T16中断
//    INTEN.T16 = 0;                //中断允许寄存器,关T16中断
    INTRQ.T16 = 0;                //中断请求寄存器,清零INTRQ寄存器。
    ENGINT;                        //打开全局中断

    time_10ms = 0;

    while (1)
    {
        
    }
}


void    Interrupt (void)
{
    pushaf;

    if (Intrq.T16)
    {    //    T16 Trig
        //    User can add code
        stt16 reload_T16;        //设定计数器初始值reload_T16
        time_10ms++;
        if(time_10ms < PWM)        //定时两秒
        {
            //time_10ms = 0;
            $ LED1 out,low;        //关灯
        }
        if(time_10ms > PWM)        //定时两秒
        {
            if(time_10ms>=19)
                time_10ms = 0;

            $ LED1 out,high;        //关灯
        }


        Intrq.T16    =    0;
    }

    popaf;
}


  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-09-27 18:53
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    这个代码段主要用于制作一个基于应广工程烧录器的流水灯项目。以下是对代码的主要解释:

    首先,定义了四个LED灯的引脚(LED1至LED4)。然后定义了一些变量,如时间变量(time_10ms和time_01ms)和PWM值。其中PWM值用于控制LED灯的闪烁频率。接下来是主函数FPPA0的详细解释:

    1. 设置系统时钟源和系统时钟分频器。这里的系统时钟是IHRC,频率是16MHz,VDD是5V。这些都是根据具体的硬件来设定的。
    2. 设置四个LED灯为输出模式并将它们初始化为高电平,也就是点亮这四个灯。
    3. 配置定时器T16的相关参数。首先设置中断源和时钟源等参数,然后设置计数器的初始值reload_T16。这里的中断源和时钟源的选择是根据具体的硬件和需求来设定的。然后开启全局中断。
    4. 在主循环中,初始化了time_10ms变量为0,然后进入一个无限循环等待中断的发生。当有中断发生时,进入中断处理函数Interrupt。

    在中断处理函数Interrupt中:

    • 首先保存了当前的寄存器状态。
    • 判断是否是T16触发中断,如果是的话执行相关操作。主要是根据time_10ms的值来控制LED灯的亮灭。如果time_10ms的值小于PWM,则熄灭LED灯;如果大于PWM且大于等于某些值(这里是防止连续点亮两次),则点亮LED灯。每次中断后都会更新time_10ms的值。最后清除中断请求标志位并恢复寄存器状态。

    注意:这段代码主要是一个框架,需要根据具体的硬件和需求进行进一步的修改和优化。例如,LED灯的引脚定义、PWM的值、定时器的配置等都需要根据实际情况进行调整。此外,还需要确保硬件可以正确驱动LED灯,并根据实际的硬件配置进行适当的调整和优化。

    评论

报告相同问题?

问题事件

  • 创建了问题 9月27日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?