单片机原理和应用-KFIL C项目教程项目六 99 s倒计时ppt课件_第1页
单片机原理和应用-KFIL C项目教程项目六 99 s倒计时ppt课件_第2页
单片机原理和应用-KFIL C项目教程项目六 99 s倒计时ppt课件_第3页
单片机原理和应用-KFIL C项目教程项目六 99 s倒计时ppt课件_第4页
单片机原理和应用-KFIL C项目教程项目六 99 s倒计时ppt课件_第5页
已阅读5页,还剩86页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、项目六 99 s倒计时 项目六 99 s倒计时 6.1 项目说明项目说明 6.2 基础知识基础知识 6.3 项目实施项目实施 6.4 项目评价项目评价 6.5 拓展与提高拓展与提高 项目六 99 s倒计时 6.1 项项 目目 说说 明明 项目任务项目任务利用利用51单片机内部的定时单片机内部的定时/计数器设计计数器设计99 s倒计时控制电路。倒计时控制电路。 知识培养目标知识培养目标(1) 掌握掌握51单片机中断系统的组成及应用。单片机中断系统的组成及应用。(2) 掌握掌握51单片机定时单片机定时/计数器的结构以计数器的结构以及方式及方式1和方式和方式2的应用。的应用。(3) 掌握掌握51单片

2、机定时单片机定时/计数器初值的计计数器初值的计算,并对其初始化。算,并对其初始化。(4) 掌握掌握51单片机中断系统、定时单片机中断系统、定时/计数计数器的综合应用。器的综合应用。项目六 99 s倒计时 能力培养目标(1) 能利用所学知识正确地理解中断、定时/计数器的结构。(2) 能利用所学知识编写中断、定时/计数器综合应用程序。(3) 能利用所学知识解决实际工程问题。项目六 99 s倒计时 6.2 基 础 知 识6.2.1 定时/计数器概述51单片机内部有两个互相独立的16位可编程定时/计数器:T0(P3.4)和T1(P3.5),52单片机内部多一个T2定时/计数器。每个定时/计数器有定时和

3、计数两种功能。需要注意的是定时/计数器虽集成在51单片机内部,但它是51单片机内一个独立的硬件部分,CPU将它启动后,就可以做其他工作,定时/计数器会自动开始计数,计满后,向CPU申请中断, 由CPU安排定时/计数器下一步做什么。定时/计数器与CPU的关系就如同闹钟与人的关系一样。项目六 99 s倒计时 1. 本质本质定时定时/计数器的实质是计数器的实质是16位加位加1计数器,它可以对脉冲的计数器,它可以对脉冲的个数加个数加1计数,计数器每接收到一个脉冲就加计数,计数器每接收到一个脉冲就加1,从,从0加至加至65535(二进制数为二进制数为16个个1)共需要共需要65535个脉冲,再来一个脉个

4、脉冲,再来一个脉冲,计数器溢出回零表示一轮计数结束,因此冲,计数器溢出回零表示一轮计数结束,因此16位加位加1计数计数器一轮最大的计数值即模为器一轮最大的计数值即模为26=65536次。次。项目六 99 s倒计时 2. 功能与原理功能与原理定时定时/计数器有定时和计数两种功能,它们的区别在于计数器有定时和计数两种功能,它们的区别在于加加1计数器的计数脉冲不相同。计数器的计数脉冲不相同。计数功能是对单片机外部发生的事件进行计数,外部计数功能是对单片机外部发生的事件进行计数,外部事件产生的计数脉冲由引脚事件产生的计数脉冲由引脚T0(P3.4)或或T1(P3.5)输入。在引输入。在引脚脚T0(P3.

5、4)或或T1(P3.5)上,上,CPU每检测到一个下降沿,计数每检测到一个下降沿,计数器加器加1一次。由于检测一个下降沿需要一次。由于检测一个下降沿需要2个机器周期个机器周期(1个机器个机器周期是时钟周期的周期是时钟周期的12倍倍),因此最高计数频率为时钟频率,因此最高计数频率为时钟频率fosc的的1/24。计数功能在实际控制中应用广泛,例如,制药。计数功能在实际控制中应用广泛,例如,制药厂的生产线上每厂的生产线上每50粒药片装粒药片装1瓶,每装入瓶,每装入1个药片,就由控个药片,就由控制电路产生制电路产生1个脉冲,将此脉冲输入计数器后就加个脉冲,将此脉冲输入计数器后就加1一次,一次,计数计数

6、50次后,再装下一瓶,这就是计数功能的典型应用。次后,再装下一瓶,这就是计数功能的典型应用。项目六 99 s倒计时 定时功能是将单片机时钟频率fosc12分频后作为计数脉冲,即1个机器周期,计数器加1一次,定时功能与外部事件无关。定时时间与计数器的计数值有什么关系呢?如果单片机晶振为12 MHz时,时钟周期为1/12 s,12分频后机器周期为12/12 MHz=1 s;也就是说加1一次需1 s,加65536次就需65536 s = 65.536 ms。一般地,定时时间=计数值(加1的次数)12/ fosc;如果定时1 ms,计数器的计数值为1000 s12 MHz/12=1000次。定时/计数

