在本文中,我们用定时器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的方波。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