定时器;

定时器的工作模式(由TMOD的M1和M0决定)
模式0(00):16位的定时器/计数器模式
模式1(01):13位的定时器/计数器模式
模式2(10):8位可以重组的定时器/计数器模式(定时器1不能用)
模式3(11):两个8位的定时器/计数器
在图二中;当C/T=0时表示工作在定时器;当C/T=1时表示工作在计数器
如果为定时器:
定时器有两种计时模式:
12T模式;就是表示每遇到12个震荡周期加一次;
6T模式;就是表示每遇到6个震荡周期加一次;
振荡周期:就是晶振频率的倒数;
状态周期:两个振荡周期为一个状态周期;
机器周期:12个振荡周期为一个机器周期
指令周期:以机器周期为基本单位
定时器的启动:当GATE为0时;如果此时TR为1;则定时器会启动;
当GATE为1时;此时如果TR为1;还要看外部中断0(INT0)的值是否为1;为1则启动。
定时器启动后:
TL0和TH0是用来存贮定时器的初始值;定时器每次运行12个振荡周期增加1;当加到65536时;溢出标志位(TF0)就会被硬件自动置1;然后去运行定时器中断;这个时候这两个初值就会变为0;当定时器中断结束后;这个溢出标志位又会被硬件置0;
所以初始化一个定时器(以T0为例)就可以是
void init_timer0()
{
IE |= 1<<1;//定时器允许标志位
IE |= 1<<7;//总中断开关
TMOD |= 1<<1;//选择模式1(13位定时器;同时GATE置0;那么想要开启定时器只需要看TR0;)
TH0=0x00;
TL0=0x00;//定时器的初值
TCON |= 1<<4;//TR0置1;开启定时器
}
//后续溢出标志位变为1时自动跳转到下面的中断函数;
void time0_fun (void) interrupt 1
{
}
如何定时一秒钟
假设晶振的振荡频率为12Mhz;显然振荡周期为1/12us;而在定时器中运行一个机器周期加1;12个振荡周期为一个机器周期;所以一个机器周期为1us;如果要运行1秒则需要1000000次;但是定时器是16位;最大位65536;明显装不下1000000;所以换个思路。
运行1ms需要1000下;初值定为65535-1000=64535;那么只需要它在中断里循环运行1000下就是一秒钟;
蜂鸣器
占空比:一个周期中高电平所占的比例
蜂鸣器的引脚是由P2.5控制;
我所使用的蜂鸣器属于无源蜂鸣器;
无源:蜂鸣器内部没有震荡电路;需要给一定的脉冲才能使蜂鸣器响;
声调:由频率影响 ; 音量:由占空比影响;
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/2503_90965834/article/details/164375427



