原题题目:
12.设系统时钟频率为12MHz,利用定时器T0中断,实现从P2.1输出高电平宽度为10ms,低电平为20ms的矩形波。
解提思路:
1.系统时钟频率为12MHz,那么一个机器周期为1us,因而在计算TH0和TL0的初值的时候要定时多少微秒直接用定时器最大值减去多少微秒,再分别给TH0和TL0赋值
2.利用定时器T0中断,那么TMOD应赋值为0x01,并且选择TH0和TL0以及TR0还有中断号1
3.高电平宽度为10ms,低电平宽度为20ms的矩形波,一个矩形波周期为30ms,最小时间单位为10ms
于是有如下程序:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit XHz=P2^1;
uint counter=0;
void main()
{
TMOD=0x01;//定时器T0做16位计数器使用
TH0=(65536-10000)/256;//置初值 最小时间单位为10ms,即10000us
TL0=(65536-10000)%256;
EA=1;//开放中断
ET0=1;//允许T0中断
TR0=1;//启动T0,开始计数
XHz=1;//初始化为高电平,第一次中断发生时取反置低电平
while(1);//让程序暂停在这里等待中断程序运行
}
void T1_inter()interrupt 1
{
counter++;
if(counter==1)XHz=~XHz;//第一次中断发生,取反置低电平
if(counter==3)
{
XHz=~XHz;//第一个矩形波完成,取反置高电平
counter=0;//并重置计数为0
}
TH0=(65536-10000)/256;//重装初值
TL0=(65536-10000)%256;
}
以上是个人解题思路,且程序已在个人开发板上验证,如有建议或意见欢迎留言指出。