51单片机(二十)—— 定时器产生方波信号
在本文中,我们用定时器0来产生方波信号,包含两个实验,实验1产生一个频率为10kHz的方波信号,实验2产生一个频率为100Hz的方波信号。实验1实验1 中定时器0的初始化代码如下所示。void init_T0(void){TMOD|= 0x02;//使用方式2,8位自动重装载定时器TH0=256-50;//...
在本文中,我们用定时器0来产生方波信号,包含两个实验,实验1产生一个频率为10kHz的方波信号,实验2产生一个频率为100Hz的方波信号。
实验1
实验1 中定时器0的初始化代码如下所示。
void init_T0(void)
{
TMOD|= 0x02; //使用方式2,8位自动重装载定时器
TH0=256-50; //给TH0和TL0赋初值,计数周期为50个机器周期
TL0=256-50; //采用12MHz的晶振,计时时长为50us
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
代码中将定时器0设置为方式2,8位自动重装载定时器,TL0用来计数,TL0的溢出,不仅置位TF0,而且将TH0的内容重新装入TL0,TH0内容由初始化时预置为256-50,即计数周期为50个机器周期,外部晶振为12MHz,机器周期为1us,则计数周期为50us,采用中断对定时器0的溢出事件进行处理,中断代码如下所示。
void T0_ISR(void) interrupt 1 using 1
{
PULSE=~PULSE; //输出的值取反
}
在中断函数中只改变了PULSE的状态,程序中PULSE是P10引脚的宏定义。
烧写之后可以看到实验现象,用示波器测量P10的输出信号,从示波器中可以看出P10输出周期为100us的方波,即频率为10KHz的方波。
实验2
实验2中定时器的初始化代码如下所示
void init_T0(void)
{
TMOD = 0x00; //使用方式0,13位定时器
TH0=(8192-5000)/32; //给TH0和TL0赋初值,计数器由3192开始计数,到8191溢出
TL0=(8192-5000)%32;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
在这个实验中,采用定时器0的方式0进行定时。方式0为13位计数器,由TL0的低5位和TH0的8位构成。TL0的低5位溢出时向TH0进位。TH0计数溢出置位TCON中的溢出标志位TF0。程序中由3192开始计数,计数到8191溢出。计数周期为5000个机器周期,即为5ms。因此产生脉冲的周期为10ms,脉冲频率为100Hz。溢出中断代码如下所示。
void T0_ISR(void) interrupt 1 using 1
{
TH0=(8192-5000)/32; //给TH0和TL0重新赋值
TL0=(8192-5000)%32;
PULSE=~PULSE; //PULSE的值取反
}
在中断中,重新赋值TH0和TL0,并改变PULSE的状态。
烧写之后可以看到实验现象,用示波器测量JP1上的P10的输出信号,从示波器中可以看出P10输出周期为10ms的方波,即频率为100Hz的方波。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)