7、器定时时间的长短与时钟频率和计数值有关,当晶振频率确定后,主要由计数值决定定时时间。项目六 99 s倒计时 定时与计数虽然是对不同脉冲进行计数,但相同的是每来一个脉冲计数器加1,当加到65535(二进制数为16个1)时,再输入一个脉冲计数器就溢出回零,定时/计数器通过溢出回零通知CPU,计数完成或定时时间已到,这和定时的时间一到闹钟就会响的道理是一样的。定时/计数器不进行设置时,默认从0开始加1,到溢出回零时需加65536次。从上面举例可知,药片装瓶需计数50次,定时1 ms需计数1000次,这些计数值不会恰好是模(如65536),这些任意的计数值如何实现呢?有两种情况:第一种是计数值小于计数

8、器的模(如65536),可以先在计数器中存入一个初值,如果存入的初值为65535,只要再输入1个脉冲就可以使计数器溢出回零,因此计数值是1; 项目六 99 s倒计时 当计数值是50时,所需初值为65486,再来50个脉冲时恰好溢出回零。所以定时/计数器从不同的初值开始加1至溢出回零时,所需计数值不一样,定时时间也随之改变,可得出计数器的初值=计数器的模-计数值,初值的计算是定时/计数器初始化时必需的一步。第二种是计数值大于计数器的模(如65536)时,通过统计定时/计数器溢出的次数来计算计数值,例如,设置定时/计数器计数104次时,第1次溢出回零时计数值为104次,第2次溢出回零时计数值为21

9、04次第n次溢出回零时计数值为n104次,完全可实现大于计数器模的计数值。两种方法结合,就可以实现任意大小的计数值。项目六 99 s倒计时 大家可以想一下操场的跑道,一圈是400米,径赛时裁判坐在终点位置,100米、200米径赛时,由于小于一圈400米,径赛时选择不同的起跑位置(相当于计数初值),可以在同一个终点,实现不同长度的比赛;800米、3000米、5000米径赛时,大于一圈400米,确定起点后,由工作人员统计运动员跑的圈数(相当于累计溢出次数)来计算赛跑的总距离。项目六 99 s倒计时 3. 构造构造定时定时/计数器计数器T0由高由高8位寄存器位寄存器TH0和低和低8位寄存器位寄存器T

10、L0组成;组成;T1由由TH1和和TL1组成;组成;TMOD是定时是定时/计数器的工作计数器的工作方式寄存器;方式寄存器;TCON是定时是定时/计数器控制寄存器。定时计数器控制寄存器。定时/计数计数器的结构框图如图器的结构框图如图6-1所示。所示。项目六 99 s倒计时 图6-1 定时/计数器结构框图 项目六 99 s倒计时 6.2.2 定时定时/计数器的控制计数器的控制定时定时/计数器计数器T0和和T1主要由定时主要由定时/计数器工作方式寄存器计数器工作方式寄存器TMOD、定时、定时/计数器控制寄存器计数器控制寄存器TCON进行控制。其中,进行控制。其中,TMOD用于设置工作方式,用于设置工

11、作方式,TCON用于控制它们的启动、用于控制它们的启动、停止及溢出标志。停止及溢出标志。1. 定时定时/计数器控制寄存器计数器控制寄存器TCON定时定时/计数器控制寄存器计数器控制寄存器TCON在特殊功能寄存器中,在特殊功能寄存器中,字节地址为字节地址为88H,位地址,位地址(由低位到高位由低位到高位)分别是分别是88H8FH,该寄存器可以位寻址。它主要用来控制定时器的运行、停该寄存器可以位寻址。它主要用来控制定时器的运行、停顿,标志定时器的溢出等情况。单片机复位后,顿,标志定时器的溢出等情况。单片机复位后,TCON=0。TCON中与定时中与定时/计数器有关的各位如表计数器有关的各位如表6-1

12、所示。所示。项目六 99 s倒计时 表表6-1 定时定时/计数器控制寄存器计数器控制寄存器TCON(88H) 项目六 99 s倒计时 TF1定时/计数器T1溢出中断标志,由硬件自动设置。当定时/计数器T1计满溢出回零时,由硬件使TF1=1。如果定时/计数器工作在中断方式时,在进入中断服务函数后,由硬件自动清0,用户无需对它进行操作;如果使用软件查询方式的话,当查询到该位为1后,由用户清0。 TF0定时/计数器T0溢出中断标志,由硬件自动设置,方法同TF1。TR1定时/计数器T1运行控制位,由用户设置。定时/计数器T1有硬启动和软启动两种启动方式。 项目六 99 s倒计时 硬启动:当GATE=1

