您好,产生脉冲:
中断参数设定
T2定时器我还没用过,按常用的T0和T1说吧,只需要把定时器设个模式,我一般用方式1,开启总中断,起动中断2即可。
至于通过按键改变频率,这好办
设定R3 R4为专用寄存器,R3存TH2中值,R4存TL2中值,每次中断事,TH2及TL2的值均从R3和R4中取。如果想简单调,你可以通过给R4加/减R3带进位加/减0来实现频率的增高/降低,但这样出来的频率不一定是整数,但每调一次变化很小,属于微调。如想整调,比如想从1ms直接调成2ms,那就需要做个表,提前把每个频率的TH2及TL2的初值计算好,并用DB伪指令做成数据表,然后用MOVC A, @A+DPTR查表指令来给R2 R3输入准确频率的中断初值。
频率计算:
假设频率为X,晶振为A,产生的矩形脉冲占空比为50%
那么初值Y=65535-(((1/X)*1000000)/2)/(12/A)
解释:
1. 1/X为每个周期波形周期的时间,单位为S
,再*1000000就是每个周期的微秒时间,除以2即为半个周期的时间(因为每个周期有正负两个状态组成,且占空比为50%).
2. A为晶振,所以(12/A)即为每个机器周期的时间,也就是TH2里面每减1所需的时间,单位微秒。
3. 用上面所说的两数除以,即为每完成半个周期需要的机器周期,即中断需要自动加1的数量。
4. 用最大值减去3式中结果,即为定时器的初值。
是51单片机吗?
如果是51单片机,你可以使用tmod设置两个定时器,然后使用tr0、tr1分别启动两个定时器。pt0置为“1”,就可以中断定时器1的服务函数,相反,如果pt1置为“1”就可以中断定时器0的服务函数。
如果不设置pt的值,默认为“0”,这样的话,t0和t1谁也不能中断谁。
IP寄存器中应该有对应的位。或者写成PT2=1。注意头文件是reg52.h