单片机应用技术(C 语言版)任务8 制作简易秒表_第1页
单片机应用技术(C 语言版)任务8 制作简易秒表_第2页
单片机应用技术(C 语言版)任务8 制作简易秒表_第3页
单片机应用技术(C 语言版)任务8 制作简易秒表_第4页
单片机应用技术(C 语言版)任务8 制作简易秒表_第5页
已阅读5页,还剩25页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

主编:李文华“十四五”职业教育国家规划教材经全国职业教育教材审定委员会审定制作简易秒表任务要求单片机系统的振荡频率fosc=11.0592MHz,定时/计数器T0工作在13位计数方式下,作定时器使用。单片机的P1口外接8只发光二极管显示电路,用来显示系统的时间。上电时系统从0秒开始计时,发光二极管以BCD码的形式显示开机的秒数。其中,P1.7~P1.4所接的4只发光二极管显示秒的十位,P1.3~P1.0所接4的只发光二极管显示秒的个位。相关知识1、定时/计数器的组成结构MCS-51单片机片内集成有T0、T1两个16位的可编程定时/计数器。它们具有定时和计数2种工作模式和4种工作方式。定时/计数器的其本结构如下图所示。i为T0或T1的参数标记由外部引脚P3.2/、P3.3/、P3.4/T0、P3.5/T1和特殊功能寄存器TL0、TH0、TL1、TH1、TCON、TMOD以及内部控制逻辑组成。

控制关系:控制C=(+)·TRi

GATE=0时,控制C=TRi,用TRi位控制计数器的运行和停止。GATE=1且TRi=1时,控制C=。用引脚的输入信号控制计数器的运行和停止。实际用法:一般情况:将GATE位设为0,用TRi位控制计数器的开启和停止。

需要测量外部脉冲宽度时:将GATE位设为1,TRi位设为1,外部脉冲从引脚引入,用外部脉冲控制计数器的开启和停止。

2、控制定时/计数器运行的特殊功能寄存器⑴模式寄存器TMOD功能:设置T0、T1的运行模式和工作方式字节地址为0x89,无位地址,只能以整字节方式访问,不能用位访问方式对TMOD的某一位进行单独操作。TMOD的格式如下:TMOD的位:D7D6D5D4D3D2D1D0字节地址:0x89GATEC/TM1M0GATEC/TM1M0T1T02、控制定时/计数器运行的特殊功能寄存器各位的含义:GATE位:门控位。GATE位与特殊功能寄存器TCON的TRi位以及外部引脚的状态组合起来控制定时/计数器Ti的开启与关闭,它们的控制关系如前图所示。一般情况下,GATE位的设置值为0。C/T位:定时/计数器运行模式选择控制位。C/T=0:定时器模式,此时定时/计数器作定时器使用。C/T=1:计数器模式,此时定时/计数器作计数器使用。M1、M0位:工作方式选择位。它们的取值组合用来确定定时/计数器的工作方式。⑴模式寄存器TMODM1、M0的取值组合与定时/计数器的工作方式之间的关系M1M0工作方式功能说明00方式013位计数方式01方式116位计数方式10方式28位自动重装初值工作方式11方式3若T0设置为方式3,T0被分成2个8位的定时计数器若T1设置为方式3,则T1的计数器停止计数单片机复位时,TMOD的值为0x00,这就意味着T0、T1均被设置成定时器,其工作方式为13位计数方式,并且使用TRi位控制计数器的开启和停止。2、控制定时/计数器运行的特殊功能寄存器TMOD的值与定时/计数器的工作模式如下表所示:工作模式TMOD的4位值工作模式TMOD的4位值定时方式00计数方式04定时方式11计数方式15定时方式22计数方式26定时方式33计数方式37【说明】①如果单片机系统中只使用了定时/计数器T1,TMOD的高4位取上表中的值,低4位设为0。②如果单片机系统中只使用了定时/计数器T0,TMOD的低4位取上表中的值,高4位设为0。③如果单片机系统中使用了定时/计数器T1和T0,TMOD的高低4位均取上表中的值。【例】单片机系统中使用了T0、T1两个定时/计数器,T0工作在方式1作定时器使用,T1工作在方式0作计数器使用。根据上表,TMOD的高4位(设置T1)的值为4,低4位(设置T0)的值为1,TMOD的值应该设置为0x41。设置TMOD的程序如下:TMOD=0x41; //T1:方式0、计数,T0:方式1、定时【例】单片机系统中只使用了定时/计数器T1,T1工作在方式2下作定时器使用,则TMOD的高4位的值为2,低4位应设置为0,TMOD的值为0x20。设置TMOD的程序如下:TMOD=0x20; //T1:方式2、定时2、控制定时/计数器运行的特殊功能寄存器⑵控制寄存器TCON各位分配有位地址,可以用位访问方式将TCON中的位置1或清0,格式如下:TCON的位:D7D6D5D4D3D2D1D0

