已知某单片机系统是晶振频率为12MHz,请编写汇编程序,使用定时器T0,采用中断的方式实现100毫秒定时。
想问下这个问题是不是错误的,无法实现100毫秒定时,因为初值计算出来是负数,还是说有其他方法实现?
对于51单片机,其定时器T0是一个8位定时器,可以通过配置寄存器来设置其工作方式和初值。基于给定的晶振频率为12MHz和要实现的100毫秒定时,我们可以通过以下步骤计算初值:
由于定时器T0是一个8位定时器,它的初值范围为0-255(256个可能值)。如果计算得到的溢出次数超过了256次,则无法直接设置定时器初值来实现精确的100毫秒定时。
然而,还有一种方法可以实现接近100毫秒的定时。你可以设置一个较小的初值,然后在定时器中断服务程序中累加溢出次数,当累加值达到一定阈值时(接近100毫秒),触发所需的操作。这样,虽然每次的定时并不完全准确,但累积多个定时周期后,可以实现接近100毫秒的定时效果。
下面是一个示例汇编程序,使用定时器T0中断的方式实现接近100毫秒的定时:
ORG 0H
MOV TMOD, #1H ; 设置T0为工作方式1(16位定时器)
MOV TH0, #0FFH ; 设置T0初值为255
MOV TL0, #0FFH ; 设置T0初值为255
SETB ET0 ; 允许T0中断
SETB TR0 ; 启动T0定时器
MAIN:
SJMP MAIN ; 主循环
ORG 0BH ; 定时器T0中断向量
CPL P1.0 ; 切换P1.0引脚状态
MOV TH0, #0FFH ; 重新加载T0初值为255
MOV TL0, #0FFH ; 重新加载T0初值为255
CLR TF0 ; 清除T0中断标志位
RET ; 中断返回
END
这段汇编程序将定时器T0配置为16位定时器模式,并将其初值设置为255。每当定时器T0溢出时,将触发T0中断服务程序,在中断服务程序中切换P1.0引脚的状态。然后重新加载T0的初值为255,以实现连续的定时效果。
解:由已知得,晶振频率为12MHZ,周期为频率的倒数
故,1/T=12MHz => T=1/12M (s)
机器周期=12x1/12M=1/1M(s)=1us
同理晶振频率为24MHz,机器周期为0.5us