13、时,且引脚P3.3为高电平时,TR1置1可启动T1;当P3.3或TR1有任一不满足要求时,T1停止计数。软启动:当GATE=0时,TR1置1启动T1,TR1置0则T1停止。TR0定时/计数器T0运行控制位,由用户设置,方法同TR1。项目六 99 s倒计时 2. 定时定时/计数器工作方式寄存器计数器工作方式寄存器TMOD定时定时/计数器工作方式寄存器计数器工作方式寄存器TMOD在特殊功能寄存器在特殊功能寄存器中,字节地址为中,字节地址为89H,不能位寻址。,不能位寻址。TMOD用于确定定时器用于确定定时器的工作方式、启动方式、功能等。单片机复位后,的工作方式、启动方式、功能等。单片机复位后,TM

14、OD=0。TMOD各位如表各位如表6-2所示。所示。由表由表6-2可知,可知,TMOD的高的高4位用于设置定时位用于设置定时/计数器计数器T1,低低4位用于设置定时位用于设置定时/计数器计数器T0,对应,对应4位的含义如下:位的含义如下:GATE门控位。门控位。GATE用于选择定时用于选择定时/计数器的启动方计数器的启动方式。定时式。定时/计数器的启动方式有如下两种:计数器的启动方式有如下两种:项目六 99 s倒计时 表表6-2 定时定时/计数器控制寄存器计数器控制寄存器TMOD(89H) 项目六 99 s倒计时 软启动:GATE=0,定时/计数器的启动与停止仅由TCON寄存器中TRx(x=0

15、,1)控制。一般的控制要求都可采用软启动。硬启动:GATE=1,定时/计数器的启动与停止由TCON寄存器中TRx(x=0,1)和外部中断引脚(P3.2或P3.3)上的电平共同控制。C/定时/计数器功能选择位。当C/=1时,为计数功能;当C/=0,为定时功能。M1、M0工作方式选择位。项目六 99 s倒计时 6.2.3 定时定时/计数器的工作方式计数器的工作方式定时定时/计数器的工作方式如表计数器的工作方式如表6-3所示。所示。1. 方式方式0及方式及方式1定时定时/计数器计数器T0、T1都可设置为方式都可设置为方式0或方式或方式1。方式。方式0是是13位计数器,主要是为了与早期的产品兼容,现已

16、很少位计数器,主要是为了与早期的产品兼容,现已很少使用;方式使用;方式1是是16位计数器,模为位计数器,模为65536。寄存器。寄存器TLx存放计存放计数值的低数值的低8位,寄存器位,寄存器THx存放计数值的高存放计数值的高8位,位,THx、TLx共同完成计数功能,逻辑结构如图共同完成计数功能,逻辑结构如图6-2所示。所示。分析图分析图6-2逻辑框图可知,当逻辑框图可知,当C/=0时,时钟开关接晶时,时钟开关接晶振的振的12分频输出,实现定时功能;当分频输出,实现定时功能;当C/=1时,时钟开关时,时钟开关接外引脚接外引脚Ti,在外部事件的控制下实现计数功能。,在外部事件的控制下实现计数功能。

17、 TT项目六 99 s倒计时 表表6-3 定时定时/计数器的工作方式计数器的工作方式 项目六 99 s倒计时 图6-2 定时/计数器方式0及方式1逻辑结构框图 项目六 99 s倒计时 软启动当GATE=0,TRi=1时,计数开关闭合,由C/选择的脉冲加入计数器,计数器开始加1计数。当计数器的低8位TLx计满后向高8位THx进一位,直到把高8位THx也计满,此时计数器溢出回零,置TFx为1,可向CPU申请中断,也可对TFx进行查询。只要TRx为1,定时/计数器将循环计数。循环计数时,不管是中断方式还是查询方式,在计数器溢出回零时都要由用户重新装入计数初值,否则第一次溢出回零后,计数器将从0开始加

18、1,至下次溢出回零时,需计数65536次,这样就只有第一次的计数值是正确的,以后每次溢出时的计数值均为65536。 T项目六 99 s倒计时 2. 方式方式2定时定时/计数器计数器T0、T1都可设置为方式都可设置为方式2,并且它们的结,并且它们的结构和操作完全相同,逻辑结构如图构和操作完全相同,逻辑结构如图6-3所示。方式所示。方式2是用是用TLx作为作为8位计数器实现计数功能,位计数器实现计数功能,THx用于存放计数初值。方用于存放计数初值。方式式2的模虽然只有的模虽然只有256,但是在循环计数溢出回零时,除了,但是在循环计数溢出回零时,除了向向CPU申请中断,还要由硬件自动将存放在申请中断

19、,还要由硬件自动将存放在THx中的初值中的初值送入送入TLx开始下一次计数。方式开始下一次计数。方式2的优点是用户编程较为简的优点是用户编程较为简单,定时精度高,特别适合于定时精度要求较高的场合。单,定时精度高,特别适合于定时精度要求较高的场合。项目六 99 s倒计时 图6-3 定时/计数器方式2逻辑结构框图 项目六 99 s倒计时 3. 方式方式3只有定时只有定时/计数器计数器T0可以设置为方式可以设置为方式3,逻辑结构如图,逻辑结构如图6-4所示。所示。方式方式3时,时,T0被分为被分为2个独立的个独立的8位计数器位计数器TL0与与TH0,TL0既可以定时又可计数,使用既可以定时又可计数,

