wg191680 发表于 2025-10-8 18:48:09

继续学习擎天柱开发板编程技巧,今天学习定时器

今天学习了定时器,代码采用Ai-sip中的范例程序,复制到keil中稍作修改。
由于keil中缺少usb库文件,无法实现usb-print输出,因此去掉相关代码,只保留板载灯闪烁。

可以看到P20灯两秒闪一次,P21灯一秒闪两次



wg191680 发表于 2025-10-8 18:50:37



下面是代码和详细解释,请大家学习




#include <AI8051U.H>       

void Timer0_Isr(void) interrupt TMR0_VECTOR                //定时器0中断服务程序
{
        P20 = ~P20;        //P20灯2秒闪一次,中断程序中少执行长的任务,防止堵塞其他中断
}
//定时器0中断服务程序,TMR0_VECTOR在AI8051U.H头文件中已宏定义为1

void Timer0_Init(void)                //定时器0初始化,2秒@40.000MHz
{
        TM0PS = 0x65;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0xB1;                                //设置定时初始值
        TH0 = 0x00;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}

voidTimer1_Isr(void)interruptTMR1_VECTOR
{
        P21 = ~P21;        //P21灯1秒闪两次,中断程序少执行长任务,防止堵塞其他中断
}
//定时器1中断服务程序,TMR1_VECTOR在AI8051U.H头文件中已宏定义为3

void Timer1_Init(void)                //定时器1初始化,500毫秒@40.000MHz
{
        TM1PS = 0x19;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
        AUXR &= 0xBF;                        //定时器时钟12T模式
        TMOD &= 0x0F;                        //设置定时器模式
        TL1 = 0x99;                                //设置定时初始值
        TH1 = 0x05;                                //设置定时初始值
        TF1 = 0;                                //清除TF1标志
        TR1 = 1;                                //定时器1开始计时
        ET1 = 1;                                //使能定时器1中断
}

voidmain(void)
{
        EAXFR = 1;                                        //允许访问扩展的特殊寄存器,XFR
        WTST = 0;                                        //设置取程序代码等待时间,赋值为 0 表示不等待,程序以最快速度运行
        CKCON = 0;                                        //设置访问片内的 xdata 速度,赋值为 0 表示用最快速度访问,不增加额外的等待时间

        P2M0 = 0x00; P2M1 = 0x00;         //设置 P2 口为准双向口模式

        EA = 1;                                                //使能中断

        Timer0_Init();                                //调用定时器0初始化函数
        Timer1_Init();                                //调用定时器1初始化函数

        while(1)                                      //主循环中什么也不用做,定时器会自动运行
        {
        }
}


页: [1]
查看完整版本: 继续学习擎天柱开发板编程技巧,今天学习定时器