《单片机控制技术项目式课程》(第2版)课件 项目6 交通信号灯的设计_第1页
《单片机控制技术项目式课程》(第2版)课件 项目6 交通信号灯的设计_第2页
《单片机控制技术项目式课程》(第2版)课件 项目6 交通信号灯的设计_第3页
《单片机控制技术项目式课程》(第2版)课件 项目6 交通信号灯的设计_第4页
《单片机控制技术项目式课程》(第2版)课件 项目6 交通信号灯的设计_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

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

文档简介

项目5

定时器与脉冲计数器的设计了解单片机定时/计数器的组成。掌握单片机定时/计数器的工作原理和功能运用方法。掌握单片机定时/计数器的初始化方法。掌握定时器的设计方法。掌握脉冲计数器的设计方法。能独立分析和解决硬件设计和软件设计中的问题。能利用团队的力量完成任务,培养团队合作精神。学习目标叙述单片机定时/计数器4种工作方式的工作原理;叙述单片机定时/计数器的初始化方法;设计定时器的工作程序;设计脉冲计数器的电路和工作程序。工作任务任务5.1定时器的设计项目5

定时器与脉冲计数器的设计任务5.2脉冲计数器的设计项目拓展STC89C52实验板分频器的设计项目小结5.1.1.1单片机定时/计数器的结构

实质是加1计数器(高8位、低8位);5.1.1

MCS-51单片机内部定时/计数器的原理工作方式控制寄存器TMOD,工作方式设置;定时器控制寄存器TCON,启动、停止及设置溢出标志。任务5.1定时器的设计TMOD中,各有一个控制位(C/T),分别用于控制定时/计数器T0和T1工作在定时器方式还是计数器方式。

5.1.1.2定时/计数器工作原理计数功能----计数脉冲来自相应的外部输入引脚,T0为P3.4,T1为P3.5。定时功能----计数输入信号是内部时钟脉冲,每个机器周期使寄存器的值加1。所以,计数频率是振荡频率的1/12。

定时模式,对内部机器周期计数

定时时间T=计数值NxT机计数模式,对外部事件脉冲计数

计数脉冲周期要大于2T机计数值:溢出时计数器值-计数初值。

计数器全1时,再输入1个脉冲就回零,并发生

溢出(TCON中TF0或TF1置1)。

计数器脉冲来源:

振荡器脉冲经过12分频T0或T1引脚的外部脉冲1.工作方式控制寄存器TMOD

T1控制T0控制M0M1C/TGATEM0M1C/TGATED0D1D2D3D4D5D6D7GATE—门控位C/T—计数/定时选择M1M0—工作方式选择5.1.1.3定时/计数器的初始化注意:不能进行位寻址

定时/计数器的工作方式

M1M0工作方式功能说明00方式013位计数器01方式116位计数器10方式2自动重装初值的8位计数器11方式3方式3只针对T0,T0分成两个独立的8位定时/计数器;T1无方式32.定时器控制寄存器TCOND7D6D5D4D3D2D1D0TF1TR1TF0TR0IE1IT1IE0IT0TF0、TF1:溢出标志位中断请求标志触发方式选择启动定时/计数器0低电平1下降沿0停止1启动注意:可以进行位寻址

3.定时/计数器的初始化②计算计数器的计数初值:

编程时将计数初值送TH0、TL0或TH1、TL1;

可编程器件在使用前需要进行初始化:①确定TMOD控制字:编程时将控制字送TMOD;③

TR0或TR1位置位控制定时器的启动和停止。【例】若单片机晶振为12MHz,要求产生5ms的定时,试计算X的初值。解:(1)采用定时器0的方式0:

5000*10-6=(213-X)*12*1/fosc

x=3192=0C78H=0110001100011000

63H

18H

即TH0=63H,TL0=18H

TMOD=GATEC/TM1M0GATEC/TM1M0

00000000

00H

(2)采用定时器1方式1:

5000*10-6=(216-X)*12*1/fosc

x=60536=EC78H

即TH1=ECH,TL1=78H

