470 likes | 587 Views
单片机原理及其应用. (Principle and Application of Single Chip Microcomputer). 第 1 章 概述 第 2 章 MCS-51 单片机硬件结构 第 3 章 MCS-51 寻址方式和指令系统 第 4 章 MCS-51 汇编程序设计 第 5 章 中断系统 第 6 章 定时器 / 计数器及 串行口 第 7 章 存储器扩展 第 8 章 接口电路扩展 第 9 章 应用举例. 6.1 定时 / 计数器结构特点及控制 6.2 串行通信及其接口. 第 6 章 定时器 / 计数器及串行口.
E N D
单片机原理及其应用 (Principle and Application of Single Chip Microcomputer)
第1章 概述 第2章 MCS-51单片机硬件结构 第3章 MCS-51寻址方式和指令系统 第4章 MCS-51汇编程序设计 第5章 中断系统 第6章 定时器/计数器及串行口 第7章 存储器扩展 第8章 接口电路扩展 第9章 应用举例
6.1 定时/计数器结构特点及控制 6.2 串行通信及其接口 第6章 定时器/计数器及串行口
6.1 定时/计数器结构特点及控制 定时/计数器是单片机中重要的部件,它的主要功能是产生内部定时和对外部脉冲计数。其核心是一个加1计数器,完成累加计数。 1。对晶振分频计数就形成内部定时功能。 2。通过相应引脚对外部脉冲计数就形成计数功能。 将加1计数器设置为不同的初值和不同的位数,可得到不同的定时间隔,不同大小的计数器。
6.1.1 定时/计数器结构 6.1.2 定时/计数器控制寄存器 6.1.3 定时/计数器工作方式 6.1.4 定时/计数器常数的计算 6.1.5 定时器/计数器的编程
定时/计数器简称定时器,8051单片机有2个16位的定时/计数器:定时器0(T0)和定时器1(T1)。它们都有定时或事件计数的功能,用于定时控制、延时、对外部事件计数和检测等场合。定时/计数器简称定时器,8051单片机有2个16位的定时/计数器:定时器0(T0)和定时器1(T1)。它们都有定时或事件计数的功能,用于定时控制、延时、对外部事件计数和检测等场合。 T0由2个特殊功能寄存器TH0、TL0(加1计数器)构成,T1则由TH1和TL1构成。 6.1.1 定时/计数器结构
6.1.1 定时/计数器结构 • 作计数器用时,通过引脚T0(P3.4)和T1(P3.5)对外部脉冲信号计数,输入脉冲信号从1到0负跳变时,计数器自动加1。确认一个负跳沿需两个机器周期,故计数最高频率为振荡频率的1/24。 • 定时应用时,加1计数器每个机器周期接收一个脉冲。当晶振为12MHz, 定时精度1us
÷12 振荡器 C/ T=0 TF 加1计数器 中断 X C/ T=1 T 端 X 控制信号 定时/计数器的原理 THx, TLx 图 6‑1 定时/计数器的结构框图
定时器有2个8位控制寄存器: TMOD和TCON,由软件设置各个定时器的工作方式和控制功能。 6.1.2 定时/计数器的控制寄存器
13位 16位 自动8位 独立8位 计/定,与INT0(P3.2)无关 计/定,与INT0有关 1.工作方式控制寄存器—TMOD(89H) 图6-2 定时器工作方式寄存器TMOD
中断设置 中断硬件自动复位, 不用中断软件清零。 中断硬件自动复位, 不用中断软件清零。 2.定时器控制寄存器—TCON(88H) 图6-3 定时器控制寄存器TCON
定时/计数器有4种工作方式,也就是定时器可构成4种电路结构模式。定时/计数器有4种工作方式,也就是定时器可构成4种电路结构模式。 方式0、1和2,T0和T1的工作方式相同。 方式3,两个定时器的模式不同。 6.1.3 定时/计数器工作方式
一、 方式0 (13位) 当TMOD的M1M0两位为00时,定时/计数器设定为工作方式0,其逻辑结构如图 6‑4 所示。 图6-4 定时/计数器T1(T0)方式0结构
二、 方式1 (16位) 当TMOD的M1M0两位为01时,定时/计数器为工作方式1,其逻辑结构如图 6‑5 所示。 图 6‑5 定时/计数器T1(T0)方式1结构
三、 方式2 (自动8位) 当TMOD的M1M0两位为10时,定时/计数器为工作方式2,其逻辑结构如图 6‑6 所示。 图 6‑6 定时/计数器T1(T0) 方式2 结构
定时/计数 仅定时 图 6‑7 定时/计数器T0方式3 结构 四、 方式3 (独立8位) 当TMOD的M1M0两位为11时,为工作方式3。只有T0能设为方式3,其逻辑结构如图 6‑7 所示。
T1这时只能工作在无中断的方式0,1,2。计数溢T1这时只能工作在无中断的方式0,1,2。计数溢 出时只能送串行口,一旦设好工作方式T1自动运行。 要停止运行,将T1设为方式3即可。作波特率发生 器,T1常工作在方式2。
1.计数器初值的计算 (1) 单纯计数,计数值不会溢出。初值 X=0。 (2)预先给定计数值 C, 计满 C 后发中断信号。 设初值为 X, 由计数器工作原理知 X+C=M, X = M - C 式中,M为计数器模值,该值和计数器工作方式 有关。 方式0, M=213=8192; 方式1, M=216=65536; 方式2和方式3, M=28=256。 6.1.4 定时/计数器常数的计算
2.定时器初值的计算 在定时器模式下,加1计数器对单片机晶振频率的 12分频进行计数。因此,定时器定时时间T的计算公 式: T=(M-X)×T计数 上式也可写成:X=M-(T/T计数) 式中,M为模值,和定时器的工作方式有关;T计数 是单片机振荡周期TCLK的12倍;X为定时器的定时初 值。
6.1.5 定时器/计数器的编程 1、 初始化程序编程步骤: 1) 确定工作方式--对TMOD赋值; 2) 确定定时/计数初值--直接写入TH0、TL0 或 TH1、TL1; 3) 根据需要开放或关闭定时器/计数器中断--直接对 IE的位(ET0 、ET1)赋值; 4) 启动定时器/计数器工作。软件启动置位TR0或 TR1即可, 硬件启动除了置位TR0、TR1外还要在 /INT0、 /INT1脚引入高电平才能工作。
2、中断服务程序 保护和恢复现场 时间常数重置 其他工作
一、方式0、方式1的应用 【例6-1】 选择T1方式0用于定时,在P1.1输出周期为1ms的方波,晶振fosc=6MHZ。 根据题意,只要使P1.1每隔500µs取反一次即可得到1ms方波,因而T1的定时时间为500µs。 将T1设为定时方式0:GATE=0,C/T=0,M1M0=00;T0没使用,可为任意,只要不使其进入方式3即可,一般取0。故TMOD=00H。系统复位后TMOD为0,所以可不必对TMOD置初值。
下面计算500µs定时,T1的初值: 机器周期 T计数=12/fosc=12/(6×106 )=2µs 设初值为X,则: (213-X)×2×10-6 s =500×10-6 s X=7942D=11111000 00110B=1F06H 因为在作13位计数器用时,TL1高3位未用,应 写0,X的低5位装入TL1的低5位,所以TL1=06H; X的高8位应装入TH1,所以TH1=F8H。 11111000 000 00110B=F8 06H X=65286D=FF06H 方式1时,时间常数?
[例6-2] (6-2) 编写用T0产生1秒定时的程序。 (fosc=6MHz) (1)工作方式确定 硬件定时: 方式0最大定时 16.384 ms 方式1最大定时 131.072 ms,方式2最大定时 512 us 必须加上软件计数才能产生1秒定时。选方式1,每100ms中断一次, 对其计数10次得1秒定时。 (2)定时器初值 机器周期 T计数=12/fosc=12/(6×106 )=2µs 设初值为X 则: (216-X)×2×10-6 s =100×10-3 s X=15536D=3CB0H (3)程序设计 用B作软件计数器。T0为定时方式1:GATE=0, C/T=0,M1M0=01;T1没使用。 TMOD = 01H
ORG 0 RESET: LJMP MAIN ORG 000BH ; T0中断入口 LJMP IT0P ORG 1000H MAIN: MOV SP, #60H ;设堆栈指针 MOV B, #10 ;软计数器初值 MOV TMOD, #01H ;T0方式1 MOV TL0, #0B0H MOV TH0, #3CH SETB ET0 ;T0 允中 SETB EA ;CPU开中断 SETB TR0 ;启动T0 SJMP $
T0中断服务程序 IT0P: MOV TL0, #0B0H MOV TH0, #3CH DJNZ B, LOOP CPL P1.5 ; 1秒时间到,翻转P1.5 LOOP: RETI
二、 方式2的应用 【例6-3】(6-3) T0(P3.4)引脚发生负跳变时(扩展外中断),从P1.0引脚输出周期为1ms的方波。 (fosc= 6MHz) (1)工作方式选择 产生1ms的方波只要T1每 500us中断一次,在中断服 务程序中对P1.0取反即可。 如何检测T0(P3.4)引脚发 生负跳变?将T0设定为只计一个 数就产生中断,以F0=1表示发生了中断。 (2)初值计算 计数器初值:0FFFFH 定时器初值:(28-X)×2×10-6 s = 500×10-6 , X=6
(3)程序设计 ORG 0 RESET: LJMP MAIN ORG 000BH LJMP IT0P ; 转T0中断服务程序 ORG 001BH LJMP IT1P ; 转T1中断服务程序 ORG 0100H MAIN: MOV SP, #60H SETB P3.4 ACALL PT0M2 ;T0,T1初始化 LOOP: MOV C, F0 ;查看T0有没发生中断 JNC LOOP ;没有则等待 SETB ET1 ; T1允中 SETB TR1 ;检测到P3.4负跳变,启动T1 SJMP $
PT0M2: MOV TMOD, #25H ; T1定(方式2)T0计数(方式1) MOV TL0, #0FFH MOV TH0, #0FFH SETB ET0 ; T0允中 MOV TL1, #06H MOV TH1, #06H CLR F0 ; 清T0已发生中断标志 SETB EA ;CPU开中断 SETB TR0 ; 启动T0 RET IT0P:: CLR TR0 ;停止T0计数 SETB F0 ;设置T0已发生中断标志 RETI IT1P: CPL P1.0 RETI
【例6-4】(6-4) 用定时器T1计数,要求每计满100次,将P1.0取反。 (1) 选择工作方式 根据题意,外部计数信号由T1(P3.5) 引脚输入,每跳变一次计数器加1,每输入100个脉冲发生一次中断,在中断服务程序中取反 P1.0。 用方式2计数,初始化后不必再置初值。 (2)初值计算 初值 X=28-100=156D=9CH, TH1=TL1=9CH, (3)程序设计 TMOD=60H
ORG 0 LJMP MAIN ORG 001BH ; T1中断入口 CPL P1.0 RETI ORG 0100H MAIN: MOV TMOD, #60H ;T1计数方式2 MOV TL0,#9CH ;装入定时常数高8位 MOV TH0,#9CH ;装入定时常数低8位 SETB P3.5 MOV IE, #88H;开放CPU, T1中断 SETB TR1 ;启动T1 SJMP $
T0工作在计数模式,计数器初值设定FFH,当T0端子输入负跳脉冲,计数器回零发出中断请求。将T0设为方式2,自动装入计数常数。T0工作在计数模式,计数器初值设定FFH,当T0端子输入负跳脉冲,计数器回零发出中断请求。将T0设为方式2,自动装入计数常数。 ORG 0000H AJMP MAIN ORG 000BH LJMP INTER ORG 100H MAIN: MOV SP, #60H MOV TMOD, #06H ; 方式2,计数 MOV TL0, #0FFH MOV TH0, #0FFH 【例6.5】 用定时/计数器扩展外部中断源(与例6-3类似)
SETB P3.4 SETB TR0 SETB ET0 SETB EA LOOP: ┋ SJMP LOOP ORG 150H INTER: PUSH A PUSH PSW ┋ POP PSW POP A RETI
三、方式3的应用 将T1作为波特率发生器使用时,T0有时设定在方式3, 获得两个独立的8位定时/计数器(TH0仅能定时)。 【例6-6】(6-5) 某单片机系统 T1工作在方式2,作波特率发生器。现要增加一个外部中断(原有的2个外中断已被占用),控制P1.0输出一个5kHz的方波。(fosc= 12MHz) (1)T0工作方式 TH0定时控制P1.0输出一个5kHz 的方波, 定时100us。TL0计数测 P3.4(T0)的负跳变。 T0需工作在方式3。
(2)初值计算 TL0 初值为0FFH TH0初值 (28-X)×1×10-6 =100×10-6, X= 28-100=156D=9CH (3)程序设计 ORG 0 RESET: LJMP MAIN …… ;转外中断0 ORG 000BH LJMP TL0INT ; 转T0中断服务程序 ORG 001BH LJMP TH0INT ; 转TH0(T1)中断服务程序 …… ;转外中断1 …… ;转串口中断
ORG 100H MAIN: MOV TMOD, #27H ; T0方式3 计数/定时, ; T1方式2定时 MOV TL0, #0FFH ; 计数初值 MOV TH0, #09CH ; 定时初值 MOV TL1, #datal ; 波特率常数 MOV TH1, #datal SETB P3.4 SETB IT0 ;/INT0 下降沿触发 SETB IT1 MOV IE, #9FH ; 允许中断(CPU,T0,T1) SETB TR0 ┆ TL0INT: MOV TL0, #0FFH ; 重装计数初值 SETB TR1 ; 启动TH0定时 RETI TH0INT: MOV TH0, #09CH ; 重装定时初值 CPL P1.0 RETI
四、脉冲测量 【例6-7】(p.132) 测量脉冲信号宽度 测量原理见图。脉冲加在P3.3, 用GATE1控制T1的定 时。P3.3为低电平期间,启动T1。当P3.3跳至高电平, 定时开始,直到P3.3 再次跳至低电平,停止T1定时。 ORG 0 RESET: AJMP MAIN ORG 100H MAIN: MOV SP, #60H MOV TMOD, #90H ;T1定时,方式1
MOV TL1, #0 MOV TH1, #0 SETB P3.3 LOOP: JB P3.3, LOOP ;等待/INT1变低 SETB TR1 ;启动T1(T1尚未计时) LOOP1: JNB P3.3, LOOP1;等待/INT1变高 LOOP2: JB P3.3, LOOP2 ;等待/INT1变低 CLR TR1 ;停止计时 MOV A,TL1 ;取定时值 计算脉冲 宽度,代 码转换等处理 LOOP3: LCALL DIR ; 调显示程序 AJMP LOOP3
【例6-8】 用定时/计数器测脉冲信号频率 设计思想:在一个固定时间(闸门时间)内,对外 接的脉冲计数。T0作定时 100ms (fosc=6MHz), T1作 计数。 TMOD=0101 0001B T0设为定时,方式1,定时器初值 T1设为计数,方式1,计数器初值为零 测量结果放在41H, 40H。 用位00H作为测量结束标志:(00H)=1
ORG 0000H LJMP ST ORG 000BH LJMP MSU1 ST: MOV TMOD, #51H ;T0,T1初始化 MOV TL0, #0B0H MOV TH0, #03CH MOV TL1, #00H MOV TH1, #00H SETB P3.5 ; T1引脚输入 JB P3.5, $ ; 等待信号低电平 SETB TR0 SETB TR1 SETB EA SETB ET0 CLR 00H ;清测量结束标志 WAI: JNB 00H, WAI SJMP $
中断服务程序 ORG 100H MSU1: CLR TR1 ; 停止计数 CLR TR0 ;定时停止 MOV 40H,TL1 ;存测量结果 MOV 41H,TH1 SETB 00H ;置测量结束标志 RETI 若(41H)= 02H, (40H)= 05H,频率是多少?
设计思想:在信号一个周期TF内用 定时器对系统时钟计数。信号接在 /INT1引脚。在外中断1程序中,设法 在信号第一次下降沿处启动T1计数, 第二次下降沿处停止T1计数。(第一 次中断时,TH1=TL1=0) 设测得的脉冲宽度计数值是m, 则脉 冲周期用下式计算: T1设定成定时方式1,TMOD=10H,定时常数为 零,最长的定时。对系统时钟的计数值放在40H, 41H,程序没有计算测出的脉冲周期。 【例6-9】 用定时/计数器测脉冲信号周期
主程序 ORG 0000H LJMP ST ORG 0013H LJMP MST ST: MOV TMOD, #10H SETB IT1 ; /INT1下降沿有效 MOV TL1, #0 MOV TH1, #0 CLR F0 ; 清测量结束标志 SETB P3.3 ;/INT1引脚输入 JB P3.3, $ ; 等待信号变低电平 SETB EA SETB EX1 JNB F0, $ ;等待测量结束 SJMP $
中断服务程序 MST: CJNE TH1, TL1, IEND ;不是第一次中断 CJNE TL1, #00H, IEND ;不是第一次中断 SETB TR1 ;第一次中断,启动计数 RETI IEND: CLR TR1 ;第二次中断,停止计数 SETB F0 ;置测量结束标志 MOV 40H, TL1 ;存结果 MOV 41H, TH1 RETI
6.1.6 实时时钟设计 1.基本设计思想 获取1秒定时:硬件定时 + 软件计数。T0设定 100ms定时,中断10次即得秒计时。 安排三个单元分别作为时、分、秒单元。 40H: 秒单元 41H: 分单元 42H: 时单元 按照钟表计时方法计时。 2. 程序流程 (1)主程序
运行中读定时器/计数器 运行中读定时器/计数器,可能发生读取到错误的 数据。原因在于CPU是分时读TLx和THx的。 解决方法:先读THx, 后读TLx, 再读THx。 若两次读的THx相同,读取的数据正确,否则重复 上述过程,读取的结果就正确了。 RDTIME: MOV A, TH0 MOV R0, TL0 CJNE A, TH0, RDTIME MOV R1, A RET