《51系列单片机项目实践 教学课件 ppt 作者 石长华 主编 课件汇总 第9章 定时器计数器》由会员分享,可在线阅读,更多相关《51系列单片机项目实践 教学课件 ppt 作者 石长华 主编 课件汇总 第9章 定时器计数器(27页珍藏版)》请在金锄头文库上搜索。
1、第9章 定时器/计数器,9.1 项目内容:电子时钟的设计 9.2 程序设计 9.3 相关知识:定时计数器综述,9.1 项目内容:电子时钟的设计,9.1.1 硬件电路设计 电子时钟的硬件电路图如下所示:,该设计电路由以下部分组成: 1. 复位电路采用“上电复位”方式。 2. 时钟电路以12MHz的频率向单片机提供振荡 脉冲,保证单片机以规定的频率运行。 3P0口接一个双向缓冲驱动芯片74LS245,再接至 LCD的段码端,用以驱动LCD的段码显示; 4. P3口接至LCD的位码端,用以选择要显示的数码管。,9.1.2 基本功能,电子时钟的基本功能如下: 1.电子时钟显示的格式是XX-XX-XX,
2、从10-10-10开始计数,每隔10秒,P3.6引脚对应的数码管(秒十位)就加1亮一次,而秒个位清0;每隔60秒,P3.4引脚对应的数码管(分个位)就加1亮一次,而秒个位和十位都清0;同理,其它情况依此类推。 2.当计数至24小时时,所有数码管都被清0,重新开始计时。 3.如果想调整初始时间,可在程序中修改hour, minute,second的初值即可。,9.2 程序设计,9.2.1 程序代码设计 部分程序如下所示: /* 电子时钟的设计 */ #include #include #define uchar unsigned char #define uint unsigned int uc
3、har code table = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; / 共阴极段码表0,1,2,3,4,5,6,7,8,9 sbit P3_0 = P30; sbit P3_1 = P31; sbit P3_2 = P32; sbit P3_3 = P33; sbit P3_4 = P34; sbit P3_5 = P35; sbit P3_6 = P36; sbit P3_7 = P37; unsigned char second,minute,hour; unsigned char count;,void timer0()
4、 interrupt 1 using 0 / 定时中断响应定50ms ET0=0; / 关闭定时器0源中断 TR0=0; / 关闭定时器0 TH0=(65536-50000)/256; / 重装计数初值 TL0=(65536-50000)%256; count+; / 定时中断的次数 if(count = 20) / 计数20次到1秒 count = 0; second +; if(second = 59) second = 0; minute +; if(minute = 59) minute = 0; hour +; if(hour = 24) hour = 0; minute = 0;
5、second = 0; ET0 = 1; TR0 = 1; ,void main() TMOD = 0x01; / 定时器0方式1 TH0=(65536-50000)/256; / 装载计数初值,每次定时50ms TL0=(65536-50000)%256; count = 0; / 中断次数为0 EA = 1; / 开CPU中断 ET0 = 1; / 开定时器0中断 TR0 = 1; / 启动定时器0 hour = 10,minuter = 10,second = 10; / 开机显示10-10-10 while(1) Display(hour,minute,second); ,9.2.2
6、仿真结果,下图是电子时钟在计数时某一个时刻的具体运行情 况的截图:,9.3 相关知识:定时计数器综述,9.3.1 定时计数器的结构和工作原理 1. 定时/计数器T0、T1的结构 定时/计数器的原理结构框图如图6-3所示。,2. 定时/计数器的原理 定时/计数器的工作原理图如图6-4所示。,9.3.2 定时计数器的工作方式寄存器和控制寄存器,1. 工作方式寄存器TMOD TMOD为T0、T1的工作方式寄存器,其各位的格式如下:,其各位的功能如下: 位7 GATET1的门控位。 当GATE=0时,只要控制位TR1置1,即可启动定时器T1开始工作; 当GATE=1时,除需要将TR1置1外,还要使引脚
7、为高电平,才能 启动相应的定时器开始工作。 位6 T1的功能选择位。 当=0时,T1为定时器方式; 当=1时,T1为计数器方式。,位5和位4 M1和M0T1的方式选择位 位3 GATET0的门控位。 当GATE=0时,只要控制位TR0置1,即可启动定时 器T0开始工作; 当GATE=1时,除需要将TR0置1外,还要使引脚为 高电平,才能启动相应的定时器开始工作。 位2 T0的功能选择位。 当=0时,T0为定时器方式; 当=1时,T0为计数器方式。 位1和位0 M1和M0T0的方式选择位,定时器T1工作方式选择表:,定时器T0工作方式选择表 :,2. 定时器/计数器控制寄存器TCON 定时器控制
8、寄存器TCON各位格式如下:,各位功能和名称如下: TF0/1(TCON.7)定时器0/1溢出标志 当定时器0/1计满溢出时,由硬件使TF1置1,并且申请中断 进入中断服务程序后,由硬件自动清0。 TR0/1(TCON.6)定时器9/1运行控制位 当TR0/1=1时,启动定时器0/1工作;当TR0/1=0时,关闭定时器。 IE1(TCON.3)外部中断1请求标志。 IT1(TCON.2)外部中断1触发方式选择位。 IE0(TCON.1)外部中断0请求标志。 IT1(TCON.0)外部中断0触发方式选择位。,9.3.3 定时计数器的工作方式,通过对M1,M0位的设置,T0可选择4种工作方式,T1
9、 可选择3种工作方式。 方式0 当TMOD中M1M0=00时,T/C工作在方式0。其逻辑电路 结构如下图所示。,方式0为13位的T/C,由TH提供8位,TL提供低5位(TL的高3位无效) 的计数值,满计数值为,但启动前可以预置计数初值。 当T/C值为0时,为定时器,振荡源12分频的信号作为计数脉冲; 当T/C值为1时,为计数器,对外部脉冲输入端T0或T1输入的脉冲 计数。 计数脉冲能否加到计数器上,受启动信号的控制。当GATE=0时, 只要TR=1,则T/C启动;当GATE=1时,此时T/C启动受到双重控制。 T/C启动后立即加1计数,当13位计数满时,TH向高位进位。此进 位将中断溢出标志T
10、F置1,产生中断请求,表示定时时间到或计数 次数到。若T/C开中断(ET=1)且CPU开中断(EA=1),则当CPU转向 中断服务程序时,TF自动清零 。 2. 方式1 当TMOD中M1M0=01时,T/C工作在方式1。 方式1与方式0基本相同,唯一的区别在于计数寄存器的位数是16 位的,由TH和TL寄存器各提供8位,满计数值为2-e16。,3.方式2 当TMOD中M1M0=10时,T/C工作在方式2。其逻辑电路结 构如下图所示。 方式2中TH和TL被当作两个8位计数器。计数过程中, TH寄存8位初值并保持不变,由TL进行8位计数。计数 溢出时,除产生溢出中断请求外,还自动将TH中初值 重装到
11、TL,即重装载。除此之外,方式2也同方式0。,4. 方式3 当TMOD中M1M0=10时,T/C工作在方式2。其逻辑电路 结构如下图所示。,9.3.4 定时/计数器的初始化,1. 初始化步骤 在使用单片机的定时/计数器前,应对它进行编程初始 化,主要是对TMOD和TCON编程,还需计算和装载T/C的 计数初值。一般完成以下几个步骤: (1) 确定T/C的工作方式编程TMOD寄存器。 (2) 计算T/C中的计数初值,并装载到TH和TL。 (3) T/C在中断方式工作时,须开CPU中断和源中断 编程IE寄存器。 (4) 启动T/C编程TCON中的TR0或TR1。,2.计数初值的计算 (1) 定时器
12、的计数初值 在定时器方式下,T/C是对机器周期脉冲计数的,如果 fosc = 6MHz,那么一个机器周期为12/fosc = 2us,则,(2)计数器的计数初值 在计数器方式下:,9.3.5 定时/计数器的应用举例,例9-1 在XATAL频率是12MHz的标准51单片机上,用 Timer1产生10kHz定时器嘀嗒中断。 分析:在XATAL频率是12MHz的情况下,一个时钟周期 是: t = 12/12M = 1us, 而定时器的定时时间为: T = 1/10k = 100us 因此,CPU总共要计数100次。,下面是程序清单: #include satic unsigned long over
13、flower_count = 0; void timer1_ISR(void) interrupt 3 overflower_count+; void main (void) TMOD = (TMOD / 不做什么(无限循环):定时器1的 中断每100个,例9-2 设单片机的fosc = 12MHz,要求P1.0脚上输 出周期为2ms的方波。 分析:周期为2ms的方波要求定时间隔1ms,每次 时间到时,P1.0取反。 定时器计数率 = fosc/12,机器周期 = 12/fosc = 1us每个机器周期定时器计数加1,1ms = 1000us 需计数次数 = 1000/(12/fosc)= 1
14、000/1 = 1000 由于计数器向上计数,为得到1000个计数之后的定 时器溢出,必须给定时器置初值为655361000。,用定时器0的方式1编程,采用查询方式。程序名为:timer91.c #include sbit P1_0 = P10; void main(void) TMOD = 0x01; / 定时器0方式1 TR0 = 1; / 启动T/C0 For(;) TH0 = (65536 - 1000)/256; / 装载计数初值 TL0 = (65536 - 1000)%256; do while (!TF0); / 查询等待TF0置位 P1_0 = P10; / 定时时间到,P1
15、.0反相 TF0 = 0; / 软件清TF0 ,用定时器0的方式1编程,采用中断方式。程序名为timer92.c #include sbit P1_0 = P10; void timer0(void) interrupt 1 using 1 / T/C0中断服务程序入口 P1_0 = !P10; / P1.0取反 TH0 = (65536 - 1000)/256; / 计数初值重装载 TL0 = (65536 - 1000)%256; void main(void) TMOD = 0x01; / T/C0工作在定时器方式1 P1_0 = 0; TH0 = (65536 - 1000)/256; / 预置计数初值 TL0 = (65536 - 1000)%256; EA = 1; / CPU开中断 ET0 = 1; / T/C0开中断 TR0 = 1; / 启动定时器0开始计时 do w