版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第7章章 51单片机的定时器单片机的定时器/计数器计数器 7.1 概述概述 在单片机的控制应用中,可供选择的定时方法有:(1)软件定时软件定时:靠执行一个循环程序以进行时间延迟。特点:时间准确,且不需外加硬件电路。但占用CPU,定时的时间不宜太长。(2)硬件定时)硬件定时硬件定时:硬件定时:使用硬件电路完成时间较长的定时。使用硬件电路完成时间较长的定时。特点:特点:定时功能全部由硬件电路完成,不占定时功能全部由硬件电路完成,不占CPU时间。但需通过改变电路中的元件参数来时间。但需通过改变电路中的元件参数来调节定时时间,在使用上不够灵活方便。调节定时时间,在使用上不够灵活方便。(3)可编程定时
2、器定时)可编程定时器定时可编程定时器定时:可编程定时器定时:通过对系统时钟脉冲的计数来实现的。通过对系统时钟脉冲的计数来实现的。特点:特点:计数值通过程序设定,改变计数值,也就计数值通过程序设定,改变计数值,也就改变了定时时间,灵活、方便。改变了定时时间,灵活、方便。51单片机采用的是可编程定时器定时方法。单片机采用的是可编程定时器定时方法。 7.2 定时器定时器/计数器的结构计数器的结构 51单片机有单片机有两个两个16位内部定时器位内部定时器/计数器计数器(C/ ),定时器),定时器/计数器计数器T0由特殊功能寄存器由特殊功能寄存器TH0、TL0构成,定时器构成,定时器/计数器计数器T1由
3、特殊功能由特殊功能寄存器寄存器TH1、TL1构成。构成。 两个定时器两个定时器/计数器既可以编程作为计数器既可以编程作为定时器定时器使用,也可以编程作为使用,也可以编程作为计数器计数器使用,并且有使用,并且有4种工作方式种工作方式(方式(方式0、方式、方式1、方式、方式2、方式、方式3)。定时器。定时器/计数器属于计数器属于增增1计数器计数器。 T 7.2 定时器定时器/计数器的结构计数器的结构 7.2 定时器定时器/计数器的结构计数器的结构 特殊功能寄存器特殊功能寄存器TMOD用于设定定时用于设定定时/计数计数器器T0、T1的的工作模式和工作方式工作模式和工作方式。特殊功能寄。特殊功能寄存器
4、存器TCON用于控制用于控制T0、T1的的启动和停止启动和停止计数,计数,同时包含了同时包含了T0、T1的的状态状态。 计数器的计数都是从计数器的初值开始。计数器的计数都是从计数器的初值开始。单片机复位时计数器的初值为单片机复位时计数器的初值为0,也可用软件,也可用软件给计数器装入一个新的初值。定时给计数器装入一个新的初值。定时/计数器工作计数器工作时,不占用时,不占用CPU的时间。的时间。 7.2 定时器定时器/计数器的结构计数器的结构 T0、T1不论是工作在定时器模式还是计数不论是工作在定时器模式还是计数器模式,器模式,实质都是对脉冲信号进行计数实质都是对脉冲信号进行计数,只不,只不过是计
5、数信号的过是计数信号的来源不同来源不同。计数器模式是对加。计数器模式是对加在在T0(P3.4)和)和T1(P3.5)两个引脚上的)两个引脚上的外部外部脉冲脉冲进行计数,而定时器工作模式是对单片机进行计数,而定时器工作模式是对单片机的时钟振荡器信号经片内的时钟振荡器信号经片内12分频后的分频后的内部脉冲内部脉冲信号计数。由于时钟频率是定值,所以可根据信号计数。由于时钟频率是定值,所以可根据对内部脉冲信号的计数值可计算出定时时间。对内部脉冲信号的计数值可计算出定时时间。7.2.1 工作方式控制寄存器工作方式控制寄存器TMODM0M0M1M1C/TC/TGATEGATEM0M0M1M1C/TC/TG
6、ATEGATE D7 D6 D5 D4 D3 D2 D1 D0D7 D6 D5 D4 D3 D2 D1 D0T1T1方式字方式字段段T0T0方式字段方式字段1.1.门控位门控位-GATE:-GATE: GATE=0: GATE=0:用运行控制位用运行控制位TR0/TR1TR0/TR1启动启动T0/T1T0/T1。 GATE=1:GATE=1:用引脚用引脚INT0/INT1INT0/INT1的高电平启动的高电平启动T0/T1T0/T1。 TMOD用于选择定时用于选择定时/计数器的工作模式计数器的工作模式和工作方式,字节地址为和工作方式,字节地址为89H,不能位寻址,不能位寻址。TMOD的的格式格
7、式如下:如下:7.2.1 工作方式控制寄存器工作方式控制寄存器TMODM0M0M1M1C/TC/TGATEGATEM0M0M1M1C/TC/TGATEGATE D7 D6 D5 D4 D3 D2 D1 D0D7 D6 D5 D4 D3 D2 D1 D0T1T1方式字方式字段段T0T0方式字段方式字段2.2.计数和定时选择位计数和定时选择位-C/T:-C/T: C/T=0: C/T=0:为定时器模式。为定时器模式。 C/T=1:C/T=1:为计数器模式为计数器模式, ,对引脚对引脚T0/T1T0/T1的输入的脉的输入的脉 冲(下降沿)计数。冲(下降沿)计数。 定时器工作模式时,计数用输入信号是内
8、部时钟定时器工作模式时,计数用输入信号是内部时钟脉冲,每个机器周期使寄存器的值增脉冲,每个机器周期使寄存器的值增1 1。每个机器周。每个机器周期等于期等于1212个振荡周期,故计数速率为振荡周期的个振荡周期,故计数速率为振荡周期的1/121/12。当采用。当采用12MHz12MHz的晶体时,计数速率为的晶体时,计数速率为1MHz1MHz,时间间,时间间隔隔1S1S。定时器的定时时间,与系统的振荡频率。定时器的定时时间,与系统的振荡频率foscfosc、计数器的长度和初始值等有关。、计数器的长度和初始值等有关。 7.2.1 工作方式控制寄存器工作方式控制寄存器TMODM0M0M1M1C/TC/T
9、GATEGATEM0M0M1M1C/TC/TGATEGATE D7 D6 D5 D4 D3 D2 D1 D0D7 D6 D5 D4 D3 D2 D1 D0T1T1方式字方式字段段T0T0方式字段方式字段3. M13. M1、M0M0:工作方式选择位。:工作方式选择位。M1M1和和M0M0两位有四种编码,可以有四种工作方式,两位有四种编码,可以有四种工作方式,如表所示。如表所示。M1 M0工作方式工作方式功能说明功能说明0 0方式方式013位定时器位定时器/计数器计数器0 1方式方式116位定时器位定时器/计数器计数器1 0方式方式2自动重装载的自动重装载的8位定时器位定时器/计数器计数器1 1
10、方式方式3T0分为两个分为两个8位定时器位定时器/计数器,计数器,T1停止计数停止计数位地址位地址8FH8FH8EH8EH 8DH8DH 8CH8CH 8BH8BH 8AH8AH 89H89H 88H88H位符号位符号TF1TF1TR1TR1 TF0TF0 TR0TR0 IE1IE1 IT1IT1 IE0IE0 IT0IT0 7.2.2 控制寄存器控制寄存器TCON1.1.计数溢出标志位计数溢出标志位-TF1-TF1、TF0:TF0: 当计数器计数溢出时,该位置当计数器计数溢出时,该位置1 1 使用中断方式时,为中断请求标志位使用中断方式时,为中断请求标志位 控制寄存器控制寄存器TCON的字节
11、地址为的字节地址为88H,可以位,可以位寻址,位地址为寻址,位地址为88H8FH。其。其格式格式如下:如下: 2.2.计数运行控制位计数运行控制位-TR1-TR1、TR0:TR0: TR1(TR0)TR1(TR0)=1:=1:启动定时器启动定时器/ /计数器工作计数器工作 TR1(TR0)=0TR1(TR0)=0: :停止定时器停止定时器/ /计数器工作计数器工作复位后,复位后,TCON的所有位均清的所有位均清0,T0和和T1均是停止的。均是停止的。7.3 定时器定时器/计数器的工作方式计数器的工作方式 根据对TMOD寄存器中M1和M0的设定,T0可选择四种不同的工作方式,而T1只具有三种工作
12、方式(即方式0、方式1和方式2)。 7.3.1 方式方式0 定时器定时器/ /计数器工作在方式计数器工作在方式0 (M1M0=00)0 (M1M0=00)时时, ,为为1313位计数器。其逻辑结构图如图:位计数器。其逻辑结构图如图:( (以以T1T1为例为例) )振荡器振荡器12TL15位位TH18位位TF111T1T1(P3.5P3.5引脚引脚) )TR1TR1GATEGATEINT1INT1A AB BC/T=0C/T=0C/T=1C/T=1控制端控制端中中断断计数器计数器计数溢出计数溢出标志位标志位GATE=0,A=1,B=(A)(TR1)=TR1,GATE=0,A=1,B=(A)(TR
13、1)=TR1,计数器仅计数器仅TR1TR1控制控制. .GATE=1,A=INT1,GATE=1,A=INT1,计数器由计数器由TR1TR1和和INT1INT1共同控制共同控制. .计数器清零计数器清零 定时器定时器/ /计数器工作在方式计数器工作在方式1 (M1M0=01)1 (M1M0=01)时时, ,为为1616位计数器。其逻辑结构图如图:位计数器。其逻辑结构图如图:( (以以T1T1为例为例) )振荡器振荡器12TL18位位TH18位位TF111T1T1(P3.5P3.5引脚引脚) )TR1TR1GATEGATEINT1INT1A AB BC/T=0C/T=0C/T=1C/T=1控制端
14、控制端中中断断计数器计数器165536(216)/ 65.54ms计数溢出计数溢出标志位标志位GATE=0,A=1,B=(A)(TR1)=TR1,GATE=0,A=1,B=(A)(TR1)=TR1,计数器仅计数器仅TR1TR1控制控制. .GATE=1,A=INT1,GATE=1,A=INT1,计数器由计数器由TR1TR1和和INT1INT1共同控制共同控制. .计数器清零计数器清零 7.3.2 方式方式1 定时器定时器/ /计数器工作在方式计数器工作在方式2 (M1M0=10)2 (M1M0=10)时时, ,为为8 8位自动恢复初值的计数器。其逻辑结构图见下图:位自动恢复初值的计数器。其逻辑
15、结构图见下图:振荡器振荡器12TL18位位TH1初值初值TF111T1T1(P3.5P3.5引脚引脚) )TR1TR1GATEGATEINT1INT1A AB BC/T=0C/T=0C/T=1C/T=1控制端控制端中中断断计数器计数器(1-256(1-256)计数溢出计数溢出标志位标志位计数器不清零计数器不清零TH1TH1装计数器初值,当装计数器初值,当TL1TL1溢出时:(溢出时:(TH1TH1) (TL1TL1) 7.3.3 方式方式2 方式方式3 (3 (M1M0=11M1M0=11) ) T0T0为为2 2个独立个独立8 8位定时位定时/ /计数器,计数器,T1T1为为1 1个独立定时
16、个独立定时/ /计数器,共计计数器,共计3 3个定时个定时/ /计数器。但计数器。但T1T1不能工作在方式不能工作在方式3 3(TR1=0TR1=0,停止计数),停止计数),T0T0逻辑结构见下图:逻辑结构见下图:振荡器振荡器12TL08位位TF011T0T0(P3.4P3.4引脚引脚) )TR0TR0GATEGATEINT0INT0A AB BC/T=0C/T=0C/T=1C/T=1控制端控制端中中断断计数器计数器计数溢出计数溢出标志位标志位1.T0-TL01.T0-TL0做做8 8位定时位定时/ /计数器计数器 7.3.4 方式方式32.T0-TH02.T0-TH0做做8 8位定时器位定时
17、器振荡器振荡器12TH08位位TF1TR1TR1控制端控制端中中断断定时器定时器计数溢出计数溢出标志位标志位 一般情况下,当一般情况下,当T1T1做串行口的波特率发生器时,做串行口的波特率发生器时,T0T0工作在方式工作在方式3 3, T1T1可设定为方式可设定为方式0 0、方式、方式1 1和方和方式式2 2三种形式。三种形式。 7.3.4 方式方式3工作方式工作方式3 3下的定时器下的定时器/ /计数器计数器T1T1T0T0方式方式3 3时,时,T1T1的结构如图所示,的结构如图所示,T1T1只可选方只可选方式式0 0、1 1或或2 2。 7.3.4 方式方式3由于此时计数溢出标志位由于此时
18、计数溢出标志位TF1TF1已被已被TH0TH0所占用,所占用,所以所以T1T1仅能作为波特率发生器或其它不用中断仅能作为波特率发生器或其它不用中断的地方。的地方。 作串行口波特率发生器时,作串行口波特率发生器时,T1的计数输出直接去串的计数输出直接去串行口,只需设置好工作方式,串行口波特率发生器自行口,只需设置好工作方式,串行口波特率发生器自动开始运行,如要其停止工作,只需向动开始运行,如要其停止工作,只需向T1送一个设送一个设为工作方式为工作方式3的控制字即可。的控制字即可。7.4 定时器定时器/计数器的应用编程计数器的应用编程T1. 定时器定时器/计数器的初始化计数器的初始化 使用定时器使
19、用定时器/计数器前要对定时器计数器前要对定时器/计数器进计数器进行初始化设定,也就是对行初始化设定,也就是对TCON和和TMOD进行进行设置。一般要完成以下步骤:设置。一般要完成以下步骤:(1)设定)设定TMOD选择选择C/T工作方式。工作方式。(2)计算)计算C/T 中的计数初值,并装入中的计数初值,并装入TH和和TL。(3)选择)选择C/T 溢出判断方式,查询或中断方式。溢出判断方式,查询或中断方式。如选择中断方式,需对中断控制寄存器如选择中断方式,需对中断控制寄存器IE编程。编程。(4)启动)启动C/T,置位置位TCON中的中的TR0或或TR1位。位。7.4 定时器定时器/计数器的应用编
20、程计数器的应用编程T2. 定时器定时器/计数器的初值计算计数器的初值计算 51单片机的单片机的C/T是增是增1计数器,计数器,C/T的计数的计数都是从计数器的初值开始的,单片机复位时都是从计数器的初值开始的,单片机复位时TH和和TL都被清零。所以为了准确计数或定时,都都被清零。所以为了准确计数或定时,都要给要给TH和和TL赋初值。经过计算得到的初值转赋初值。经过计算得到的初值转换成十六进制数后,分高换成十六进制数后,分高8位和低位和低8位,分别送位,分别送入入TH和和TL中。中。7.4 定时器定时器/计数器的应用编程计数器的应用编程T2. 定时器定时器/计数器的初值计算计数器的初值计算(1)定
21、时器的计数初值)定时器的计数初值 在定时器方式下,在定时器方式下,C/T是对机器周期计数,是对机器周期计数,机器周期机器周期12/fosc。如果。如果fosc12MHz,一,一个机器周期为个机器周期为1s,则:,则:方式方式0:13位定时器的最大定时时间位定时器的最大定时时间2131s 8.192ms方式方式1:16位定时器的最大定时时间位定时器的最大定时时间2161s 65.536ms方式方式2:8位定时器的最大定时时间位定时器的最大定时时间281s 256s7.4 定时器定时器/计数器的应用编程计数器的应用编程如如选择方式选择方式1,设定时时间为,设定时时间为Tx,对应初值为,对应初值为X
22、,则有:则有: (216-X)12/fosc Tx X(21612/foscTx)/12/fosc要要注意注意的是:的是:Tx不能超过所选定时方式的最大不能超过所选定时方式的最大定时时间,计算时要保证量纲的一致。定时时间,计算时要保证量纲的一致。7.4 定时器定时器/计数器的应用编程计数器的应用编程T2. 定时器定时器/计数器的初值计算计数器的初值计算(2) 计数器的计数初值计数器的计数初值 在计数器方式下各种工作方式的最大计数值如下:在计数器方式下各种工作方式的最大计数值如下:方式方式0:13位计数器的满计数值位计数器的满计数值2138 192方式方式1:16位计数器的满计数值位计数器的满计
23、数值21665 536方式方式1:8位计数器的满计数值位计数器的满计数值28256 如如选择方式选择方式1,设要计数的脉冲个数为,设要计数的脉冲个数为Fx,对应,对应的初值为的初值为X,则有:,则有: 216-X Fx 即即 X216- Fx 7.4.1 定时器的应用定时器的应用例例7-1:要求在要求在 P1.0引脚上产生周期为引脚上产生周期为2ms的的方波输出。方波输出。 已知晶体振荡器的频率为已知晶体振荡器的频率为fosc=12MHz。解:解:根据题意,在根据题意,在P1.0引脚上输出的波形如图引脚上输出的波形如图所示。从图可以看出,只要每隔所示。从图可以看出,只要每隔1ms使使P1.0的
24、的状态改变一次,就可得到所要求的波形。为此状态改变一次,就可得到所要求的波形。为此使用使用T0作定时器,采用方式作定时器,采用方式1,设定,设定 lms定时,定时,每隔每隔1ms使使P1.0引脚上的电平取反。引脚上的电平取反。1234ABCD4321DCBATitleNumberR evisio nSizeA4Date:31 -Jan -2 013Sh eet of File:F:单片机教材编写上篇编书原理图.DdbDrawn B y:1mS1mS2mS 7.4.1 定时器的应用定时器的应用计算初值:计算初值:由:由: X(21612/foscTx)/12/fosc此题此题Tx1ms, fos
25、c12MHz;可得:;可得:X(2161s1000s)/1s64536转换成十六进制:转换成十六进制:XFC18H(1)用查询方式编程)用查询方式编程#include/包含包含51单片机寄存器定义的头文件单片机寄存器定义的头文件sbit P10=P10;/将将P10定义为定义为P1.0/*函数功能:主函数函数功能:主函数*/void main(void)TMOD=0 x01;/TMOD=0000 0001B,使用定时器,使用定时器T0的方式的方式1TH0=0 xFC;/定时器定时器T0的高的高8位赋初值位赋初值TL0=0 x18;/定时器定时器T0的低的低8位赋初值位赋初值TR0=1;/启动定
26、时器启动定时器T0while(1)/无限循环,无限循环,TF01等待等待if(TF0=1)/T0溢出判断溢出判断TH0=0 xFC;/重新赋计数初值重新赋计数初值TL0=0 x18;TF0=0;/软件清除溢出标志软件清除溢出标志P10=P10;/P1.0取反取反(2)用中断方式编程)用中断方式编程#include/包含包含51单片机寄存器定义的头文件单片机寄存器定义的头文件sbit P10=P10;/将将P10定义为定义为P1.0/*函数功能:定时器函数功能:定时器T0的中断服务程序的中断服务程序*/void Time0()() interrupt 1 using 0 /“interrupt”
27、声明函数为中断服务函数声明函数为中断服务函数TH0=0 xFC;/重新赋计数初值重新赋计数初值TL0=0 x18;P10=P10;/将将P1.0引脚输出电平取反,产生方波引脚输出电平取反,产生方波/*函数功能:主函数函数功能:主函数*/void main(void)TMOD=0 x01;/TMOD=0000 0001B,使用定时器,使用定时器T0的方式的方式1EA=1;/开总中断开总中断ET0=1;/定时器定时器T0中断允许中断允许 TH0=0 xFC ;/定时器定时器T0的高的高8位赋初值位赋初值TL0=0 x18;/定时器定时器T0的低的低8位赋初值位赋初值TR0=1;/启动定时器启动定时
28、器T0while(1););/无限循环,等待中断无限循环,等待中断 7.4.1 定时器的应用定时器的应用例例7-2:用用T0定时定时1秒,使接在秒,使接在P1口上的口上的8个个LED轮流点亮。电路如图所示。轮流点亮。电路如图所示。 已知晶体振荡器的频率为已知晶体振荡器的频率为fosc=12MHz。1234ABCD4321DCBATitleN umberR evisio nSizeA 4D ate:27 -Jan -2 013Sh eet of File:F:电路图集单片机编书图201 1键盘显示.D D BD raw n B y:LED0LED2LED3LED4LED5LED6LED7LED1
29、510510510510510510510510V CC51单片机P10P11P12P13P14P15P16P17 7.4.1 定时器的应用定时器的应用解:解:题意分析:题意分析:T0的的4种工作方式,在种工作方式,在fosc=12MHz的情况下,最长定时时间为的情况下,最长定时时间为65.536ms,远远达不到,远远达不到1秒。因此只能用秒。因此只能用计数计数中断次数中断次数的方法实现长时间定时。把定时器的的方法实现长时间定时。把定时器的定时时间定为定时时间定为50ms,每每50ms中断一次,计数中断一次,计数中断中断20次为次为1秒。秒。1秒钟到改变秒钟到改变P1口的状态。这口的状态。这种
30、方式计时不是十分准确,差几十微秒,可满种方式计时不是十分准确,差几十微秒,可满足一般要求。足一般要求。#include/包含单片机寄存器的头文件包含单片机寄存器的头文件#define uchar unsigned charuchar Countor;/设置全局变量,储存定时器设置全局变量,储存定时器T0中断次数中断次数uchar i=0;/LED显示位置计数显示位置计数uchar idata led8= 0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f ;/*函数功能:定时器函数功能:定时器T0的中断服务程序的中断服务程序*/void Time0(
31、)() interrupt 1 using 0 /“interrupt”声明函数为中断服务函数声明函数为中断服务函数TH0=(65536-50000)/256; /定时器定时器T0的高的高8位重新赋初值位重新赋初值TL0=(65536-50000)%256;/定时器定时器T0的低的低8位重新赋初值位重新赋初值Countor+;/中断次数自加中断次数自加1if(Countor=20)/若累计满若累计满20次,即计时满次,即计时满1sCountor=0;/将将Countor清清0,重新从,重新从0开始计数开始计数P1=ledi;/输出输出P1口状态口状态i+;if(i=8)i=0;/i=8重新循环
32、重新循环/*函数功能:主函数函数功能:主函数*/void main(void)TMOD=0 x01;/使用定时器使用定时器T0的方式的方式1EA=1;/开总中断开总中断ET0=1;/定时器定时器T0中断允许中断允许 TH0=(65536-50000)/256;/定时器定时器T0的高的高8位赋初值位赋初值TL0=(65536-50000)%256;/定时器定时器T0的低的低8位赋初值位赋初值TR0=1;/启动定时器启动定时器T0Countor=0;/从从0开始累计中断次数开始累计中断次数while(1););/无限循环等待中断无限循环等待中断例例7-3:如图是数码管动态显示电路,我们曾在第五章如
33、图是数码管动态显示电路,我们曾在第五章编写了该电路的显示函数,但那个函数有个无法克服编写了该电路的显示函数,但那个函数有个无法克服的缺陷,就是要在一定的时间内必须调用,否则就会的缺陷,就是要在一定的时间内必须调用,否则就会出现闪烁现象,这在实际应用中,会带来许多不便。出现闪烁现象,这在实际应用中,会带来许多不便。1234ABCD4321DCBATitleNumberR evisio nSizeA4Date:10 -Mar-201 3Sh eet of File:F:单片机教材编写上篇编书原理图编书原理图.DdbDrawn B y:abfcgdeabcdefgdpdpabfcgdeabcdefg
34、dpdpabfcgdeabcdefgdpdpabfcgdeabcdefgdpdpP00P01P02P03P04P05P06P07P27P26P25P24+5V220*84K7*49012*4DS1DS2DS3DS451单片机现在我们用定时器中断,编写一个动态显示函数。显现在我们用定时器中断,编写一个动态显示函数。显示示6、7、8、9。设。设T0为工作方式为工作方式1、定时时间、定时时间4mS,每次中断显示一位(每次中断显示一位(fosc=12MHz)。)。#include/ 包含包含51单片机寄存器定义的头文件单片机寄存器定义的头文件#include/包含随机函数包含随机函数rand()的定义
35、文件()的定义文件#define uint unsigned int#define uchar unsigned charuchar i;/记录显示位置记录显示位置uchar code dtab10=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90; /数码管显示数码管显示09的段码表的段码表uchar code selec4=0 xfe,0 xfd,0 xfb,0 xf7;/动态显示位选码表动态显示位选码表uchar disp4;void Time0(void) interrupt 1 /interrupt声明函数为中断服
36、务函数声明函数为中断服务函数TH0=(65536-4000)/256;/定时器定时器T0的高的高8位重新赋初值,位重新赋初值, /4mS=4000S。TL0=(65536-4000)%256;/定时器定时器T0的低的低8位重新赋初值位重新赋初值P2=0 xff; /全灭全灭P0=dtabdispi;/查段码送查段码送P0口口P2=seleci;/送位码送位码if(+i3) i=0;void main(void)TMOD=0 x01;/使用定时器使用定时器T0的方式的方式1EA=1;/开总中断开总中断ET0=1;/定时器定时器T0中断允许中断允许 TH0=(65536-4000)/256;/定时
37、器定时器T0的高的高8位赋初值,位赋初值,/4mS=4000S。TL0=(65536-4000)%256;/定时器定时器T0的低的低8位赋初值位赋初值TR0=1;/启动定时器启动定时器T0while(1)/无限循环等待中断无限循环等待中断disp0=6;disp1=7;disp2=8;disp3=9; 程序运行时,可以改变定时时间,如把初值改称程序运行时,可以改变定时时间,如把初值改称10ms(10000)试试,再改成其它值。自己总结出现的现象。试试,再改成其它值。自己总结出现的现象。例例7.4 实时时钟的设计实时时钟的设计介绍使用定时器/计数器实现时钟。用定时器实现分、秒时钟计时,并用动态显
38、示电路显示。其中:用DS2、DS1显示秒计时,用DS4、DS3显示分计时。实现实时时钟的基本思想实现实时时钟的基本思想本题最小计时单位是秒秒,如何获得1s的定时时间的定时时间呢?动态显示的定时时间是4mS,计数250次为一秒。对秒计数,60次为分。设计数变量:countor设分变量:min秒变量:sec#include/ 包含包含51单片机寄存器定义的头单片机寄存器定义的头 文件文件#define uint unsigned int#define uchar unsigned charuchar i; /记录显示位置记录显示位置uchar code dtab10=0 xc0,0 xf9,0 x
39、a4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90; /数码管显示数码管显示09的段码表的段码表uchar code selec4=0 xfe,0 xfd,0 xfb,0 xf7; /动态显示位选码表动态显示位选码表uchar disp4;uchar countor=0;uchar sec=0;uchar min=0;void Time0(void) interrupt 1 /interrupt声明函数为中断服务函声明函数为中断服务函数数 TH0=(65536-4000)/256;/定时器定时器T0的高的高8位重新赋初位重新赋初值,值, /4mS=4000
40、S。 TL0=(65536-4000)%256;/定时器定时器T0的低的低8位重新赋初位重新赋初值值 P2=0 xff; /全灭全灭 P0=dtabdispi;/查段码送查段码送P0口口 P2=seleci;/送位码送位码 if(+i3) i=0; Countor+;/中断次数自加中断次数自加1 if(Countor=250)/若累计满若累计满20次,即计时满次,即计时满1s Countor=0; /将将Countor清清0,重新从,重新从0开始计数开始计数 sec+; if(sec59) sec=0; min+; if(min59) min=0; void main(void)TMOD=0
41、x01;/使用定时器使用定时器T0的方式的方式1EA=1;/开总中断开总中断ET0=1;/定时器定时器T0中断允许中断允许 TH0=(65536-4000)/256;/定时器定时器T0的高的高8位赋初值,位赋初值,/4mS=4000S。TL0=(65536-4000)%256; /定时器定时器T0的低的低8位赋初值位赋初值TR0=1;/启动定时器启动定时器T0while(1)/无限循环等待中断无限循环等待中断disp0=min/10;disp1=min%10;disp2=sec/10;disp3=sec%10; 例7.5 门控制位门控制位GATEx的应用的应用测量脉冲宽度测量脉冲宽度介绍门控制
42、位GATE的具体应用,测量 INT1(P3.3)引脚上正脉冲的宽度。【例例6-7】 门控位GATE1可使T1的启动计数受 INT1 的控制,当GATE1 = 1,TR1=1时,时,只有只有 INT1引脚引脚输入高电平时输入高电平时,T1才被允许计数才被允许计数。可测量 引脚 INT1 (P3.3)上正脉冲的宽度。其方法如图下图下所示所示。#include / 包含包含51单片机寄存器定义的头文件单片机寄存器定义的头文件#define uint unsigned int#define uchar unsigned charSbit p33=P33; / INT1sbit DAT=P16;sbit
43、 CLK=P17;uchar i; /记录显示位置记录显示位置uchar code dtab10=0 x03,0 x9f,0 x25,0 x0d,0 x99,0 x49,0 x41,0 x1f,0 x01,0 x09; /数码管显示数码管显示09的段码表的段码表uchar disp4;void disp_164()()/显示函数显示函数 uchar x,i,j; for(i=0;i4;i+) /循环循环4次(次(4个数码管)个数码管) x= dtabdispi;/查表取段码查表取段码 for(j=0;j=1; CLK=0; void mainvoid main(voidvoid) uint t
44、t=0; uint tt=0; TMOD=0 x90 TMOD=0 x90; /1001 0000/1001 0000使用定时器使用定时器T0T0的方式的方式1 1 while while(1 1) TH1=0 x00;/定时器定时器T0的高的高8位赋初值,位赋初值, TL1=0 x00; /定时器定时器T0的低的低8位赋初值位赋初值 while(p33=1) while(p33=1); /等待等待p3.3p3.3变低变低 TR1=1 TR1=1; /启动启动T1T1 while(p33=0) while(p33=0); /等等p3.3p3.3升高升高 while(p33=1) /while(
45、p33=1) /等等p3.3p3.3变低变低 tt=TH1 tt=TH1* *256+TL1256+TL1; disp3=tt/1000;disp3=tt/1000; disp2=(tt%1000)/100; disp2=(tt%1000)/100; disp1=(tt%1000)/100)/10; disp1=(tt%1000)/100)/10; disp0= disp0=(tt%1000)/100)%10; disp_164()(); 指针的基本概念:指针的基本概念:在计算机中,所有的数据都是存放在存在计算机中,所有的数据都是存放在存储器中的。储器中的。 一般把存储器中的一个字节称为一个内
46、存单元,一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占个单元,字符量占1个单元等。为了正确地访问这些内存个单元等。为了正确地访问这些内存单元,必须为每个内存单元编上号。根据一个内存单元的单元,必须为每个内存单元编上号。根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做编号即可准确地找到该内存单元。内存单元的编号也叫做地址,所谓变量的地址即它们所占连续的内存单元的最低地址,所谓变量的地址即它们所占连续的内存单元的最低字节单元的地址。既然根据内存单元的编号或地址就可以字节
47、单元的地址。既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针。找到所需的内存单元,所以通常也把这个地址称为指针。内存单元的指针和内存单元的内容是两个不同的内存单元的指针和内存单元的内容是两个不同的概念。概念。 7.5 指针指针7.5.1 指针的概念指针的概念在在C语言中,允许用一个变量来存放指针,这种变量称语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,指针变量是一种特殊的变量,特为指针变量。因此,指针变量是一种特殊的变量,特殊在它只能存放地址值,一个指针变量的值就是某个殊在它只能存放地址值,一个指针变量的值就是某个内存单元的地址或称为某内存单元
48、的指针。内存单元的地址或称为某内存单元的指针。如:char ch1=23; 变量ch1的地址为2003H单元地址ch1的单元2003H23ch1的值如:long h=0 x12345678;变量h的地址为200A。单元地址h的单元200AH78h的值200BH56200CH34200DH12指针变量的定义的一般形式:指针变量的定义的一般形式:类型说明符类型说明符 *指针变量名;指针变量名;其中:类型说明符指定该指针变量中只能存其中:类型说明符指定该指针变量中只能存放这种类型变量的地址;放这种类型变量的地址;*号说明这个变量是号说明这个变量是指针变量。指针变量。如:如:int *a;float
49、*b;7.5.2 指针变量的运算指针变量的运算1. 取地址运算符取地址运算符“&”取地址运算符取地址运算符“&”是单目运算符,其结合性为自右至左,其是单目运算符,其结合性为自右至左,其功能是取变量的地址。功能是取变量的地址。其一般形式为:其一般形式为:“&”变量名;变量名;如:如:&a表示变量表示变量a的地址,的地址,&b表示变量表示变量b的地址,变量本身的地址,变量本身必须预先说明。可以通过取地址运算符和指针运算符使指针必须预先说明。可以通过取地址运算符和指针运算符使指针变量与变量建立某种联系变量与变量建立某种联系如:如:int a,*pointer,b; pointer=&a /*指针变量
50、指针变量pointer指向变量指向变量a*/对指针变量,只能把一个变量的地址赋给它,而不能赋给它对指针变量,只能把一个变量的地址赋给它,而不能赋给它一个数值。一个数值。如:如:pointer=100;是非法的;是非法的。但有一个值可以赋给指针变。但有一个值可以赋给指针变量,记为量,记为NULL(空指针),它的值是(空指针),它的值是0。pointer=NULL;是合法的,意思是是合法的,意思是pointer指向地址为指向地址为0的单元。的单元。2. 取内容运算符取内容运算符“*” 取内容运算符取内容运算符“*”是单目运算符,其结合性为自右是单目运算符,其结合性为自右至左,用来表示指针变量所指的
51、变量。在至左,用来表示指针变量所指的变量。在“*”运算符运算符之后跟的变量必须是指针变量。之后跟的变量必须是指针变量。 需要注意的是指针运算符需要注意的是指针运算符“*”和指针变量说明中的和指针变量说明中的指针说明符指针说明符“*”不是一回事。不是一回事。 在在指针变量说明指针变量说明中,中,“*”是类型说明符,表示其后是类型说明符,表示其后的变量是指针类型。的变量是指针类型。 而而表达式表达式中出现的中出现的“*”则是一个运算符,用以表示则是一个运算符,用以表示指针变量所指的变量。指针变量所指的变量。 如:如:pointer=&a;/*把整型变量把整型变量a的地址赋予整的地址赋予整 型指针变
52、量型指针变量pointer */ b=*pointer; /b=a;如:如:pointer=&a;/*把整型变量把整型变量a的地址赋予的地址赋予整整 型指针变量型指针变量pointer */ b=*pointer; /b=a; 通过对指针变量取指向运算使用变量的值称为间通过对指针变量取指向运算使用变量的值称为间接寻址。接寻址。 即指针变量即指针变量pointer的值的值为为a的地址,先由的地址,先由pointer得到得到a的地址,再从该地址单元中取出的地址,再从该地址单元中取出a的值赋给变量的值赋给变量b。“&”和和“*”都是单目运算符,优先级相同,都是单目运算符,优先级相同,且其且其结合顺序是自右至左的。结合顺序是自右至左的。 如:如:*pointer+等价于等价于*(pointer+)而不是)而不是(*pointer)+。7.5.3 指针和一维数组指针和一维数组1. 一维数组的地址一维数组的地址一维数组在内存中的存放:从下标为0的元素开始,连续存放。下标为0的元素的地址即为整个数组的地址。数组a的地址为a0的地址=200AH。如:int a4=0 x5678,0 x1234,0 x9876,0 x5432;单元地址单元200AH78a0的值200BH56200CH34a1的值200DH12200EH76a2的值200FH982010H32a3的值2011H542.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025山东枣庄市薛城区殡葬事务服务中心招聘劳务派遣人员考察人员笔试历年难易错考点试卷带答案解析
- 2025安徽衡安建设工程有限公司第一批社会招聘专业技术人员拟录用笔试历年常考点试题专练附带答案详解
- 2025安徽科技大市场建设运营有限责任公司项目经理岗位招聘笔试及笔试相关工作事宜笔试历年备考题库附带答案详解
- 医学牙科影像学考试试题及答案
- 锅炉房建设与热力设备安装方案
- 2026广东珠海市博爱幼教集团翠珠园区实习教师招聘1人考试备考试题及答案解析
- 2025四川九洲投资控股集团有限公司软件与数据智能军团招聘开发工程师(模型)测试笔试历年难易错考点试卷带答案解析
- 2025四川九州电子科技股份有限公司招聘战略采购等岗位测试笔试历年常考点试题专练附带答案详解
- 2025下半年安徽安庆市同庆矿业投资有限公司下属子公司招聘工作人员笔试历年常考点试题专练附带答案详解
- 基于剪纸对称图形的小学数学差异化教学策略研究教学研究课题报告
- 2025至2030中国农业无人机市场供需格局及政策导向深度研究报告
- 2025年江西生物科技职业学院单招职业技能考试题库附答案解析
- VDA 19.1 装配技术清洁度检测培训课件
- NLRP3炎症小体激活与细胞焦亡的信号关联
- 汽车起动机课件
- 2025-2026秋期末考试质量分析报告:剖析考试数据查找薄弱环节优化教学策略促提升
- 2025年华电校招要笔试及答案
- 2025年湖北襄阳特长生自主招生数学试卷真题(含答案详解)
- 南瑞集团在线测评试题
- 学校德育活动评估标准体系
- 社保局内控管理规范制度
评论
0/150
提交评论