单片机第二章31

上传人:n**** 文档编号:93086434 上传时间:2019-07-16 格式:PPT 页数:88 大小:1.94MB
返回 下载 相关 举报
单片机第二章31_第1页
第1页 / 共88页
单片机第二章31_第2页
第2页 / 共88页
单片机第二章31_第3页
第3页 / 共88页
单片机第二章31_第4页
第4页 / 共88页
单片机第二章31_第5页
第5页 / 共88页
点击查看更多>>
资源描述

《单片机第二章31》由会员分享,可在线阅读,更多相关《单片机第二章31(88页珍藏版)》请在金锄头文库上搜索。

1、8051内部资源,即8051的片内外围部件,要用特殊功能寄存器或SFR寻址。,需提供定义寄存器的头文件或用语句写出。,5.5 定时器/计数器,5.6 串行口,内 容,8.2 定时器/计数器(Timer/Counter),8051有两个16位内部定时器/计数器T0、T1。,若是计数内部晶振驱动时钟,则是定时器。,若是计数8051的输入引脚的脉冲信号,则是计数器。,8051的T/C是加1计数的。定时器实际上也是工作在计数方式下,只不过对固定频率的脉冲计数;由于脉冲周期固定,由计数值可以计算出时间,有定时功能。,当T/C工作在定时器时,对振荡源12分频的脉冲计数,即每个机器周期计数值加1,计数频率f

2、osc/12。,当T/C工作在计数器时,计数脉冲来自外部脉冲输入引脚T0或T1。 当T0或T1脚上负跳变时计数值加1。识别引脚上的负跳变需2个机器周期。 T0或T1脚输入的可计数外部脉冲的最高频率为fosc/24。,8.2.1 与T/C有关的特殊功能寄存器,计数寄存器TH和TL,T/C是16位的,由TH高8位和TL低8位构成。,定时器/计数器控制寄存器TCON(Timer/Counter Control Register),低4位与外部中断有关。高4位的功能如下: (1) TF1、TF0计数溢出标志位 (2) TR1、TR0启动控制位 1:启动定时器/计数器工作 0:停止定时器/计数器工作,定

3、时器/计数器方式控制寄存器TMOD(Timer/Counter Mode Register),8位分为两组,高4位控制T1,低4位控制T0。,(1)GATE门控位 0:以TRX(X=0,1)来启动定时器/计数器运行。 1:用外中断引脚(INT0*或INT1*)上的高电平和TRX来启动定时器/计数器运行。,(2)M1、M0工作方式选择位 M1 M0 工 作 方 式 0 0 方式0,13位定时器/计数器 0 1 方式1,16位定时器/计数器 1 0 方式2,8位常数自动重新装载 1 1 方式3,仅适用于T0,T0分成两个 8位计数器,T1停止计数,(3) C/T*计数器模式或定时器模式选择位 0:

4、定时器模式。 1:计数器模式。,8.2.2 T/C的工作方式,1 方式0,13位的T/C,TL的低5位和TH的8位,满计数值为213,但启动前可以预置计数初值。,当C/T 0时,为定时器,振荡源12分频的信号作为计数脉冲。 当C/T 1时,为计数器,对外部脉冲输入端T0或T1输入的脉冲计数。,T/C启动后立即加1计数,当13位计数满时,TH向高位进位。此进位将中断溢出标志TF置1,产生中断请求,表示定时时间到或计数次数到。 若T/C开中断(ET=1)且CPU开中断(EA=1),则当CPU转向中断服务程序时,TF自动清零。,计数满时,若要进行下一次定时/计数,须用软件向TH和TL重装预置计数初值

5、。 若不置TR位0则计数不会停止。,2 方式1,与方式0的唯一区别在于计数寄存器的位数是16位,由TH和TL寄存器各提供8位,满计数值为216。,3 方式2,TLX作为常数缓冲器,当TLX计数溢出时,在溢出标志TFX置“1”的同时,还自动的将THX中的初值送至TLX,使TLX从初值开始重新计数。,定时器/计数器的方式2工作过程 (X=0,1)。,8位的可自动重装载的T/C,满计数值为28。,TH和TL当作两个8位计数器。计数过程时,TH寄存8位初值并保持不变,由TL进行8位计数。 计数过程中,除产生溢出中断请求外,还自动将TH中初值重装到TL,即重装载。,省去用户软件中重装初值的程序,精确的定

6、时。,4 方式3,增加一个附加的8位定时器/计数器,从而具有3个定时器/计数器。,只适用于定时器/计数器T0,此时TH0和TL0成为两个独立的计数器。 T1不能工作在方式3。 T1方式3时相当于TR1=0,停止计数(此时T1可用来作串行口波特率产生器)。,TL0可作定时器/计数器,占用T/C0在TCON和TMOD寄存器中的控制位和标志位;TH0只能作定时器,占用T/C1的资源TR1和TF1。此时,T/C1仍可用于方式0、1、2,但不能使用中断方式。,只有将T/C1用作串行口的波特率发生器时,T/C0才工作在方式3。,1工作方式3下的T0 T0分为两个独立的8位计数器:TL0和TH0 。 TL0

