1、将中断向量表(IVT)中定时器0的中断地址指向对应的中断服务程序。
2、设置相应的中断控制寄存器,使能定时器0和外部中断0两个中断。
3、设置定时器0的定时时间。
4、启动定时器0。
代码如下:
//实现led灯一秒亮灭闪烁
void main()
{
TMOD=0x01//设置定时器0为工作方式1(M1 M0为01)
TH0=(65536-45872)/256//装初值11.0582晶振定时50ms数为45872
TL0=(65536-45872)%256
EA=1//开总中断
ET0=1//开定时器0中断
TR0=1//启动定时器0
while(1)//程序停止在这里等待中断发生
}
void T0_time() interrupt 1
{
TMOD=0x01//重装初值
TH0=(65536-45872)/256
num++;//num每加一次判断一次是否到20次
if(num==20)//如果到了20次,说明1秒时间到
{
num=0//num清0重新计数
led=~led1;
}
}
扩展资料
定时器有两种工作模式,分别为计数模式和定时模式。对Px,y的输入脉冲进行计数为计数模式。定时模式,则是对MCU的主时钟经过12分频后计数。因为主时钟是相对稳定的,所以可以通过计数值推算出计数所经过的时间。
51单片机计数器的脉冲输入脚。主要的脉冲输入脚有Px,y, 也指对应T0的P3.4和对应T1的P3.5,主要用来检测片外来的脉冲。而引脚18和19则对应着晶振的输入脉冲,脉冲的频率和周期为
F = f/12 = 11.0592M/12 = 0.9216MHZ T = 1/F = 1.085us
51计数器的计数值存放于特殊功能寄存器中。T0(TL0-0x8A, TH0-0x8C), T1(TL1-0x8B, TH1-0x8D)
定时器常用作定时时钟,以实现定时检测,定时响应、定时控制,并且可以产生ms宽的脉冲信号,驱动步进电机。定时和计数的最终功能都是通过计数实现,若计数的事件源是周期固定的脉冲则可实现定时功能,否则只能实现计数功能。因此可以将定时和计数功能全由一个部件实现。
定时器1 50ms中断一次,每次中断FLAG加140次即为2秒,所以在定时器0中断时,要判断是0-40,40-80等时间段
定时器0中断时,要再次装入定时时间常数,但在0-40,40-80等时间段内装入的时间常数是不同的,因此beep取反的频率就不同
但由于定时器0中断10次BEEP才取反一次,所以当fre=5000050*10= 500ms才取反一次
这么低的频率对无源蜂鸣器是没有响应的
当fre=50000 0.156*10= 1.56ms取反一次,周期3.12ms 频率300多HZ,对于有源蜂鸣器响应是很困难的
所以用有源蜂鸣器演奏例程中的音乐只能呕呀嘈杂难为听了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)