字节地址:0x88TF1TR1TF0TR0IE1IT1IE0IT0TCON位地址:0x8f0x8e0x8d0x8c0x8b0x8a0x890x88

各位的含义如下:TFi位:定时/计数器的中断请求标志位。对应计数器的计数值达到模时,硬件电路自动将TFi位置1,并向CPU提出中断申请,CPU响应对应的定时中断请求,并进入中断服务程序中后,硬件电路自动将TFi位清0。TRi位:定时/计数器运行控制位。它与GATE位、引脚一起组合来控制定时/计数器的开启和停止。用于外部中断用于T1用于T0单片机复位时,TCON的值为0x00,这就意味着上电时T0、T1均被停止。2、控制定时/计数器运行的特殊功能寄存器3、定时/计数器的工作方式共4种方式⑴方式013位的工作方式,定时/计数器的基本结构见前图,其中的计数器为13位的计数器,它由TLi的低5位和THi的8位组成,TLi的高3位无效。方式0的计数器的结构如图所示。定时/计数器工作时,每来一个计数脉冲,TLi的值就加1,当TLi的低5位发生由11111B变至00000B时,THi加1。方式0计数器的模值M=213=8192当计数器的计数值达到模值8192时,计数值回0,硬件电路自动将TFi位置1。设定时/计数器的计数次数为n,方式0的计数初值x为:

x=M-n=8192-n 式中M为方式0的模值计数初值的低5位数:x%25=(8192-n)%32高8位数:x/25=(8192-n)/32计数初值的装入方法将x的低5位值装入TLi中,将x的高8位值装入THi中以T1为例,方式0的计数初值装入程序段如下:

TL1=(8192-n)%32; //计数初值的低5位数装入TL1中TH1=(8192-n)/32; //计数初值的高8位数装入TH1中定时/计数器作计数器使用时,计数器对P3.4/T0引脚(对于T0)或者P3.5/T1引脚(对于T1)上的输入脉冲进行计数,其计数次数n是已知数。定时/计数器作定时器使用时,计数器对机器周期计数,每隔一个机器周期其计数值就加1。设定时时长为t,单片机的晶振频率为fosc,则计数次数n为:

n=t/MC=(fosc×t)/12 式中的MC为机器周期。3、定时/计数器的工作方式【例】设单片机的晶振频率fosc=12MHz,现拟定用T0作1ms定时器,试求其在方式0下的计数初值x,并编写装入计数初值的程序段。【解】定时器的定时时长为1ms,则定时器的计数次数n为:n=(fosc×t)/12=(12×106×1×10-3)/12=1000方式0的模值为8192,所以,计数初值x=M-n=8192-1000=7192装入计数初值的程序段如下:TL0=(8192-1000)%32; //计数初值的低5位数装入TL0中TH0=(8192-1000)/32; //计数初值的高8位数装入TH0中3、定时/计数器的工作方式⑵方式116位的计数方式,结构与方式0的基本结构相同计数器为16位计数器,由TLi和THi组成,TLi为计数器的低8位,THi为计数器的高8位。计数器的模值M=216=65536,当计数器的计数值达到模值65536时,计数值回0,硬件电路自动将TFi位置1。3、定时/计数器的工作方式方式1的计数初值x为:x=M-n=65536-n 式中M为方式0的模值,n为计数次数方式1的计数初值装入方法:将x的低8位值(x%28=x%256)装入TLi中,将x的高8位值(x/28=x/256)装入THi中。以T1为例,方式0的计数初值装入程序段如下:TL1=(65536-n)%256; //计数初值的低8位数装入TL1中TH1=(65536-n)/256; //计数初值的高8位数装入TH1中8位自动重装初值的计数方式,结构如下图所示:在方式2下,TLi作计数器,THi用来存放计数初值,计数器的模值M=28=256。定时/计数器启动后,计数脉冲输入至TLi,TLi作加1计数,TLi计到模值256时,硬件电路将TFi置1,并向CPU请求中断,同时将THi中的计数初值自动装入TLi中,并在此初值的基础上重新计数。⑶方式2在启动定时/计数器之前,TLi和THi要装入相同的计数初值。在方式2下,不需要用软件重装计数初值,使用比较方便,但计数范围比较小。设计数次数为n,以T1为例,方式2的计数初值装入程序如下:TL1=256-n; //计数初值装入TL1中TH1=256-n; //计数初值装入TH1中3、定时/计数器的工作方式⑷方式32个8位计数器的工作方式,2个计数器的模值均为256。结构比较特殊,仅适用于定时/计数器0,如果将定时/计数器1设置成工作方式3,则定时/计数器1处于关闭状态。结构示意图如下:①T0工作在方式3时,要占用T1的资源,一般情况下不把T0设置成工作方式3,仅当T1处于工作方式2并且不需要中断请求标志位时(此时,T1作波特率发生器),才将T0设置成工作方式3。②T0工作在方式3时,用TH0作计数器的定时器由TR1控制其启动和停止。此时,单独停止T1的方法是,将T1的工作方式设置成方式3。停止T1的程序如下:TMOD=TMOD|0x30; //停止T1

