找回密码
 立即注册
查看: 41|回复: 1

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

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:30
  • 最近打卡:2025-10-15 06:57:41
已绑定手机

4

主题

13

回帖

68

积分

注册会员

积分
68
发表于 2025-10-8 18:48:09 | 显示全部楼层 |阅读模式
今天学习了定时器,代码采用Ai-sip中的范例程序,复制到keil中稍作修改。
由于keil中缺少usb库文件,无法实现usb-print输出,因此去掉相关代码,只保留板载灯闪烁。

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



57975cc8-f39b-4618-9836-851b43a4cff6.mp4

10.14 MB, 下载次数: 0

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:30
  • 最近打卡:2025-10-15 06:57:41
已绑定手机

4

主题

13

回帖

68

积分

注册会员

积分
68
发表于 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中断
}

void  Timer1_Isr(void)  interrupt  TMR1_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中断
}

void  main(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)                                          //主循环中什么也不用做,定时器会自动运行
        {
        }
}


回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-16 05:36 , Processed in 0.110818 second(s), 51 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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