TMOD=GATEC/TM1M0GATEC/TM1M0

00010000

10Hmain()函数中:

TMOD=0x00;//设置定时器0为工作方式0 TH0=0x31;//定时器0高8位给初值

TL0=0x1C;//定时器0低8位给初值

TR0=1;//启动定时器0初始化程序编写计数脉冲输入方式0—13位方式。由TL0的低5位和TH0的8位组成。TH0溢出时,置位TF0标志,向CPU发出中断请求。TF0T0TR0GATEINT01≥1&C/T=1C/T=0振荡器1/12TH0TL0低5位高8位13位计数器定时器计数器5.1.2用单片机定时/计数器设计定时器(查询方式)5.1.2.1用定时/计数器的工作方式0设计定时器定时=(213-X)×时钟周期×12

=(213–X)*12*1/fosc计数初值:X=213-T/(时钟周期×12)定时/计数器工作方式0定时方式:例:8*10-3=(213-X)*12*1/(12*106)

X=213–8000 =192=0xC0计数方式:计数次数值N=213-X计数初值:X=213-计数次数值N注意:X的低5位送TL0(TL1),TL0(TL1)的高3位数为任意值,常取0,高8位送TH0(TH1)。最大计数值M=213=81921.任务要求本任务要求用AT89C51的定时器1,方式0设计一只1秒的定时器,用定时器的查询方式,使AT89C51控制的一只发光二极管定时1秒闪烁。任务操作

2.任务分析①确定TMOD控制字:采用AT89C51的定时器1方式0定时,TMOD=0x00

②计算计数器的计数初值:因为方式0采用13位计数器,其最大定时时间为:8192×1ms=8.192ms,可选择定时时间为5ms,再循环200次就可以定时为1s了。X=213-T/(时钟周期×12)

=0110001100011000B=0x6318所以TH1赋值0x63,TL1赋值0x18。注意:定时/计数器的方式0为13位计数器,其不用的是低8位中的高三位,一般补三个0。3.任务设计

(1)硬件原理图设计

(2)软件程序设计

#include<AT89X51.h>

voidsTime()//定时1s子程序

{unsignedinti;TMOD=0x00;//设定时器1为方式0TH1=0x63;//置定时器初值

TL1=0x18;TR1=1;//启动T1

for(i=0;i<=200;){if(TF1==1)//查询计数溢出

{i++;TF1=0;TH1=0x63;//重新置定时器初值

TL1=0x18;}}return;

}

//发光二极管定时1s闪烁主程序

voidmain()

{for(;;){P1_0=!P1_0;//取反P1.0使发光二极管闪烁

sTime();//调用1s定时

}

}

方式1—16位方式

16位计数,由TL0作为低8位、TH0作为高8位。16位计数,由TL1作为低8位、TH1作为高8位。TF0T0TR0GATEINT01≥1&C/T=1C/T=0振荡器1/12TH0TL0低8位高8位16位计数器定时器计数器5.1.2.2用定时/计数器的工作方式1设计定时器定时=(216-X)×时钟周期×12

=(216–X)*12*1/fosc计数初值:X=216-T/(时钟周期×12)定时/计数器工作方式1X的低8位送TL0(TL1),高8位送TH0(TH1)。

定时方式:计数方式:计数次数值N=216-X计数初值:X=216-计数次数值N最大计数值M=216=655361.任务要求本任务要求用AT89C51的定时器0方式1设计一只1秒的定时器,使AT89C51的P0和P2端口控制的2组16只LED流水灯定时1秒滚动点亮。

2.任务分析①

确定TMOD控制字:

采用AT89C51的定时器0方式1定时,

TMOD=0x01。

②计算计数器的计数初值:

因为方式1采用16位计数器,其最大定时时间为:

65536×1ms=65.536ms,可选择定时时间为50ms,再循环20次就可以定时为1s了。X=

216-T/(时钟周期×12)=65536-50000=15536=0x3CB0所以TH0赋值0x3C

,TL0赋值0xB0。TH0=(65536-50000)/256;

TL0=(65536-50000)%256;3.任务设计

