假设单片机的晶体振荡器的频率是12MHz,利用定时器1采用方式1定时20ms,写出初值的计算过程和整个定时器初始化程序,同时写出在P1.7脚上输出0.2秒的方波的完整程序... 假设单片机的晶体振荡器的频率是12MHz,利用定时器1采用方式1定时20ms,写出初值的计算过程和整个定时器初始化程序,同时写出在P1.7脚上输出0.2秒的方波的完整程序
12MHz晶振,单片机机械周期 T=12/Fosc=12/12MHz=1us;
T1定时器工作模式1 为 16位定时器,定时计算公式为:t=
(2^16-)×机械周期 T,
将T=1us,t=20ms 代入公式得:
(65536-)×1us=20ms,得:
TH1:TL1=65536-20ms×1000us/ms÷1us=45536=0xB1E0,得:
TH1=0xB1,TL0=0xE0;
定时器初始化函数:
void TimerInit()
{
TMOD &=0x0F;
TMOD |=0x10;
TH1=0xB1;
TL1=0xE0;//建议将 0xB1、0xE0宏定义为th1、tl1;
EA=1;
ET1=1;
TR1=1;
}
0.2秒方波,未说明是脉宽还是周期,只能认为是周期。则脉宽为0.2s÷2=100ms;
#define T100msAt20msCount 5
sbit WaveOut=P1^7;
void Timer1()interrupt 3
{
static unsigned char t20ms=0;
TL1=tl1;//
TH1=th1;//按前面说的宏定义
if(++t20ms>=T100msAt20msCount)
{
t20ms-=T100msAt20msCount;
WaveOut=~WaveOut;
}
}
void main()
{
TimerInit();
while(1);
}