




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2020/8/5,1,第7章 AT89S51单片机 的定时器/计数器,7.1 定时/计数器的结构,CPU,TL0,TH0,7 0,7 0,13或16,8CH,8AH,8位的加1计数器,TL1,TH1,7 0,7 0,8DH,8BH,13或16,TMOD(89H),工作方式控制寄存器,机器周期,定时模式,P3.5,P3.4,计数模式,只能字节寻址,TCON(88H),定时/计数控制寄存器,4种工作方式;两种工作模式。,TMOD (89H),TMOD:计数器/定时器方式寄存器,定时/计数器0,定时/计数器1,1 :计数模式 分别对P3.5 P3.4的脉冲计数,0 :定时模式 对机器周期脉冲计数,:
2、门控位,TCON 88h,计数器/定时器控制寄存器,TR1=1 计数/定时器1开始计数 TR1=0 计数/定时器1停止计数,TR0=1 计数/定时器0开始计数 TR0=0 计数/定时器0停止计数,定时器/计数器0的工作原理,16位计数器,TL0,TH0,TR0,工作模式选择,定时,计数,TF0,启动与停止控制,振荡器,12,P3.4,晶振频率,fosc=12MHz,计数频率,fc=1MHz,机器周期,机器周期,GATE,1,T0启动方式两种:,软件(GATE0=0): TR0=1,硬件(GATE0=1,TR0=1):,门控位,0,定时,计数,0,0,0,0,0,1,2,3,4,5,6,5,5,
3、5,3,0,0,0,0,0,1,2,3,4,5,5,5,5,6,3,0,0,0,0,0,7.2. 定时器/计数器的四种工作方式,图6-4 定时器/计数器0工作于方式0时的逻辑结构图,7.2.1 方式0,选择开关接通的计数脉冲是机器周期脉冲,T0对内部机器周期计数。定时时间由如下公式确定。 定时时间=计数溢出值机器周期 =(213计数初值)机器周期 其中, 机器周期=时钟周期12 213是T0在方式0时的最大计数值。,1当 =0时,为定时模式,从初始值开始计数到计数溢出的时间,在定时应用中,只要根据需要定时时间计算出计数初值,送入TH0、TL0 中,便可以实现精确定时,计数初值按如下公式计算。
4、计数初值=213定时时间/机器周期 如果晶振频率为12MHz,则时钟周期为(1/12)s,机器周期为1s,当初值为0时,方式0的最长定时时间为8.192ms。,解:根据公式,计算如下。 计数初值=213定时时间/机器周期 =2132ms/1s=6192=1100000110000B 即TH0应装入计数初值的高8位为C1H,TL0应装入计数初值的低5位为10H。,【例7-1】若单片机使用的晶振频率为12MHz。请计算采用T0方式0定时2ms所需的定时器初值。,TH0=C1H TL0=10H,TH0=193 TL0=16,6192/32=19316,7.2.2 方式1,图6-5 定时器/计数器0
5、工作于方式1时的逻辑结构图,方式1的计数位数是16位,由TL0作为低8位,TH0作为高8位,组成了16位加1计数器。计数模值为216。计数初值的计算公式如下。 计数初值=216定时时间/机器周期,如果晶振频率为12MHz,则时钟周期为1/12s,机器周期为1s,方式1的最长定时时间为65.536ms。,解:根据公式,计算如下。 计数初值=216定时时间/机器周期 =655362ms/1s=63536=F830H 即TH0应装入计数初值的高8位为F8H,TL0应装入计数初值的低8位为30H。,【例7-2】 若单片机使用的晶振频率为12MHz。请计算采用T0方式1定时2ms所需的定时器初值。,TH
6、0=F8H TL0=30H,63536/256=24848,TH0=248 TL0=48,上述两种方式,当从某一设定的初始值计数计满溢出时,硬件自动置TF=1,向CPU发出计满溢出中断请求,计数器状态回到全0,计数器从0开始计数。,注意:,若需要定时器/计数器循环计数时,必须运行重装初始值的指令。,7.2.3 方式2,图6-6 定时器/计数器0工作于方式2时的逻辑结构图,1,初值寄存器,定时器初始化时,必须将计数初值同时送入TL0和TH0 计数初值=28定时时间/机器周期 当TL0计满溢出时,由硬件电路使TF0置1,向CPU发出中断请求,并将TH0中的计数初值自动送入TL0, TL0从初值重新
7、进行加1计数。不需软件重装初值,适用于精确定时。 如果晶振频率为12MHz,则时钟周期为(1/12)s,机器周期为1s,方式2的最长定时时间为0.256ms。,7.2.4 方式3,定时器T1不能工作在方式3,一旦设定T1为方式3,则T1自动停止工作。,图7-8 定时器/计数器0工作方式3逻辑结构图,1,T0工作于方式3,T1用作串行口的波特率发生器或不需要中断的场合,方式3:T0分为两个独立的8位计数器TL0和TH0。TL0使用T0的所有控制位: GATE、TR0、TF0和 。 当TL0计数溢出时,由硬件电路使TF0置1,向CPU发出中断请求。,TH0固定为定时方式使用T1的控制位TR1、TF
8、1,同时占用定时器1的中断源,2T0工作在方式3时T1的各种工作方式 一般情况下,当T1用作串口波特率发生器时,T0才工作在方式3。T0方式3时,T1可为方式0、1、2,作为串口波特率发生器,或不需要中断的场合。,19,(1)T1工作在方式0 T1的控制字中M1、M0=00时,T1工作在方式0,工作示意图如图7-9所示。,20,图7-9 T0方式3时T1为方式0工作示意图,(2)T1工作在方式1 当T1的控制字中M1、M0=01时,T1工作在方式1,工作示意见图7-10。,图7-10 T0方式3时T1为方式1工作示意图,(3)T1工作在方式2 当T1控制字中M1、M0=10时,T1为方式2,工
9、作示意如图7-11所示。,22,图7-11 T0方式3时T1为方式2工作示意图,(4)T1设置在方式3 T0工作在方式3时,再把T1也设置成方式3,此时T1停止计数。,7.4 定时器/计数器应用举例,【例7-1】产生方波信号:系统时钟为12MHz,利用T0在P1.0引脚上输出一个周期为2ms的方波,分析 :T0工作在方式1,定时方式,软件启动,所以TMOD=01,计数器初始值:65536-1000=64536,64541/256=25229,中断响应时间为3-8个机器周期,初始值为64536+5,TH0=252;TL0=29,计数器0每计995个脉冲,溢出向CPU发中断请求,7.4.1定时模式
10、应用:,程序如下:,#include sbit P1_0=P10; void main( )/*主函数*/ EA=1; ET0=1; /T0中断允许 TMOD=1; /T0工作在方式1,定时方式,软件启动 TH0=252; TL0=29; TR0=1; /计数开始 P1_0=1; while(1); void timer0(void) interrupt 1 P1_0=P1_0; TH0=252; /重装初始值 TL0=29; ,测量方波正脉冲的宽度(门控位GATEx的应用) 应用定时器T0(T1)的门控位GATE,测量INT0(INT1)引脚上正脉冲的宽度。 【例7-2】 利用T1和其门控位
11、GATE,可测量【例7-1】中P1.0引脚上输出的正脉冲的宽度(机器周期数),即P1.0接INT1(P3.3)。 分析: T0定时,软件启动,方式1,用来产生1ms方波; T1定时,硬件启动,方式1,用来测量脉冲宽度, TMOD=0 x91, TH1=0,TL1=0;定时器0中断产生方波; P3.3高电平期间,T1从0开始计数,低电平停止计数; 外部中断1读出定时/计数1的计数值(以机器周期数的形式读入到Count_high 和Count_low两个单元中)并清零。,28,29,图6-16 利用GATE位测量正脉冲的宽度,向CPU申请中断,读出计数值并清零,,使引脚上出现的正脉冲宽度,,参考程
12、序如下: #include #include sbit P1_0=P10; sbit P3_3=P33; unsigned char Count_High, Count_Low; void main( )/*主函数*/ unsigned int ussum; EA=1; ET0=1; /T0中断允许 EX1=1; IT1=1; TMOD=0 x91; /T0定时方式1软件启动,T1定时方式1硬件启动, TH0=252; TL0=29; TH1=0; TL1=0; TR0=1; /计数开始 TR1=1; P1_0=1;,30,while(1) ussum=Count_High*256+Count
13、_Low; LED_display(ussum); void timer0(void) interrupt 1 P1_0=P1_0; TH0=252; /重装初始值 TL0=29; void int1(void) interrupt 2 Count_High=TH1; Count_Low=TL1; TH1=0; TL1=0; ,测得高电平的持续时间是1.005_1.006ms,请思考如何修改程序?,调用数码管模块的数字显示函数,在大规模程序开发中,一个程序由很多个模块组成,这些模块的编写任务被分配到不同的人。几乎所有商用程序都必须使用模块化程序设计理念。在程序的设计过程中各个开发者分工合作,分
14、别完成某一模块特定的功能,减少开发时间等。,例【6-3】应用定时器/计数器实现光电秒表,1时基的设计 2实时时钟秒的实现 3定时器初值的设置 4定时器的初始化 5. 中断源的使用 6秒表程序源代码,光电(按键)秒表课程设计,1时基的设计,利用定时器T0定时方式1定时50ms; T0硬件启动(即P3.2引脚接外部光电检测输出信号或按键信号); 定时时间到,中断请求,在其中断服务程序中,通过指令重装定时初值,于是,T0便会每隔50ms产生一次中断,周而复始,获得一个0.05s的时基信号。,由于应用项目选用的单片机外接晶振频率为12MHz, 所以时钟周期为1/12s,一个机器周期等于12个时钟周期,
15、机器周期为1s。,2实时时钟秒的实现,T0定时 50ms到,机器周期 脉冲,计数器1 计数10次 溢出,中断,1S,P1.0,100ms方波,P1.0接P3.5引脚,设置定时器T0工作于定时方式1(16位定时器/计数器),硬件启动,定时时间为50ms(0.05s)。因此,T0的定时器初值即计数初值为: 计数初值=216定时时间/机器周期 =21650ms/1s=15536 考虑中断响应时间,计数初始值为15546,3定时器初值的计算,定时器0初值的计算,15546/256=60186,TH0=60;TL0=186,定时器1初值的计算,设置定时器T1工作于计数方式2,软件启动,计数初值=2161
16、0=65526=FFF6H,TH1=255;TL1=246;,(1)根据需要设定的定时器0,1工作方式,给定时器/计数器方式寄存器TMOD送入一个相应的方式控制字,以设定定时器/计数器的工作方式。 TMOD=0 x69 (2)将计算好的定时器初值(计数初值)送入定时器,以确定需要的定时时间或计数初值。 (3) T0、T1计数启动,4定时器的初始化,5.使用的中断源,(1)定时器/计数器T0溢出中断:在P1.0引脚输出周期为100ms的方波 (2)定时器/计数器T1溢出中断: 每到1秒,秒变量加1 (3)INT1中断:完成计时的启动与停止,检测到启动信号,P3.2=1;停止信号到,P3.2=0。
17、 (4)为精确定时,T0和INT1中断设置为高优先级中断,#include #include Led_Drive.h sbit ms50=P10; sbit led=P11; sbit speaker=P12; sbit P3_2=P32; unsigned int second=0; bit start=0; void Delay(unsigned int i)/*延时函数Delay( )*/ unsigned int j; for(;i0;i-) for(j=0;j333;j+); /*延时1ms,j的选择与晶振频率有关*/ void main( )/*主函数*/ IE|=0 x8e; I
18、P|=6; IT1=1; TMOD=0 x69; /定时器0定时方式1,硬件启动,定时器1计数方式2,软件启动 TH0=60; TL0=186; /提前10个机器周期申请中断 TH1=0 xf6; TL1=0 xf6; TR0=1; TR1=1; ms50=1; P3_2=0; led=0; speaker=1;,6. 秒表程序源代码,while(1) if (start=1) start=0; P3_2=P3_2; led=led; speaker=0; Delay(100); speaker=1; LED_display(second); void int1(void) interrupt
19、 2 start=1; void timer0(void) interrupt 1 ms50=ms50; TH0=60; TL0=182; void timer1(void) interrupt 3 second+; speaker=0; Delay(1); speaker=1; ,调用数码管模块的数字显示函数,实时时钟应用项目的设计 【例6-4】使用定时器/计数器来实现实时时钟。实时时钟就是以秒、分、时为单位计时。 1实时时钟的实现 时钟最小计时单位是秒, 在【例6-3】已得到1s定时,每当T1溢出中断申请,则秒计数变量s加1;若秒计满60,则分计数变量m加1,同时将秒计数变量s清0;若分钟
20、计满60,则小时计数变量h加1;若小时计数变量满24,则将小时计数变量清0。,请同学们自己改写上述程序实现该项目。,利用T0扩展一个外部中断源。,分析:,将T0设置为计数器方式,按方式0工作,软件启动,计数初值,【例6-1】P3.4引脚接按键开关, P1.2接蜂鸣器,每当按键即向 CPU发出中断请求,使蜂鸣器发声。计数模式,6.4.1 计数模式应用:,#include sbit speaker=P12; void Delay(unsigned int i)/*延时函数Delay( )*/ unsigned int j; for(;i0;i-) for(j=0;j333;j+); /*延时1ms
21、,j的选择与晶振频率有关*/ void main( )/*主函数*/ IE|=0 x82; TMOD=4; TH0=0 xff; TL0=0 x1f; TR0=1; while(1); void timer0(void) interrupt 1 speaker=0; Delay(100); speaker=1; TH0=0 xff; TL0=0 x1f; ,程序如下:,结论:P3.4引脚每输入一个下降沿信号,都将TF0置1,向CPU发出一次中断请求。相当于扩展了一个边沿触发的外部中断源,中断入口地址为000BH。,思考:T0工作于方式1、2、3时是否可行,若可行如何改写程序。,#include
22、 sbit speaker=P12; void Delay(unsigned int i)/*延时函数Delay( )*/ unsigned int j; for(;i0;i-) for(j=0;j333;j+); /*延时1ms,j的选择与晶振频率有关*/ void main( )/*主函数*/ IE|=0 x82; TMOD=6; TH0=0 xff; TL0=0 xff; TR0=1; while(1); void timer0(void) interrupt 1 speaker=0; Delay(100); speaker=1; ,T0工作于方式2的按键报警,计数器计满溢出后不需指令重
23、装初始计数值。,分析:,将T0设置为计数器方式,按方式1工作,软件启动,计数初值,【例6-2】光电信号接P3.4引脚,用定时器0实现对外部目标 的计数。,光电计数项目,不使用中断,计数值实时显示在数码管上。,#include #include sbit speaker=P12; void Delay(unsigned int i)/*延时函数Delay( )*/ unsigned int j; for(;i0;i-) for(j=0;j333;j+); /*延时1ms,j的选择与晶振频率有关*/ void main( )/*主函数*/ unsigned int sum0=0,sum1=0; TMOD=5; /T0计数方式1软件启动 TH0=0; TL0=0; TR0=1; /计数开始 while(1),程序如下:, sum1=TH0*256+TL0; /读计数器 LED_display(sum1); if(sum1!=sum0) sum0=sum1; speaker=0; Delay(100); speaker=1; ,#include #define duanxue P2 #define weixue P0 #define LED_WEISHU 6 #defi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 咸宁管网施工方案
- 海洋工程环境影响评价方法-全面剖析
- 智能称重系统设计与实现-全面剖析
- 生态经济AI应用行业深度调研及发展战略咨询报告
- 跑步爱好者俱乐部行业跨境出海战略研究报告
- 运动服装销售AI应用企业制定与实施新质生产力战略研究报告
- 艺术家驻留体验行业跨境出海战略研究报告
- NIKE库存供应链管理
- 涉河建设项目管理
- 科研人员竞聘演讲稿范文
- 2025年度货车司机招聘广告发布合同3篇
- 基于几类机器学习模型预测肥胖成因的分析比较
- 2025年度科室质控方案计划
- 违规吊装施工的报告范文
- 2023年郑州黄河文化旅游发展有限公司招聘考试真题
- 重大火灾隐患判定方法
- 中国发作性睡病诊断与治疗指南(2022版)
- (完整版)设备吊装施工方案
- 重庆市高2025届高三第二次质量检测 数学试卷(含答案)
- 无人机创客实验室方案
- 2024年四川省乐山市中考地理·生物合卷试卷真题(含答案)
评论
0/150
提交评论