20、使用T0的引脚、各控制位及中的引脚、各控制位及中断源;断源;TH0只能用做内部定时,它借用了定时只能用做内部定时,它借用了定时/计数器计数器T1的的运行控制位运行控制位TR1和中断标志位和中断标志位TF1,它的启动和停止只受,它的启动和停止只受TR1的控制。的控制。项目六 99 s倒计时 图6-4 定时/计数器方式3逻辑结构框图 项目六 99 s倒计时 定时器T0设置为方式3时,T1仍可设置为方式0、方式1、方式2,但由于TR1、TF1均被T0占用,此时仅有控制位C/用于切换定时或计数功能,计数器溢出回零时,不能向CPU申请中断,也不能利用软件查询,在这种情况下,可将T1的输出送入串行口,作为

21、串行口的波特率发生器。T项目六 99 s倒计时 6.2.4 定时定时/计数器的应用计数器的应用1. 初值的计算初值的计算只要为定时只要为定时/计数器设置合适的计数初值,就可以实现计数器设置合适的计数初值,就可以实现任意大小的计数值。任意大小的计数值。(1) 计数功能的初值计算。定时计数功能的初值计算。定时/计数器实现计数功能时计数器实现计数功能时一般直接给出计数值一般直接给出计数值N,因此可用下式计算初值:,因此可用下式计算初值:初值初值=计数器的模计数器的模-N留意:留意: 定时定时/计数器工作在方式计数器工作在方式1时,模为时,模为65536;初值的高;初值的高8位送入位送入THx,低,低

22、8位送入位送入TLx,即,即THx=(65536-N)/256,TLx=(65536-N)%256。项目六 99 s倒计时 定时/计数器工作在方式2时,模为256;初值同时送入THx、TLx,即THx=TLx=256-N。 定时/计数器工作在方式3时,模为256;初值送入TH0或TL0。(2) 定时功能的初值计算。定时/计数器实现定时功能时会给出定时时间t,因此可用下式计算初值:初值=计数器的模- 12ftosc项目六 99 s倒计时 留意: fosc是晶振频率。当fosc以MHz为单位时,定时时间以s为单位可方便计算。 定时/计数器工作在方式1时,模为65536;初值的高8位送入THx,低8

23、位送入TLx,即THx=(65536- tfosc/12)/256,TLx=(65536- tfosc/12)%256。 定时/计数器工作在方式2时,模为256;初值同时送入THx、TLx,即THx=TLx=256-tfosc/12。 定时/计数器工作在方式3时,模为256;初值送入TH0或TL0。项目六 99 s倒计时 2. 定时定时/计数器的初始化计数器的初始化一般在主函数开始对定时一般在主函数开始对定时/计数器进行初始化,步骤如计数器进行初始化,步骤如下:下:(1) 对对TMOD赋值,确定赋值,确定T0和和T1的启动方式、功能、工的启动方式、功能、工作方式。作方式。(2) 计算初值,并将

24、其写入计算初值,并将其写入TH0、TL0或或TH1、TL1。(3) 中断方式时,对中断方式时,对IE赋值开中断;查询方式时,不需赋值开中断;查询方式时,不需开中断。开中断。(4) 置位置位TR0或或TR1,启动定时,启动定时/计数器。计数器。项目六 99 s倒计时 3. 定时定时/计数器应用举例计数器应用举例例例1 制药厂装瓶生产线上,每瓶装制药厂装瓶生产线上,每瓶装100个药片,用个药片,用51单单片机实现控制要求,试编写初始化程序。片机实现控制要求,试编写初始化程序。解:解:(1) 题目分析。由题意可知,在统计药片的个数时题目分析。由题意可知,在统计药片的个数时要用到定时要用到定时/计数器

25、的计数功能,计数值为计数器的计数功能,计数值为100,用,用T1的方的方式式2实现,采用中断方式。实现,采用中断方式。(2) 初始化程序如下:初始化程序如下:TMOD=0 x60;/设置设置T1为软启动、计数、方式为软启动、计数、方式2TH1=TL1=256-100;/装初值,装初值,TL1 用于计数、用于计数、TH1存放初值存放初值ET1=1;/定时定时/计数器计数器T1开中断开中断EA=1;/CPU开中断,也可用字节寻址开中断,也可用字节寻址IE=0 x88;代替这两条开中断指令代替这两条开中断指令TR1=1;/启动启动T1项目六 99 s倒计时 例2 某控制系统需定时20 ms,晶振为1

26、2 MHz,试初始化。解:(1) 题目分析。晶振为12 MHz时,定时20 ms需要的计数值为20000 s12 MHz /12=20000次,可用T0的方式1实现,采用中断方式。(2) 初始化程序如下:TMOD=0 x01;/设置T0为软启动、定时、方式1TH0=(65536-20000)/256;/初值高8位送TH0TL0=(65536-20000)%256;/初值低8位送TL0 ET0=1;/定时/计数器T0开中断EA=1;/CPU开中断TR0=1;/启动T0项目六 99 s倒计时 例3 设某单片机系统的晶振为12 MHz,P2口上接有8个发光二极管,低电平点亮,利用定时/计数器T0工作