3、定时/计数器的工作方式【例】设单片机的晶振频率fosc=6MHz,现拟定用T0作5ms定时器,问可以采用哪些工作方式?各种工作方式下的计数初值是多少?【解】定时器的定时长为5ms,其计数次数n为:n=(fosc×t)/12=(6×106×5×10-3)/12=2500方式2的模值256﹤n﹤方式0的模值8192所以,可以直接用方式0、方式1。若选用方式2或者方式3,则还需引入一个软件计数器。选用方式0时,其计数初值x为:

x=M-n=8192-2500=5692选用方式1时,其计数初值x为:

x=M-n=65536-2500=63033、定时/计数器的工作方式⑴初始化程序主要完成以下工作:①设置定时/计数器的运行模式、工作方式:根据定时/计数器的运行模式和工作方式查表,获取TMOD的值,并用赋值语句对TMOD赋值。4、定时/计数器的编程方法②设置计数初值:先计算计数器的计数次数n,然后用赋值语句将计数初值赋给THi、TLi。具体方法参考计数初值装入部分。③设置定时中断的优先级(开放了多个中断且为高级中断时):将特殊功能寄存器IP的PTi位置1。④开放定时中断(查询方式下不必设置):将ETi位置1。⑤开放全局中断(查询方式下不必设置):将EA位置1。⑥启动定时器:将TRi位置1。【例】单片机的fosc=6MHz,T0采用方式1作定时器使用,定时时长为10ms,T0为高优先级中断,试编写T0的初始化程序。【解】T0的计数次数为n=(fosc×t)/12=(6×106×10×10-3)/12=5000计数器的计数初值为TH0=(65536-5000)/256,TL0=(65536-5000)%256。查表可得TMOD的值为0x01。T0的初始化程序如下:void init_tim0(){TMOD=0x01; //T0:方式1、定时TL0=(65536-5000)%256; //T0计数器赋初值TH0=(65536-5000)/256;PT0=1; //T0为高优先级中断ET0=1; //开T0中断EA=1; //开全局中断TR0=1; //启动T0}init_tim0()函数中使用了MCS-51单片机的特殊功能寄存器,如果要引用此程序,还需要在程序的开头处用“#include<reg51.h>”编译预处理命令将特殊功能寄存器定义头文件“reg51.h”包含至程序中来,或者在程序的开头处对所使用的特殊功能寄存器单独定义。4、定时/计数器的编程方法⑵查询方式程序框架需要注意的问题:①查询的位是定时中断请求标志位TFi,TFi=1表示Ti的计数器已计满模值。②在查询方式中,中断请求标志位TFi不具备自动清0功能,必须在计数满模值的处理程序中用软件将TFi位清0。否则,同一次计数满模值事件将被多次处理。③除方式2外,其他工作方式都不具备自动重装计数初值的功能,需要对计数器重装计数初值。④在定时/计数器的初始化程序中,不必开定时中断,也不必设置定时/计数器的中断优先级。4、定时/计数器的编程方法设计数器的计数次数为n,定时/计数器0作定时器使用,并且采用方式1,查询方式的程序结构如下:void main(void){//局部变量定义TMOD=0x01; //设置T0的运行模式、工作方式TL0=(65536-n)%256; //计数器赋初值TH0=(65536-n)/256; //系统中其他软硬件初始化TR0=1; //启动定时器while(1) //while死循环{ if(TF0) //检测计数值是否达到模值

{TF0=0; //中断请求标志位清0 TL0=(65536-n)%256; //重置计数初值

TH0=(65536-n)/256; //计数值满模值后的事务处理

} //系统中其他事务处理}}4、定时/计数器的编程方法⑶中断方式程序框架①T0的中断类型号为1,T1的中断类型号为3。定时中断服务函数要选用第1~3组工作寄存器组。②除方式2外,需要在中断服务函数中对计数器重置计数初值。③CPU进入定时中断服务函数后,硬件电路会自动地将TFi清0,在中断服务函数中不必用软件将TFi位清0。4、定时/计数器的编程方法设计数器的计数次数为n,定时/计数器0作定时器使用并且采用方式1,中断方式的程序结构如下://全局变量定义void tim0(void)interrupt1 using 1 //中断服务函数{//局部变量定义TL0=(65536-n)%256; //重装初值TH0=(65536-n)/256; //计数值满模值后的事务处理}void main(void) //main函数{//局部变量定义TMOD=0x01; //设置T0的运行模式、工作方式TL0=(65536-n)%256; //T0计数器赋初值TH0=(65536-n)/256;

PT0=1; //设置定时中断优先级ET0=1; //开定时中断EA=1; //开全局中断//系统中其他软硬件初始化TR0=1; //启动定时器while(1) //while死循环{/*系统中其他事务处理*/ }}4、定时/计数器的编程方法任务实施1、搭建电路电路图如下:任务实施2、编写软件程序分析:fosc=11.0592MHz时,定时器定时的最长时间t为:t=方式1的模值×机器周期=65536×12/fosc=71.1ms<1s显然,不可能用定时器直接实现1s定时。解决问题的方法让定时器定时一个较短的时间T(例如10ms),此时间作为基准时间,用一个全局变量timcnt作软件计数器,对定时器的溢出次数(即定时中断服务函数执行的次数)进行计数。timcnt的初值为0,每次进入定时中断服务函数后将软件计数器timcnt的值加1,表示时间又过了一个定时周期T,然后对timcnt的值进行判断。若timcnt≥t/T,表明定时时间已到达t时间。这时,将软件计数器timcnt的值清0,然后作t时间到的相应处理。若timcnt<t/T,表示定时时间不足t时间,在程序中不作任何处理。这样,我们就可以用定时/计数器实现任何时长的定时。任务实施2、编写软件程序分析:(1)流程图任务实施2、编写软件程序(1)流程图#include <reg51.h> //1包含特殊功能寄存器定义头文件reg51.h#define portled P1 //2宏定义:portled代表P1(P1作LED端口)#define uchar unsignedchar //3宏定义:uchar代表unsignedcharuchar data timcnt,second; //4在data区定义全局变量timcnt、secondvoid display(uchar); //5display函数说明

void main(void) //6main函数{second=0; //7秒计数器赋初值0timcnt=0; //8中断次数计数器赋初值0TMOD=0x00; //9设置T0:定时,方式0TL0=(8192-4608)%32; //10计数初值5ms,初值的低5位装入TL0中TH0=(8192-4608)/32; //11计数初值的高8位装入TH0中ET0=1; //12开定时中断EA=1; //13开全局中断TR0=1; //14启动定时器T0while(1) //15while死循环,语句16为循环体{;} //16CPU空运行} //17main函数结束

定时中断T0服务函数

2、编写软件程序void tim0() interrupt1 using 1 //18中断类型号为1,使用第1组工作寄存器组{TL0=(8192-4608)%32; //19重装计数初值,初值的低5位装入TL0TH0=(8192-4608)/32; //20计数初值的高8位装入TH0中timcnt++; //21中断次数(每次5ms)计数值加1if(timcnt>=200) //22计满1s吗?{ timcnt=0; //23中断次数计数值回0 second++; //24秒计数值加1 if(second>=60) second=0; //25若满1分,秒计数回0} //26计满1s处理结束display(second); //27调用display函数显示秒数} //28中断服务函数结束

当前中断服务要使用前一次中断服务中的timcnt和second值,这两个变量必须定义成全局变量。

#include <reg51.h> //1包含特殊功能寄存器定义头文件reg51.h#define portled P1 //2宏定义:portled代表P1(P1作LED端口)#define uchar unsignedchar //3宏定义:uchar代表unsignedcharuchar data timcnt,second; //4在data区定义全局变量timcnt、secondvoid display(uchar); //5display函数说明

本程序的开头处是这样定义的显示函数

void display(uchar time) //29display:无返回值,形参为uchar型{ //30函数体开始portled=~((

温馨提示

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

评论

0/150

提交评论