建议配合本专栏的文章“单片机_第6章 单片机的定时/计数器”一起使用
目录
实例1 设单片机的fosc=12MHz,采用T1定时方式1在P2.0脚上输出周期为2ms的方波。
实例2 用单片机实现一个频率计功能,用于测量接在P3.4引脚的脉冲波频率(<10KHz),并将测量结果显示在数码管上。
实例3 采用T0定时方式2在P2.0口输出周期为0.5ms的方波(设fosc=12MHz)。
实例4 改进“计数显示器”采用的按键查询法,改为T0计数方式2 + 中断法,实现原有功能。
实例5(波形展宽) 由P3.4口输入一个低频窄脉冲信号。当该信号出现负跳变时,由P3.0口输出宽度为500μs的同步脉冲,如此往复。要求据此设计一个波形展宽程序(fosc= 6MHz)。
实例6(长延时、非对称) 采用10MHz晶振,在P2.0脚上输出周期为2.5s,高电平占空比为20%的脉冲信号。
实例1 设单片机的fosc=12MHz,采用T1定时方式1在P2.0脚上输出周期为2ms的方波。
实例1 设单片机的fosc=12MHz,采用T1定时方式1在P2.0脚上输出周期为2ms的方波。
分析:周期为2ms的方波由2个半周期为1ms的正负脉冲组成
方波输出原理:定时1ms后将端口输出电平取反。
1ms定时的计数初值应为:
a = 216 – t* fos / 12 = 216 – 1000* 12/ 12 = 64536 = 0xfc18
TH1 = 0xfc TL1 = 0x18
(另一种简单计算的方法:TH1=64536/256,TL1=64536%256)
注意:需要不断重装计数初值。
(1)查询方式
#include <reg51.h>
sbit P2_0 = P2^0;
main ()
{
TMOD = 0x10; //设置T1定时方式1(0001 0000B)
TR1=1; //启动T0
for(;;)
{
TH1 = 0xfc; //装载计数初值
TL1 = 0x18;
do{ } while(!TF1); //等待TF1溢出
P2_0 =!P2_0; //定时时间到P2.0反相
TF1 = 0; //TF1标志清0
}
}
(2)中断方式
中断源等情况
#include <reg51.h>
sbit P2_0=P2^0;
timer1 () interrupt 3 //T1中断函数
{
P2_0 = !P2_0; //P2.0取反
TH1 = 0xfc; //装载计数初值
TL1 = 0x18;
}
main ()
{
TMOD = 0x10; //T1定时方式1
TH1 = 0xfc; //装载计数初值
TL1 = 0x18;
EA=1; //开总中断
ET1=1; //开T1中断(总中断与部分中断的书写顺序无关紧要)
TR1=1; //启动T1,一定要最后书写,最后使用
while(1);
}
实例1仿真运行
仿真结果:生成了满足提示要求的波形
小结:方式1连续定时编程一般框架
思考(我这里只讲一点思路,大家可以自己动手实验):
1、怎样实现较长的定时?(增加一个值count来记录中断的次数,count达到一定值时让它产生反应)
2、怎样输出特定占空比的矩形波?(将高电平和低电平的时间单独表示)