27、在方式1,使P2.0所接发光管LED0以200 ms亮灭闪烁。解:(1) 硬件设计。参考项目一相关内容,硬件电路如图6-5所示。(2) 软件设计。定时200 ms有两种方法:一是用延时函数;二是用定时/计数器。在没有讲定时/计数器之前,与定时有关的定时功能都是用延时函数来实现的,CPU执行延时函数时,只能长时间无意义地等待定时时间的到来,降低了CPU的利用率。用定时/计数器实现定时,CPU只要对其初始化并启动后,定时工作就交由定时/计数器来独立完成,而CPU就可以执行其他的任务了,从而完成较为复杂的控制要求。项目六 99 s倒计时 图6-5 定时/计数器例3电路图 项目六 99 s倒计时 定时

28、200 ms时,需要的计数值=200000 s12 MHz/12=200000次65536,T0本身并不能实现200 ms的定时,考虑到200000=500004,即200 ms=50 ms4,用T0实现50000次计数即定时50 ms,当T0溢出4次时,就可实现200 ms定时,为此定义变量t0_num(初值4)统计溢出次数,T0每溢出一次,t0_num就减1,当t0_num减至0时,溢出4次。采用中断方式时,软件包含主函数main()与T0中断服务函数time0()。项目六 99 s倒计时 定时/计数器T0的中断号为1,定义中断服务函数时一定要写正确。将判断200 ms是否到,以及200

29、ms到了之后控制灯闪烁安排在time0()中;main()只需完成对T0的初始化,然后就无事可做,等待T0申请中断,这样安排的好处是main()与time0()之间无需传递信息,适用于初学者。相关流程图如图6-6所示。项目六 99 s倒计时 图6-6 定时/计数器例3流程图 项目六 99 s倒计时 (3) 源程序。#include #define uchar unsigned char#define uint unsigned int/*必要的全局变量定义*/sbit LED0=P20; /定义发光二极管LED0uchar t0_ num=4; /定义变量t0_ num统计T0的溢出次数项目六

30、 99 s倒计时 /*主函数*/main() TMOD=0 x01; /设置T0软启动、定时50 ms、方式l TH0=(65536-50000)/256; /定时50 ms初值的高8位送入TH0 TL0=(65536-50000)%256;/定时50 ms初值的低8位送入TL0 ET0=1; /T0开中断 EA=1; /CPU开中断 TR0=1; /启动T0 while(1); /等待T0中断项目六 99 s倒计时 /*T0中断服务函数*/void time0() interrupt 1TH0=(65536-50000)/256; /重装初值,循环计数时使T0重复定时50 ms TL0=(6

31、5536-50000)%256;t0_num-; / T0每50 ms溢出时,t0_num减1 if(t0_num=0) /当t0_num减至0时,表示T0溢出4次,200 ms到 t0_num=4; /t0_num重赋4,可循环定时200 msLED0= LED0; /每隔200 ms LED0状态取反,实现闪烁效果 项目六 99 s倒计时 在main()函数中,CPU初始化T0并启动后,就没有其他事情可做,因此一边执行语句“while(1);”一边等待T0申请中断。另一方面T0启动后一直在加1计数,溢出回零时向CPU提出中断请求,由于初始化时T0与CPU均设置为开中断,CPU可以响应T0的

32、中断请求,转去执行中断服务函数time0(),在time0()中判断定时200 ms是否到等工作。(4) 思索。 用200 ms=20 ms10实现200 ms定时。 用T1实现200 ms定时。项目六 99 s倒计时 在实际应用中,定时/计数器的中断服务函数中不易安排过多的任务,因为当语句过多时,中断服务函数可能还未执行完毕,下一次中断又到了,这样就会丢失这次中断,当单片机循环执行代码时,这种丢失累积出现,不仅降低定时精度,严重时程序执行也会乱套。因此在分配任务时应遵循:能在主函数中完成的就不要安排在中断服务函数中,必须在中断函数中实现的功能,一定要高效、简约。按此原则,重新分配例3的各项任

33、务,定义溢出标志位flag在T0的中断服务函数time0()与主函数之间传递信息;当flag为1时表示T0溢出,flag为0时表示T0未溢出;在time0()中置位flag,在主函数中根据flag的状态决定做什么工作。项目六 99 s倒计时 time0()中完成重赋初值、置位flag;而t0_num减1及灯的闪烁等任务都安排在main()中,流程图如图6-7所示。试着写出源程序。项目六 99 s倒计时 图6-7 定时/计数器例3流程图(重新分配任务) 项目六 99 s倒计时 例4 用单片机的P2口驱动共阳型数码管,编程使数码管上的数字在09之间递减,间隔1 s。定时1 s由定时/计数器T1完成

