田径他爸来了头像
关注

单片机学习第36天(定时器,蜂鸣器)

定时器;

定时器的工作模式(由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

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--