7、使用T0的状态控制位C/T*、GATE、TR0、TF0,而TH0被固定为一个8位定时器(不能作外部计数模式),并使用定时器T1的状态控制位TR1和TF1,同时占用定时器T1的中断请求源TF1。,2T0工作在方式3下T1的各种工作方式 当T1用作串行口的波特率发生器时, T0才工作在方式3。 T0处于方式3时, T1可定为方式0、方式1和方式2,用来作为串行口的波特率发生器,或不需要中断的场合。,定时器/计数器对输入信号的要求 外部计数脉冲的最高频率为系统振荡器频率的1/24,例如选用12MHz频率的晶体,则可输入500KHz的外部脉冲。 输入信号的高、低电平至少要保持一个机器周期。,8.2.3

8、 定时器/计数器的初始化,1 初始化步骤 在使用8051的定时器/计数器前,应对它进行编程初始化,主要是对TCON和TMOD编程,还需要计算和装载T/C的计数初值。一般完成以下几个步骤: (1)确定T/C的工作方式编程TMOD寄存器; (2)计算T/C中的计数初值,并装载到TH和TL; (3) T/C在中断方式工作时,需开CPU中断和源中断编程IE寄存器; (4)启动定时器/计数器编程TCON中的TR1或TR0位。,2 定时器的计数初值 在定时器方式下,T/C是对机器周期脉冲计数的,如果fosc=6MHz,一个机器周期为2us,则 方式0:13位定时器最大定时间隔2132us16.384ms;

9、 例:213*2/(106)=0.016384 方式1:16位定时器最大定时间隔2162us131.072ms; 方式2:8位定时器最大定时间隔282us512us。,若使T/C工作在方式1,fosc=6MHz,要求定时时间为1ms,求计数初值。 如设计数初值为x,则有(216x)2us1000us 或 x216500 因此 TH,TL可置为65536500=65036,3 计数器的计数初值 方式0:13位计数器的满计数值2138192; 方式1:16位计数器的满计数值21665536; 方式2:8位计数器的满计数值28256。,若使T/C工作在计数器2,则要求计数10个脉冲的计数初值。 如设

10、计数初值为x,则有28x10 即 x2810 因此 THTL25610,8.2.4 应用实例,在实时系统中,定时通常使用定时器。,与软件循环定时不同,不占用CPU,在定时器工作时可以继续执行程序。,例:设单片机的fosc=12MHz,要求在P1.0脚上输出周期为2ms的方波。 方法1:查询方式 解:使用定时器0的方式1编程。定时1ms,每次时间到时P1.0取反。 定时器计数率fosc/12,机器周期1s, 每个机器周期定时器计数加1,1ms=1000us 需计数次数1000 计数初值 65536-1000,#include sbit P1_0=P10; void main(void) TMOD

11、=0x01; /*定时器0方式1*/ TR0=1; /*启动T/C0*/ for(;) TH0=(655361000)/256; /*装载计数初值*/ TL0=(655361000)%256; do while(!TF0); /*查询等待TF0置位*/ P1_0 !P1_0 ; TF00; /*软件清TF0*/ ,方法2:中断方式,用定时器0的方式1编程。 每次中断程序电平,P1.0取反,并且重新装载计数初值。,#include sbit P1_0=P10; void timer0(void)interrupt 1 using 1 /*T/C0中断服务程序入口*/ P1_0 !P1_0 ; /

12、*P1.0取反*/ TH0=(655361000)/256; /*计数初值重装载*/ TL0=(655361000)%256 ; void main(void) TMOD=0x01; /* T/C0工作在定时器方式1* / P1_0 0; TH0=(655361000)/256; /*预置计数初值*/ TL0=(655361000)%256 ; EA=1; /*CPU开中断*/ ET01; /* T/C0开中断*/ TR01; /* 启动T/C0开始定时 */ do while(1); ,例: 在P1.7 端接有一个发光二极管,要求利用T/C控制,使LED亮1s、灭1s,周而复始。 解: 1s

13、时间长,各种定时方式不能满足,使用复合方式。 对 6MHz 方式1, 16位定时器最大定时间隔 65536 2us131.072ms。 定时100 ms,一个周期200ms,再计数5次,达到1s。 对6 MHz 方式1 定时方式需要计数次数100 1000/2=50000 ,即初值为 6553650000。 方式2 ,采用计数,初值2565。,#include sbit P1_0=P10; sbit P1_7=P17; timer0( ) interrupt 1 using 1 /*T/C0中断服务程序*/ P1_0 !P1_0 ; /*P1.0取反*/ TH0=(6553650000)/25

14、6; /*重载计数初值*/ TL0=(6553650000)%256; timer1( ) interrupt 3 using 2 /*T/C1中断服务程序*/ P1_7! P1_7 ; /*1s到,灯改变状态*/ ,main() P1_7=0; /*置灯初始灭*/ P1_0=1; /*保证第一次反相便开始计数*/ TMOD=0x61; /* T/C0方式1定时,T/C1方式2计数* / TH0=(6553650000)/256; /*预置计数初值*/ TL0=(6553650000)%256 ; TH1=256-5; TL1=256-5; IP=0x08; /*置优先级寄存器*/ EA=1;

15、 /*CPU开中断*/ ET01; /* T/C0开中断*/ ET11; /* T/C1开中断*/ TR01; /* 启动T/C0*/ TR11; /* 启动T/C1*/ for(;) ,例 采用10MHz晶振,在P1.0脚上输出周期为2.5s,占空比为20%的脉冲信号。 解:取定时器10ms,计数250次需要 2.5s。 20%需要50次。其中高电平需要50次,低电平200次。每到50次P1.0变为低电平,每到250次时P1.0变为高电平。 10ms需计数 10X1000 X10/12= 8333,#include define uchar unsigned char uchar time ; uchar

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号