学习汇编语言,可由STC32G12K128 单片机利用 P1.1 端口输出 200 Hz 的方波开始。
方波基本知识
频率 (Frequency),周期 (Period) , 波形 (Waveform),占空比率 (Duty Cycle)是使用示波器需要知道的名词。
· 频率:表示每秒钟内完整方波的数量,单位是赫兹(Hz)。
· 周期:是一个完整方波出现所需的时间,单位是秒(s)。
· 占空比:是高电平在整个方波周期内所占的比例,通常以百分比表示。
现在编写一个汇编程序,利用 Timer1 控制 P1.1 端口输出 200 Hz 的方波。
公式:
Time1 定时器初始值
其中:
FOSC = 单片机系统时钟频率 = 11.0592 MHz
f = 方波频率 (有效值由 8 Hz 至 460.8 kHz)
公式说明:
本例子 f=200, 即是 200 Hz
方波周期为 T s (秒) = 1/f,T = 1/200 , 即是 5 ms
1 机器周期 = 12 系统时钟周期
1 机器周期需时 12*(1/11059200) = 1.08507 µs
半周期需要的机器周期 = Y = (T/2) / 1.08507 µs = 2304
Time1 定时器初始值 = 65536 – Y = 65536 – 2304 = 63232
为什么要 65536 – 2304 呢?因为Timer1 定时器每一个机器周期加1计数,经过 2304 个机器周期 (需时2.5 ms) 便产生一个溢出中断讯号,TF1 置”1”,当软件检测到TF1 溢出中断标志,立刻把 P1.1 端口的输出电平反转,然后把TF1置”0”,Timer1 自动重载初始值,重新计数,等待下一个溢出中断讯号。
掌握定时器1寄存器
T1_GATE:控制定时器1,置0时用作定时器。
T1_C/T: 控制定时器1,置0时用作定时器 (对内部系统时钟进行计数)。
T1_M1 | T1_M0 | 定时器1工作模式 |
0 | 0 | 16位自动重载模式。当[TH1,TL1]中的16位计数值溢出时,系统会自动将内部16位重载寄存器中的重载值装入[TH1,TL1]中。 |
0 | 1 | 16位不自动重载模式。当[TH1,TL1]中的16位计数值溢出时,定时器1将从0开始计数。 |
1 | 0 | 8位自动重载模式。当TL1中的8位计数值溢出时,系统会自动将TH1中的重载值装入TL1中。 |
1 | 1 | Timer1 停止工作。 |
TF1: Timer1 溢出中断标志。Timer1 被允许计数以后,从初值开始加1计数。当产生溢出时由硬
件将TF1位置”1”,并向CPU请求中断,一直保持到CPU响应中断时,才由硬件清”0” (也可
由查询软件清”0”)。
TR1:定时器Timer1 的运行控制位。该位由软件置位和清零。当GATE (TMOD.7)=0, TR1=1 时
就允许Timer1 开始计数,TR1=0时禁止Timer1 计数。
汇编程序:
$NOMOD51
#include "STC32G.INC"
ORG 0000H
SETB P_SW2.7 ; EAXFR=1 使能访问XFR
MOV CKCON, #0 ; 设置外部数据总线速度为最快
MOV WTST, #0 ; 设置程序代码等待参数 =0时 CPU 执行程序的速度为最快
MOV P1M0, #0
MOV P1M1, #0 ; P1 设置为准双向口
CLR AUXR.6 ; T1x12=0, Timer1 工作在 12T 模式 (每12个时钟加1)
SETB P1.1 ; 设定 P1.1 为输出方波端口,初始为高电平
MOV TMOD, #0 ; 选择 Timer1 Mode 0定时模式 , 16 位自动重载模式
MOV TL1, #LOW 63232 ; 定时器重载初值
MOV TH1, #HIGH 63232
CLR ET1 ; 禁止Timer1 中断
SETB TR1 ; 启动 Timer1 定时器 (TCON.6)
WAIT: JNB TF1, WAIT ; 等候 TCON.7 溢出 (TF1)
CPL P1.1 ; 反转 P1.1, 产生方波
CLR TF1 ; 清 Timer1 溢出中断标志
SJMP WAIT ; 重复
数字万用表测量值:
使用数字万用表测量P1.1 的输出频率,显示 0.200 kHz,即是 200 Hz。
示波器采样结果:
周期和频率输出正确,但正占空比 50.4%,负占空比 49.6%,反映高电平的周期略长,始终软件有些不足之处。