继续学习擎天柱开发板编程技巧,今天学习定时器
今天学习了定时器,代码采用Ai-sip中的范例程序,复制到keil中稍作修改。由于keil中缺少usb库文件,无法实现usb-print输出,因此去掉相关代码,只保留板载灯闪烁。
可以看到P20灯两秒闪一次,P21灯一秒闪两次
下面是代码和详细解释,请大家学习
#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]