(1)硬件原理图设计(2)软件程序设计

#include<AT89X51.h>

#include<intrins.h>

#defineucharunsignedchar

//流水灯定时1s滚动主程序

voidmain()

{ucharT_Count=0;//累加计数溢出发生的次数

P0=0xFE;//点亮D1灯

P2=0xFE;//点亮D16灯

TMOD=0x01;//定时器0工作于方式1

TH0=(65536-50000)/256;//50ms定时初值

TL0=(65536-50000)%256;

TR0=1;//启动定时器

while(1)

{if(TF0==1)//定时溢出标志位为1时表示计时溢出

{TF0=0;//软件清零

TH0=(65536-50000)/256;//重置50ms定时

TL0=(65536-50000)%256;

if(++T_Count==20)//50*20=1000ms后LED滚动一次

{P0=_crol_(P0,1);

P2=_crol_(P2,1);

T_Count=0;

}

}

}

}

方式2—8位自动装入时间常数方式

TF0振荡器1/121≥1&T0TR0GATEINT0C/T=0C/T=1TL0TH0自动重装初值的8位计数方式

,适合于用作较精确的脉冲信号发生器。TH0(TH1)中保留初值5.1.2.3用定时/计数器的工作方式2设计定时器定时=(28-X)×时钟周期×12

=(28–X)*12*1/fosc计数初值:X=28-T/(时钟周期×12)定时/计数器工作方式2初值X分别送给TL0(TL1)和TH0(TH1)。定时方式:计数方式:计数次数值N=28-X计数初值:X=28-计数次数值N最大计数值M=28=2561.任务要求

本任务要求用AT89C51的定时器1方式2设计一只1秒的定时器,用定时器的查询方式,使AT89C51控制的一只发光二极管定时1秒闪烁。

2.任务分析①

确定TMOD控制字:

采用AT89C51的定时器1方式2定时,

TMOD=0x20。

②计算计数器的计数初值:

方式2采用8位计数器,其最大定时时间为:

256×1ms=256

s,可选择定时时间为250

s

,再循环4000

次就可以定时为1s。X=

28-计数值=256-250=6=0x06所以TH1赋值0x06,TL1也赋值0x06。3.任务设计

(1)硬件原理图设计

(2)软件程序设计

#include<AT89X51.h>

voidsTime(){unsignedinti; TMOD=0x20;//设定时器1为方式2 TH1=0x06;//置定时器初值

TL1=0x06; TR1=1;//启动T0

for(i=0;i<=4000;){if(TF1==1)//查询计数溢出

{i++;TF1=0;}}return;}

//发光二极管定时1s闪烁主程序voidmain(){while(1){P1_0=!P1_0;//取反P1.0使发光二极管闪烁

sTime();//调用1s定时

}}5.1.2.4用定时/计数器的工作方式3设计定时器方式3—2个8位方式

T0工作方式3结构图T0工作方式3时T1的结构图

仅T0可以工作在方式3,T1处于方式3时停止计数。此时T0分成2个独立的计数器—TL0和TH0,前者用原来T0的控制信号(TR0、TF0),后者用原来T1的控制信号(TR1、TF1)。(1)TH0由TR1启动/停止,TF1标志溢出(2)TL0由TR0启动/停止,TF0标志溢出(3)TH0只能定时,TL0可以定时/计数,且都是8位定时T=(28-X)*12/foscTL0计数初值X=28-N1.任务要求

本任务要求用AT89C51的定时器0方式3设计一只1秒的定时器,用定时器的查询方式,使AT89C51控制的一只发光二极管定时1秒闪烁。

2.任务分析①

确定TMOD控制字:因为采用AT89C51的定时器0方式3定时,这里采用TL0和TH0结合使用的方法,让TL0工作在计数方式,故TMOD=0x07。当TH0计满溢出后,用软件复位的方法使T0(P3.4)引脚产生负跳变,TH0每溢出一次,T0引脚便产生一个负跳变,TL0便计数一次。TL0计满溢出时,延时时间应为50ms,循环20次便可得到1s的延时。