34、,晶振为12 MHz。解:(1) 硬件设计。硬件电路如图6-8所示。(2) 软件设计。定时1 s,计数值=1000000 s12 MHz/12=1000000次65536,依据1 s=40 ms25,用T1实现定时40 ms,当T1溢出25次时,就是1 s。变量t1_num(初值0)统计T1溢出次数,T1每溢出一次,t1_num就加1,加至25时,1 s到。变量count每隔1 s减1,静态显示时只需将count的段码发送至P2口。项目六 99 s倒计时 主函数初始化T1后,就等待T1中断;在T1的中断服务函数time1()中实现1 s的判断、count处理及显示等任务。定时/计数器T1的中断

35、号为3。项目六 99 s倒计时 图6-8 定时/计数器例4硬件电路图 项目六 99 s倒计时 (3) 源程序。#include #define uchar unsigned char#define uint unsigned int/*必要的全局变量定义*/uchar code duan = 0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90 ;/定义共阳型段码表uchar t1_ num=0; /定义变量t1_ num统计T1的溢出次数uchar count=0;/定义变量count控制数码管上的数值递减项目六 99 s倒计

36、时 /*T1中断服务函数*/void time1() interrupt 3TH1=(65536-40000)/256; /重赋初值,使T1多次重复定时40 msTL1=(65536-40000)%256;t1_num+; /T1每40 ms溢出时,t1_num加1 if(t1_num=25) /当t1_num加至25时,表示1 s到 t1_num=0; /t1_num重赋0,可循环定时1 sif(count=0) /将0-1=9变为10-1=9,符合减法运算count=10;count-;/count每隔1 s减1P2=duancount; /显示count 项目六 99 s倒计时 /*主函

37、数*/main() TMOD=0 x10; /设置T1软启动、定时40 ms、方式l TH1=(65536-40000)/256; /定时40 ms初值的高8位送入TH1 TL1=(65536-40000)%256;/定时40 ms初值的低8位送入TL1 ET1=1; /T1开中断 EA=1; /CPU开中断 TR1=1; /启动T1 while(1); /等待T1中断项目六 99 s倒计时 6.3 项项 目目 实实 施施6.3.1 硬件设计方案硬件设计方案倒计时就是首先给定一个初值,然后进倒计时就是首先给定一个初值,然后进行减行减1操作,直到减至操作,直到减至0为止,需要时再从初为止,需要时

38、再从初值开始递减。本项目中为了简化源程序,要值开始递减。本项目中为了简化源程序,要求当由初值减至求当由初值减至0时,不停止,重新开始递时,不停止,重新开始递减。减。实现实现99 s倒计时,需要倒计时,需要2个共阳型数码管个共阳型数码管显示计时结果,采用动态显示,用显示计时结果,采用动态显示,用P0口作为口作为数码管的字段口,数码管的字段口,P2.0接个位数码管的字位接个位数码管的字位口,口,P2.1接十位数码管的字位口,硬件电路接十位数码管的字位口,硬件电路如图如图6-9所示。所示。项目六 99 s倒计时 图6-9 项目六硬件电路图 项目六 99 s倒计时 在图6-9中,当I/O口=0时,三极

39、管饱和导通,数码管可以显示;当I/O口=1时,三极管截止,数码管不能显示。动态扫描时要求任何时刻只能有一个数码管工作,因此采用字节寻址时,十位数码管DS1的位码为P2=00000001B=1,个位数码管DS0的位码为P2=00000010B=2。项目六 99 s倒计时 6.3.2 软件设计方案软件设计方案实现实现99 s倒计时,软件编程主要解决以下几个问题:图倒计时,软件编程主要解决以下几个问题:图6-10 项目六主函数流程图项目六主函数流程图(1) 计时的时间基准计时的时间基准1 s由定时由定时/计数器计数器T1实现。原理是实现。原理是1 s=10 ms100,由,由T1实现实现10 ms定

40、时,定义变量定时,定义变量t1_num(初值为初值为0)统计统计T1的溢出次数,当的溢出次数,当T1溢出中断溢出中断100次次时,表示时,表示1 s到;定义变量到;定义变量djs(初值为初值为0)用于倒计时,用于倒计时,1 s到了到了之后,之后,djs-1,并判断是否超出允许范围。,并判断是否超出允许范围。项目六 99 s倒计时 (2) 变量djs的显示由显示函数disp()完成,在disp()中对2个数码管进行动态扫描,每个数码管显示时都要发送位码、段码并延时1 ms。(3) 主函数对T1初始化后,一边调用显示函数扫描数码管,一边等待T1申请中断。主函数流程图如图6-10所示,定时/计数器中

41、断函数流程图与图6-6相似,此处略。项目六 99 s倒计时 图6-10 项目六主函数流程图 项目六 99 s倒计时 源程序#include#define uchar unsigned char#define uint unsigned int/*必要的全局变量定义*/uchar djs=0;/定义倒计时变量uchar t1_num=0;/定义变量t1_num,用以累计定时器T1的溢出次数,实现1 suchar code duan = 0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90 ;/定义共阳型段码表uchar xian

