




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
微机原理及应用
PrincipleandApplicationsofMicro-Computers
第11讲MCS-51单片机定时/计数器(教材5.3节)教学目的:了解MCS-51单片机的定时/计数器的结构,掌握其工作方式和模式及它们的编程控制要求:掌握MCS-51单片机定时/计数器的4种工作方式的编程控制方法难点:定时/计数器的编程控制(初始化程序和初始值计算)本讲的主要内容MCS-51单片机的定时/计数器的内部结构定时/计数器编程控制的几个寄存器TCON,TMOD,THi,TLi四种工作方式下定时/计数器的工作原理构成,编程控制方法(初始化和初始值计算方法)定时/计数器的应用方波发生器,脉冲宽度测量,周期性任务调度器实现定时的方法软件定时软件延时不占用硬件资源,但占用了CPU时间,降低了CPU的利用率。例如延时程序。采用时基电路定时例如采用555电路,外接必要的元器件(电阻和电容),即可构成硬件定时电路。但在硬件连接好以后,定时值与定时范围不能由软件进行控制和修改,即不可编程,且定时时间容易漂移。可编程定时器定时最方便的办法是利用单片机内部的定时器/计数器。结合了软件定时精确和硬件定时电路独立的特点。2023/2/4MCS-51单片机的定时/计数器基于8051内核的MCS-51单片机具有2个定时/计数器16位定时/计数器,可编程作为8位,13位和16位的定时/计数器每个定时/计数器包含2个独立的8位寄存器,储存定时/计数器的值作定时器时,时钟源来自系统的晶体振荡器,频率为系统频率的1/12倍作计数器时,时钟源来自连接在2个引脚(Ti)的外部脉冲信号,最大计数频率为系统频率的1/24倍定时/计数器以递加方式累计计数基于8052内核的增强型MCS-51单片机至少具有3个定时/计数器,为了满足某些特殊应用,许多增强型MCS-51单片机还具有可编程计数器阵列(PCA)如SiliconLab.的C8051F系列MCS-51单片机的定时/计数器结构外部计数脉冲输入引脚方式和模式控制寄存器启/停控制寄存器溢出中断信号定时/计数器的实质是加一计数器(16位),由高8位和低8位两个寄存器组成。定时/计数器值的寄存器定时/计数器值的寄存器定时/计数器控制寄存器TCONINT0/1的触发方式控制(1:下降沿;0:低电平)INT0/1的中断请求标志(1:有效;0:无效)T0/1的中断请求标志(1:有效;0:无效)T0/1的启动/停止控制位(1:启动;0:停止)T0工作方式选择控制00B:方式0;01B:方式110B:方式2;11B:方式3定时器/计数器选择控制(1:计数器;0:定时器)定时/计数器启/停方式控制选择位(简称门控位)1:INTi引脚为高电平,且TRi=1,则启动,否则停止;0:启/停与INTi引脚电平无关,TRi=1启动,TRi=0停止定时/计数器控制寄存器TMODD7D6D5D4D3D2D1D0TMODGATEC/TM1M0GATEC/TM1M0T1工作模式和方式控制位T0工作模式和方式控制位T1工作方式选择控制00B:方式0;01B:方式110B:方式2;11B:方式3本讲的主要内容MCS-51单片机的定时/计数器的内部结构定时/计数器编程控制的几个寄存器TCON,TMOD,THi,TLi四种工作方式下定时/计数器的工作原理构成,编程控制方法(初始化和初始值计算方法)定时/计数器的应用方波发生器,脉冲宽度测量,周期性任务调度器存储定时/计数器值的寄存器定时/计数器0(T0)TH0(高8位),TL0(低8位)定时/计数器1(T1)TH1(高8位),TL1(低8位)THi和TLi组成一个16位的寄存器,范围:0~65535方式0(13位定时/计数器):THi(高8位)+TLi(低5位)(0~8191)方式1(16位定时/计数器):THi(高8位)+TLi(低8位)(0~65535)方式2(8位自动重装定时/计数器):TLi(0~255)(THi(重装值))方式3(仅对T0):TL0(第1个8位定时/计数器),TH0(第2个定时器)定时/计数器的工作原理方式0?1.什么情况时为定时/计数器溢出?2.作为递加的计数器,计划10个脉冲后溢出,应从何时(初始值)开始计数?定时/计数器的编程控制方式0编程控制包括如下操作设置工作方式,选择定时器或计数器模式(TMOD)作为定时器,需根据待定时时间和系统晶体频率(或机器周期)来确定初始值(THi和TLi)启动和停止控制(单独设置TRi位或直接写TCON)若使用中断,需设置相应的中断和优先级控制寄存器(IE,IP)13位定时/计数器的初始值计算方法?这里的InitialVal_13B的有效数据位为13位,自然保存在一个16位变量中,那么如何给THi和TLi赋值?定时/计数器的工作原理方式116位定时/计数器的初始值计算方法16位定时/计数器的构成[见教材p.155图5-7]定时/计数器的工作原理方式28位自动重装定时/计数器的构成[见教材p.156图5-8]8位自动重装定时/计数器的初始值计算方法8位自动重装定时/计数器一般应用于UART的波特率发生器(教材p.157图5-11)(下一讲说UART)方式0示例某系统使用6MHz晶体振荡器,其机器周期为
μs?设计一个方波发生器,在P1.0引脚输出周期为1ms的方波,现要求用T1作为定时器,且工作在方式0.(用定时中断方式来实现)P1ORG0000HRESERT:AJMPMAINORG001BHAJMPIT1PORG0100HMAIN:MOVSP,#60HACALLPT1M0HERE:AJMPHERE
Step1:计算初始值Step2:1)TMOD2)TCON3)Thx,Tlx4)开中断
5)启动C/TPT1M0:MOVTMOD,#00HMOVTL1,#0CHMOVTH1,#0F0HSETBET1SETBEASETBTR1RETIT1P:MOVTL1,#0CHMOVTH1,#0F0HCPLP1.0RETI定时/计数器的编程控制方式0示例某系统使用12MHz晶体振荡器,其机器周期为
μs?设计一个方波发生器,在P1.0引脚输出周期为1ms的方波,现要求用T1作为定时器,且工作在方式0.(分别用查询溢出标志位TF1和定时中断两种方式来实现)P2#include<io51.h>voidmain(void){TMOD=
;TH1=
;TL1=
;IE=0x88;IP=0x08;TR1=1;P1.0=1;
while(1);//主程序}
interrupt[0x1B]voidT1_ISR(void){TR1=0;
if(P1.0==1)P1.0=0;
elseP1.0=1;TH1=
;TL1=
;TR1=1;}P1#include<io51.h>voidmain(void){TMOD=
;TH1=
;TL1=
;IE=0x0;TR1=1;
while(1)//主程序{
while(TF1!=1);TF1=0;TR1=0;TH1=
;TL1=
;
TR1=1;
if(P1.0==1)P1.0=0;
elseP1.0=1;}}定时/计数器的编程控制方式1示例某系统使用12MHz晶体振荡器,如果用T0作为定时器,且工作在方式1,现要求P1.0产生周期为20ms的方波,如何实现?#include<io51.h>voidmain(void){TMOD=0x01
;TH0=0xD8;TL0=0xF0;IE=0x82;IP=0x02;TR0=1;P1.0=1;
while(1);//主程序}
interrupt[0x0B]voidT0_ISR(void){TR0=0;
if(P1.0==1)P1.0=0;
elseP1.0=1;TH0=0xD8;TL0=0xF0;TR0=1;}?如果希望在该系统实现1s的定时周期,应该怎么实现?能实现10s或更长的定时周期吗?方式2的应用假设系统的单片机使用6MHz的晶体振荡器。T0
工作在方式2计数器模式,并作为一个特殊外部中断请求输入线,要求T0引脚发生负跳变时向CPU申请中断。每发生一次T0中断后,P1.0脚的LED亮50ms然后关闭,直到再次出现T0中断LED再亮50ms,如此重复。以T0工作在方式2计数器模式,计数器的初始值为FFH,一旦T0引脚出现负跳变时,计数器的计数值加1,立即产生T0计数器溢出中断标志TF0=1,向CPU申请中断。T1工作在方式1定时器模式,TM=2μs,定时器初始值为40536=9E58HTMOD=16H主程序堆栈设置初始化程序死循环初始化T0/T1TMODTCON—TR0?、TR1?IE/IPT0亮灯启动T1T1灭灯初始化T1关闭T1方式2的应用程序代码
ORG0000HAJMPMAINORG000BH
AJMPIT0PORG001BHAJMPIT1PORG0100HMAIN:MOVSP,#60HACALLPT0M2HERE:AJMPHEREIT0P:CLRP1.0SETBTR1RETIPT0M2:MOVTMOD,#16HMOVTH0,#0FFHMOVTL0,#0FFHMOVTL1,#58HMOVTH1,#9EHSERBTR0SETBET0SETBEASETBP1.0
RETIT1P:MOVTH1,#58HMOVTH1,#9EHSETBP1.0CLRTR1RETI方式3的应用
ORG0000HAJMPMAINORG000B
AJMPITOPORG001BAJMPIT1PORG0100HMAIN:MOVSP,#60HACALLPT0M3HERE:AJMPHEREIT0P:MOVTL0,#9CHCPLP1.0RETIIT1P:MOVTH0,#38HCPLP1.1RETI假设单片机使用6MHz的晶振,T0工作在方式3,TL0和TH0分别产生200us和400us定时中断,并且在P1.0和P1.1脚位分别产生400us和800us,占空比为1/2的方波.PT0M3:MOVTMOD,#03HMOVTL0,#9CHMOVTH0,#38HSETBP1.0SETBP1.1SERBTR0SETBET0
SERBTR1SETBET1SETBEARET本讲的主要内容MCS-51单片机的定时/计数器的内部结构定时/计数器编程控制的几个寄存器TCON,TMOD,THi,TLi四种工作方式下定时/计数器的工作原理构成,编程控制方法(初始化和初始值计算方法)定时/计数器的应用方波发生器,脉冲宽度测量,周期性任务调度器定时/计数器的应用测量脉冲宽度[见p.166]假设某系统的晶体振荡器频率fOSC=12MHz,假设电路连接如下图,设计程序能够测量外部脉冲高电平的宽度(利用TMOD的GATE位)定时/计数器T1的启动条件:GATEandINT1andTR1,否则停止信号调理电路INT1......TMnTMTMkTMINT1中断T1初始化INT1引脚T1计时脉冲宽度测量程序代码
(将结果以机器周期形式存放30H和31H单元)MAIN:MOVTMOD,#90HMOVTH1,#00HMOVTL1,#00HMOVR0,#30HL1:JBp3.3,L1;等待INT1变低SETBTR1;变低时,启动INT1,TR1=1L2:JNBP3.3,L2;等待INT1变高,启动定时L3:JBP3.3,L3;等待INT1变低CLRTR1MOV@R0,TL1INCR0MOV@R0,TH1END
脉冲宽度测量程序代码#include
<io51.h>#include
<stdio.h>constunsignedcharTmachine=1;//机器周期voidmain(void){TH1=0;TL1=0;TMOD=0x90;TCON=0x04;TR1=1;IE=0x8C;Refresh_ok=0;HaveError=0;
while
(1){//主程序
if
(Refresh_ok==1){ Refresh_ok=0;
if
(HaveError==0) { wide=PulseCounter*Tmachine;
printf("Result:%d\n",wide); }
else
printf("HaveaError!\n"); HaveError=0;}}
//主程序}interrupt
[0x1B]void
T1_ISR(void){TH1=0;TL1=0;HaveError=1;}interrupt[0x13]voidINT1_ISR(void){unsignedchartl,th;TR1=0;th=TH1;tl=TL0;PulseCounter=(unsignedint)th;PulseCounter<<=8;PulseCounter+=(unsignedint)tl;TH1=0;TL1=0;TR1=1;Refresh_ok=1;}?为了不出现HaveError=1,允许外部脉冲高电平的最大宽度是多少?MAIN:MOVTMOD,#90HMOVTH1,#00HMOVTL1,#00HMOVR0,#30HL1:JBp3.3,L1;等待INT1变低SETBTR1;变低时,启动INT1,TR1=1L2:JNBP3.3,L2;等待INT1变高,启动定时L3:JBP3.3,L3;等待INT1变低CLRTR1MOV@R0,TL1INCR0MOV@R0,TH1END
LED灯闪烁控制
ORG0000HAJMPMAINORG000B
AJMPITOPORG001BAJMPIT1PORG0100HMAIN:MOVSP,#60HACALLPT0M2HERE:AJMPHERE
IT0P:CLRTR0SETBP1.0MOVTL0,#58HMOVTH0,#9EHMOVA,#0AHSETBTR1RETI
IT1P:DECAJNZLOOPCLRP1.0CLRTR1SETBTR0LOOP:MOVTL1,#0B0HMOVTH1,#3CHRETIPT0M2:MOVTMOD,#11HMOVTL0,#58HMOVTH0,#9EHMOVTL1,#0B0HMOVTH1,#3CHSETBET0SETBET1CLRP1.0SETBTR0SETBEARET单片机晶振6MHz,P1.0控制一个LED,亮50ms灭1s循环。T0、T1工作在方式1TM=2μsT0执行50ms,初始值为216-(50ms/2μs)=40536=9E58HT1执行1s,但是16位计数器最大计时216*2μs=0.131072s需扩展成24位,初始值为多少?以10*100mx为例:循环次数0AH初始值为216-(100ms/2μs)=15536=3CB0HTMOD=11H练习:利用定时计数器从P1.0输出周期为1s,脉宽为20ms的正脉冲信号,晶振频率为12MHz。
(程序代码)
ORG 0000HAJMP MAINORG 000B
AJMP ITOPORG 001BAJMP IT1PORG 0100HMAIN:MOV SP,#60HACALL PT0M1HERE:AJMP HEREPT0M2:MOV TMOD,#11HMOV TL0,#0E0HMOV TH0,#0B1HMOV TL1,#88HMOV TH0,#19HSETB ET0SETB ET1SETB EASETB P1.0SERB TR0RET
IT0P:CLR TR0CLR P1.0MOV TL0,#0E0HMOV TH0,#0B1HMOV A,#20SETB TR1RETI
IT1P:DEC AJNZ LOOPSETB P1.0CLR TR1SETB TR0LOOP:MOV TL1,#88HMOV TH0,#19HRETILED灯闪烁控制
ORG0000HAJMPMAINORG000B
AJMPITOPORG0100HMAIN:MOVSP,#60HACALLPT0M2HERE:AJMPHERE
IT0P:CLRTR0JNZBP1.0LIGHTSETBP1.0MOVTL0,#58HMOVTH0,#9EHMOVA,#14HJUMPSSSLIGHT:DECAJNZLOOPCLRP1.0LOOP:MOVTL0,#58HMOVTH0,#9EHSSSSETBTR0RETIPT0M2:MOVTMOD,#11HMOVTL0,#58HMOVTH0,#9EHSETBET0CLRP1.0SETBTR0SETBEARET单片机晶振6MHz,P1.0控制一个LED,亮50ms灭1s循环。T0工作在方式1TM=2μsT0执行50ms,初始值为216-(50ms/2μs)=40536=9E58H1s=20*50ms循环次数14HTMOD=01H定时/计数器的应用周期性任务调度器如果让你来控制一个LED指示灯按一定频率闪烁,或许你打算这样:置Px.y为低电平,然后delay,再置Px.y为高电平,然后再执行另外一个delay,然后重复这个过程.(丑陋的delay占用了CPU的全部时间!)为避免丑陋的delay,可能你想用Ti的中断来实现,最大程度地把CPU时间都释放了,这是个很好的思路,然而当你要控制5个甚至更多个LED按各自不同的频率闪烁,又该怎么做?参考现代操作系统中进程调度方法之一,
“时间片轮转调度(roundrobin)”[参考A.S.Tanenbaum著,陈向群等译,现代操作系统,机械工业出版社,1999,p.45],我们设计一个周期性任务调度器(PeriodicTaskScheduler),用它来产生多种不同周期的消息,最后根据这些消息来启动或停止各种周期性任务(进程),避免delay的缺点我们教材中的许多例子都采用这种思路周期性任务调度器程序代码(1)#include<io51.h>//globalvariablesunsignedcharT0IniVal_Hi,T0IniVal_Lo;unsignedcharT0Overflow,FivePeriod_cnt;unsignedcharTenPeriod_cnt,FiftyPeriod_cnt;unsignedcharOnePeriod_ok,FivePeriod_ok,unsignedcharTenPeriod_ok,FiftyPeriors_ok;void
StartPTS(unsignedintmicroSec){
unsignedchartl,th;unsignedint
t;
TR0=0;
TMOD=0x01;t=0xFFFF-microSec;th=(unsignedchar)t;tl=(unsignedchar)(t>>8);T0IniVal_Hi=th;T0IniVal_Lo=tl;TH0=th;TL0=tl;T0Overflow=0;FivePeriod_cnt=0TenPeriod_cnt=0;FiftyPeriod_cnt=0;OnePeriod_ok=0;FivePeriod_ok=0;TenPeriod_ok=0;FiftyPeriod_ok=0;IE|=0x82;IP|=0x02;TR0=1;}interrupt
[0x0B]void
T0_ISR(void){TR0=0;TH1=T0IniVal_Hi;TL1=T0IniVal_Lo;TR0=1;T0Overflow=1;}voidPeriodicMsgGenerator(void){
if
(T0Overflow==1){T0Overflow=0;OnePeriod_ok=1;FivePeriod_cnt++;
if
(FivePeriod_cnt>=5){FivePeriod_cnt=0;FivePeriod_ok=1;}TenPeriod_cnt++;
if
(TenPeriod_cnt>=10){Ten
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 无锡职业技术学院《建设工程监理》2023-2024学年第一学期期末试卷
- 山西同文职业技术学院《设计软件应用Ⅲ(photoshop)(景观设计)》2023-2024学年第二学期期末试卷
- 天津师范大学《牙体形态学》2023-2024学年第一学期期末试卷
- 福建省晋江市安溪一中、养正中学2024-2025学年高三下学期学习能力诊断(一模)语文试题含解析
- 天津中医药大学《高级法语II》2023-2024学年第一学期期末试卷
- 南京中医药大学翰林学院《创作与草图》2023-2024学年第二学期期末试卷
- 山西医科大学《武术选项》2023-2024学年第二学期期末试卷
- 2024-2025学年黑龙江省鸡西市鸡东县二中高三下学期阶段性考试生物试题含解析
- 阜阳师范大学信息工程学院《西班牙语写作》2023-2024学年第一学期期末试卷
- 武汉外语外事职业学院《日语会话(二)》2023-2024学年第二学期期末试卷
- GB/T 44979-2024智慧城市基础设施紧凑型城市智慧交通
- 2025年保密知识试题库附参考答案(精练)
- 临床微生物学检验技术知到智慧树章节测试课后答案2024年秋济宁医学院
- 分级护理质量考核标准
- 食品厂卫生安全员工培训
- 幼儿园校园欺凌自查报告2022
- 肝脾常见变异
- 水土保持方案投标文件技术部分
- 《人力资源管理》大学期末测试题库500题(含答案)
- 《农村中小学音乐教学现状与对策研究》课题开题报告
- 一般固体废物处理合同范本
评论
0/150
提交评论