②计算计数器的计数初值:

方式3中定时器0中的TH0只能作为定时器,TH0是8位计数器,其最大定时时间为:256×1us=256us,可选定时时间为250us。这样TH0的初值为X=(256-250)=6=0x06TL0设置为计数器,TL0是8位计数器,其最大计数值为256,可选择计数值为200。这样TL0计数初值为X=M-计数值=256-200=56=0x38所以TL0赋值0x38,TH0赋值0x06。

3.任务设计

(1)硬件原理图设计(2)软件程序设计

#include<AT89X51.h>

//定时1s子程序voidsTime(){unsignedinti;TMOD=0x07 ;//置定时器0为方式3计数

TH0=0x06;//置TH0初值

TL0=0x38;//置TL0初值

TR0=1;//启动TL0TR1=1;//启动TH0

for(i=0;i<=20;){if(TF0==0)//在TL0没有溢出时

{if(TF1==1)//查询TH0计数溢出

{TF1=0;TH0=0x06;//重置TH0初值

P3_4=0;//T0引脚产生负跳变

P3_4=0;//负跳变持续

P3_4=1;//T0引脚恢复高电平

} continue; } TF0=0; i++;TL0=0x38;//重置TL0初值

}return;}

//发光二极管定时1s闪烁主程序voidmain(){while(1){P1_0=!P1_0;//取反P1.0使发光二极管闪烁

sTime();//调用1s定时

}}

任务5.2脉冲计数器的设计1.任务要求要求用AT89C51设计一个计数范围为0~99的脉冲计数器,也就是用AT89C51的定时/计数器采样计数外部按键输送的脉冲信号,并用数码管将计数的数值显示出来。2.任务分析设置T0为计数方式,计数外部的脉冲,工作在方式2,所以TMOD=0x06。①确定TMOD控制字:方式2的最大计数值为256,如果把初值设置为255,当P3.4管脚接收到一个由高到低的下跳变时,计数值加1溢出,查询到TF0=1后,就将显示的计数值加1,实现脉冲计数器计数。这样将TL0的初值设置为X=(256-1)=255=0xFF

将TL0=0xFF,TH0=0xFF,每次溢出后TH0自动将初值装入TL0。②计算计数器的计数初值:3.任务设计

(1)硬件原理图设计(2)软件程序设计

#include<AT89X51.h>

//数码管段码定义unsignedcharcodeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,};unsignedcharcount=0;

voidmain()

{P0=DSY_CODE[0];

P2=DSY_CODE[0];

TMOD=0x06;//置定时器0为方式2计数

TH0=0xFF;//置TH0初值

TL0=0xFF;//置TL0初值

TR0=1;//启动TL0计数

while(1){if(TF0==1)//查询TF0是否为1{TF0=0;//TF0清零

count=(count+1)%100;//计数值控制在100以内

P0=DSY_CODE[count/10];//显示计数值高位

P2=DSY_CODE[count%10];//显示计数值低位

}if(P3_2==0)//查询到P3.2上有低电平

{count=0;//计数值清零

P0=DSY_CODE[0];//显示清零

P2=DSY_CODE[0];//显示清零

}

}

}

项目拓展STC89C52实验板分频器的设计

实验板采用的是STC89C52单片机,如附录2中“单片机与扩展插座”电路所示。我们要在P1.0~P1.7端口上产生不同频率的方波,周期分别为1ms、2ms、4ms、8ms、16ms、32ms、64ms、128ms,就相当于实现了不同级别的分频。1.任务要求2.任务分析首先,我们用STC89C52的定时/计数器来设置时间,选用T0的方式1第一个方波周期是1ms,方波周期的一半是500us,单片机外围的晶体采用的是12MHz,其机器周期是1us,所以每轮计数500次就可以达到500us,这样初值为(65536—500),高8位送TH0,低8位送TL0。

确定TMOD控制字和计算计数器的计数初值:十进制数二进制数(8位)100000001200000010300000011400000100500000101600

温馨提示

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

评论

0/150

提交评论