42、=0,0;/定义显示数组,存入变量djs的十位及个位数码uchar code wei =1,2;/定义位码表,存放两个数码管的位码项目六 99 s倒计时 /*延时函数*/void delay() uint i;/时间约为1 msfor(i=0; i130; i+);/*显示函数*/void disp() uchar i;xian0=djs/10;/将变量djs的十位数码拆分至显示数组xian1=djs%10;/将变量djs的个位数码拆分至显示数组for(i=0; i2; i+)项目六 99 s倒计时 P2=weii; /发送位码P0=duanxiani; /发送段码delay();/延时1 m

43、s项目六 99 s倒计时 /*主函数*/main()TMOD=0 x10;/设置T1定时10 ms,软启动,方式1TH1=(65536-10000)/256;/晶振12 MHz,定时10 ms时初值高8位送入TH1TL1=(65536-10000)%256;/晶振12 MHz,定时10 ms时初值低8位送入TL1ET1=1;/定时/计数器T1开中断EA=1;/CPU开中断TR1=1;/启动定时/计数器T1while(1)disp();/调用显示函数显示变量djs项目六 99 s倒计时 /*定时/计数器T1中断服务函数*/void time1() interrupt 3TH1=(65536-10

44、000)/256;TL1=(65536-10000)%256;t1_num+;/T1每10 ms溢出一次,变量t1_num加1if(t1_num=100)/变量t1_num加至100时,表示1 s到t1_num=0;/变量t1_num重赋初值0,便于重复定时1 sif(djs=0)/将0-1=99,变为100-1=99,符合减法运算规则djs=100;djs-;/1 s到时,变量djs减1项目六 99 s倒计时 6.3.3 程序调试程序调试1. 实验板电路分析实验板电路分析参照项目三图参照项目三图3-15所示所示HOT-51实验板动态显示电路。实验板动态显示电路。留意:实验板上是共阴型数码管,

45、留意:实验板上是共阴型数码管,P0为字段口,为字段口,P2为字位为字位口,口,8个数码管从左至右的位码依次是个数码管从左至右的位码依次是07,晶振为,晶振为11.0592 MHz。项目六 99 s倒计时 2. 程序设计程序设计根据实验板的电路连接方式,重新改写程序。实验板根据实验板的电路连接方式,重新改写程序。实验板上共有上共有8个共阴型数码管,而程序中只需用其中的个共阴型数码管,而程序中只需用其中的2个,个,99s倒计时的显示位置,大家可以自定。中断服务函数完成变倒计时的显示位置,大家可以自定。中断服务函数完成变量量djs递减的功能,中断号要根据所用定时递减的功能,中断号要根据所用定时/计数

46、器来确定,计数器来确定,一定要写正确;显示函数完成变量一定要写正确;显示函数完成变量djs的显示,动态显示的的显示,动态显示的编写对初学者是难点,编写方法也灵活多样,但不论如何编写对初学者是难点,编写方法也灵活多样,但不论如何变化,每个数码管工作时,都必须发送位码、段码并延时,变化,每个数码管工作时,都必须发送位码、段码并延时,当数码管的个数较少时,也可以改为顺序结构。当数码管的个数较少时,也可以改为顺序结构。项目六 99 s倒计时 /*显示函数,顺序结构时,不需要定义显示数组xian 、位码表wei */void disp() P2=1; /发送十位数码管的位码P0=duandjs/10;

47、/发送djs十位数的段码delay();P2=2; /发送个位数码管的位码P0=duandjs%10; /发送djs个位数的段码delay();项目六 99 s倒计时 3. 结果测试结果测试源程序编译下载后,观察显示结果。如果不能正常工源程序编译下载后,观察显示结果。如果不能正常工作,可依照数码管上的现象分析产生故障原因;如果数码作,可依照数码管上的现象分析产生故障原因;如果数码管只显示但不能计时,一般是与定时管只显示但不能计时,一般是与定时/计数器的初始化、中计数器的初始化、中断服务函数有关;显示出现问题则要重点检查显示函数与断服务函数有关;显示出现问题则要重点检查显示函数与主函数。主函数。

48、项目六 99 s倒计时 4. 拓展练习拓展练习根据下列要求,练习编程。根据下列要求,练习编程。(1) 由定时由定时/计数器计数器T0实现实现1 s定时。定时。(2) 改变改变1 s的实现原理,如的实现原理,如1 s=25 ms40。(3) 灵活改变显示位置。灵活改变显示位置。(4) 实现实现60 s、999 s计时。计时。(5) 设置定时预置键。设置定时预置键。项目六 99 s倒计时 6.4 项项 目目 评评 价价 项目六 99 s倒计时 项目六 99 s倒计时 6.5 拓拓展展与与提提高高在实际应用时,要求计时精度较高的电在实际应用时,要求计时精度较高的电子时钟,通常都采用子时钟,通常都采用

49、DS12C887时钟日历芯时钟日历芯片来完成,片来完成,DS12C887实时时钟芯片功能丰实时时钟芯片功能丰富,能够自动产生世纪、年、月、日、时、富,能够自动产生世纪、年、月、日、时、分、秒等信息,其内部又增加了世纪寄存器,分、秒等信息,其内部又增加了世纪寄存器,从而利用硬件电路解决从而利用硬件电路解决“千年问题;千年问题;DS12C887中自带锂电池,外部掉电时,其中自带锂电池,外部掉电时,其内部时间信息还能够保持内部时间信息还能够保持10年之久;时间格年之久;时间格式则有式则有12和和24小时制两种模式。在小时制两种模式。在12小时制小时制模式中,用模式中,用AM和和PM区分上午和下午;时

50、间区分上午和下午;时间的表示方法也有两种,一种用二进制数表示,的表示方法也有两种,一种用二进制数表示,一种是用一种是用BCD码表示;码表示;DS12C887中带有中带有128字节的字节的项目六 99 s倒计时 RAM,其中有11字节用来存储时间信息,4字节用来存储 DS12C887的控制信息,称为控制寄存器,113字节通用RAM供用户使用;此外用户还可对DS12C887进行编程以实现多种方波输出,并可通过软件屏蔽其内部的三路中断。DS12C887的引脚排列如图6-11所示。GND、VCC直流电源,其中VCC接+5 V,GND接地,当VCC为+5 V时,用户可以访问DS12C887内部RAM中的

51、数据,并可对其进行读、写操作;当VCC小于+4.25 V时,禁止用户对内部RAM进行读、写操作,此时用户不能正确获取芯片内的时间信息;当VCC小于+3 V时,DS12C887会自动将电源转换到内部自带的锂电池上,以保证内部的电路能够正常工作。项目六 99 s倒计时 图6-11 DS12C887引脚图项目六 99 s倒计时 MOT模式选择端,DA12C887有Motorola和Intel两种工作模式,即当MOT接VCC时,选用Motorola模式;当MOT接GND时,选用Intel模式。SQW方波输出脚,当VCC大于4.25 V时,SQW脚可输出方波,用户通过对控制寄存器编程,实现13种方波信号

52、的输出。AD0AD7地址/数据复用总线,该总线采用分时复用技术,在总线周期的前半部分,出现在AD0AD7上的是地址信息,用以选通DS12C887内部的RAM;在总线周期的后半部分,出现在AD0AD7上的是数据信息。 项目六 99 s倒计时 AS地址选通输入脚,进行读/写操作时,在AS的前一个上升沿将AD0AD7上的地址信息锁存到DS12C887上;在AS的后一个下降沿时,清除AD0AD7上的地址信息,不论是否有效,DS12C887都将执行该操作。DS数据选择/读输入脚,该引脚有两种工作模式。当MOT接VCC时,选用Motorola工作模式,在这种工作模式中,每个总线周期的后一部分的DS为高电平

53、,被称为数据选通。在读操作中,DS的上升沿将DS12C887内部数据送往总线AD0AD7上,以供外部读取;在写操作中,DS的下降沿使总线AD0AD7上的数据锁存在DS12C887中。当MOT接GND时,选用Intel工作模式,在该模式中,该引脚是读允许输入脚。 项目六 99 s倒计时 R/读/写输入端,该管脚也有两种工作模式:当MOT接VCC时,R/工作在 Motorola模式,此时,该引脚的作用是区分读操作还是写操作,当R/为高电平时为读操作,R/为低电平时为写操作;当MOT接GND时,该引脚工作在Intel模式,此时作为写允许输入。 片选端,低电平有效。WWWWCS项目六 99 s倒计时

54、中断请求输出,低电平有效,该引脚有效时,对DS12C887内的时钟、日历和RAM中的内容没有任何影响,仅对内部的控制寄存器有影响,在典型的应用中,可以直接接VCC,这样可以保证在DS12C887掉电时,其内部控制寄存器不受影响。DS12C887内部RAM中有11字节用来存储时间信息,4字节用来存储控制信息,具体地址及取值范围如表6-4所示。IRQRESET项目六 99 s倒计时 表表6-4 DS12C887地址分配表地址分配表 项目六 99 s倒计时 1. 控制寄存器控制寄存器A控制寄存器控制寄存器A在在DS12C887的的RAM中占用地址为中占用地址为0AH的的单元,主要用于设置芯片是否更新

55、、晶体振荡器的开单元,主要用于设置芯片是否更新、晶体振荡器的开/关、关、分频器复位及速率选择等。各位如表分频器复位及速率选择等。各位如表6-5所示。所示。UIP更新位,用来标志芯片是否即将进行更新。当更新位,用来标志芯片是否即将进行更新。当UIP=1时,更新即将开始;当时,更新即将开始;当UIP=0时,表示至少在时,表示至少在244 s内芯片不会更新,此时,时钟、日历和闹钟信息可以通过内芯片不会更新,此时,时钟、日历和闹钟信息可以通过读读/写相应的字节获得并设置。写相应的字节获得并设置。UIP位为只读位且不受复位位为只读位且不受复位信号信号()的影响。寄存器的影响。寄存器B中的中的SET位设置为位设置为l时,可时,可以禁止更新并将以禁止更新并将

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论