新書推薦:
《
慈悲与玫瑰
》
售價:HK$
87.4
《
启蒙的辩证:哲学的片简(法兰克福学派哲学经典,批判理论重要文本)
》
售價:HK$
76.2
《
云中记
》
售價:HK$
76.2
《
中国古代妇女生活(中国古代生活丛书)
》
售價:HK$
47.0
《
你的认知正在阻碍你
》
售價:HK$
65.0
《
我们身边的小鸟朋友:手绘观鸟笔记
》
售價:HK$
78.2
《
拯救免疫失衡
》
售價:HK$
55.8
《
收尸人
》
售價:HK$
72.8
|
編輯推薦: |
《单片机原理、应用及Proteus仿真》以让读者掌握单片机应用技能为目标,将单片机仿真软件Proteus和Keil-Vision引入到单片机课程教学和实践教学中,并使之与现行教学大纲和实验大纲基本内容紧密融合。基于STC89C52单片机,讲述单片机基本原理、硬件结构、指令系统、单片机外部电路、硬件接口等内容,还介绍了如何使用Proteus进行单片机仿真,并精选了10个单片机编程实验项目。
|
內容簡介: |
本书选用的STC89C52单片机是51系列单片机的增强型,它完全兼容传统51系列单片机,具有可在线编程、开发方便的特点。 书中系统、全面地介绍STC89C52单片机的基本原理、硬件结构,并从应用的角度介绍C51语言程序设计、单片机外部电路的扩展,以及与键盘、LED显示器、LCD显示器、打印机等多种硬件接口的设计方法,详细介绍串行接口以及AD、DA转换器的功能特点和典型应用,增加了单片机应用系统设计、Proteus仿真和实验等内容。 本书内容丰富实用,层次清晰,叙述详尽,方便教学与自学,可作为高等院校电子信息工程、通信工程、电气自动化、自动控制、智能仪器仪表、电气工程、机电一体化、计算机科学与技术等专业单片机原理及应用课程的教材,也可作为工程技术人员进行单片机系统开发的参考书。
|
目錄:
|
目录
第1章概述
1.1计算机的发展
1.2单片机的定义
1.3单片机的发展概况
1.3.1单片机的发展历史
1.3.2单片机的发展趋势
1.4单片机的特点及分类
1.4.1单片机的特点
1.4.2单片机的分类
1.5单片机的应用
1.6常用单片机系列
1.6.18051内核的单片机
1.6.2PIC内核的单片机
1.6.3其他公司8位单片机
本章小结
思考题
第2章STC89C52系列单片机体系结构
2.1STC89C52单片机的内部结构及特点
2.2STC89C52单片机的外部引脚及功能
2.3中央处理器
2.3.1运算器
2.3.2控制器
2.3.3程序执行过程
2.4STC89C52单片机存储器结构
2.4.1STC89C52单片机程序存储器
2.4.2STC89C52单片机数据存储器
2.4.3STC89C52单片机特殊功能寄存器
2.5STC89C52单片机IO口
2.5.1P0端口
2.5.2P1P2P3P4端口
2.5.35V单片机连接3V器件
2.6STC89C52单片机的时钟
2.6.1传统51单片机时序
2.6.2STC89C52单片机时序
2.6.3STC89C52单片机时钟电路
2.7STC89C52单片机的复位
2.7.1STC89C52单片机的复位电路
2.7.2STC89C52单片机的复位状态
2.8STC89C52单片机的省电工作模式
本章小结
思考题
第3章C51语言编程基础
3.1编程语言Keil C51简介
3.1.1Keil C51简介
3.1.2C51与标准C的比较
3.2Keil C51语言基础知识
3.2.1关键字
3.2.2数据类型
3.2.3数据的存储类型
3.2.4数据的存储模式
3.2.5C51语言的特殊功能寄存器及位变量定义
3.2.6C51语言的绝对地址访问
3.2.7C51的运算符
3.2.8C51的数组
3.2.9C51的指针
3.3C51语言的函数
3.3.1函数的分类
3.3.2函数的参数与返回值
3.3.3函数的调用
3.3.4中断服务函数
3.3.5变量及存储方式
3.3.6宏定义与文件包含
3.3.7库函数
3.4C51程序设计举例
3.4.1分支结构程序
3.4.2循环结构程序
本章小结
思考题
第4章STC89C52单片机的中断系统
4.1概述
4.1.1中断的概念
4.1.2引进中断技术的优点
4.1.3中断源
4.1.4中断系统的功能
4.2STC89C52单片机的中断系统
4.2.1中断系统结构
4.2.2中断源
4.2.3中断请求标志
4.2.4中断控制寄存器
4.3中断处理过程
4.3.1中断响应
4.3.2中断处理
4.3.3中断返回
4.3.4中断请求的撤除
4.3.5中断响应时间
4.4中断程序的设计
4.4.1单一外中断的应用
4.4.2两个外中断的应用
4.4.3中断嵌套
本章小结
思考题
第5章STC89C52单片机定时计数器接口及应用
5.1STC89C52定时计数器的组成
5.1.1定时计数器0和1
5.1.2与T0T1相关的寄存器
5.2定时计数器的工作方式
5.2.1方式0
5.2.2方式1
5.2.3方式2
5.2.4方式3
5.3定时计数器01的编程
5.4定时计数器01的应用
5.5定时计数器2
5.5.1与定时计数器2相关的寄存器
5.5.2定时计数器2的三种工作方式
5.5.3定时计数器2的应用
本章小结
思考题
第6章STC89C52单片机串行通信
6.1串行通信概述
6.1.1同步通信和异步通信方式
6.1.2串行通信的数据传送速率
6.1.3串行通信的制式
6.1.4信号的调制与解调
6.1.5通信协议
6.2STC89C52单片机串行口的结构
6.2.1内部硬件结构
6.2.2串行口特殊功能寄存器
6.3串行口的4种工作方式
6.3.1方式0
6.3.2方式1
6.3.3方式2
6.3.4方式3
6.4波特率的设定与计算
6.5串行口的应用
6.5.1串行口作串并转换的应用
6.5.2串行口作双机通信接口的应用
6.5.3串行口多机通信接口
6.6PC与多个单片机间通信
6.6.1采用RS232C标准总线通信
6.6.2采用RS422A标准总线通信
本章小结
思考题
第7章STC89C52单片机系统扩展
7.1系统扩展概述
7.1.1单片机的外部扩展总线
7.1.2系统扩展常用芯片
7.1.3系统扩展的寻址方法
7.2存储器的扩展
7.2.1程序存储器扩展概述
7.2.2数据存储器扩展概述
7.2.3E2PROM和RAM的综合扩展
7.3并行IO接口的扩展
7.3.1IO接口概述
7.3.2简单的IO扩展
7.3.3可编程接口芯片8255扩展并行接口
7.4串行总线扩展
7.4.1单总线串行扩展
7.4.2I2C总线
7.4.3SPI总线串行扩展
本章小结
思考题
第8章单片机接口技术应用
8.1键盘接口电路
8.1.1独立式键盘
8.1.2矩阵式键盘
8.2LED显示接口电路
8.2.1LED显示器
8.2.2LED数码管显示器接口设计举例
8.3键盘与LED显示器综合设计电路
8.3.1利用并行IO芯片82C55实现的键盘显示器接口
8.3.2利用串行口实现的键盘显示器接口
8.3.38279键盘、显示器接口电路
8.4LCD显示接口电路
8.4.112864点阵液晶显示模块的原理
8.4.212864驱动程序
8.4.312864的应用
8.5STC89C52单片机与微型打印机TPP40A16A的接口
本章小结
思考题
第9章STC89C52单片机与AD、DA转换器的接口
9.1STC89C52单片机与AD转换器的接口
9.1.1AD转换器简介
9.1.2STC89C52单片机与并行8位AD转换器ADC0809的接口
9.1.3STC89C52与并行12位AD转换器AD1674的接口
9.1.4STC89C52单片机与VF转换器的接口
9.2STC89C52单片机与DA转换器的接口
9.2.1DA转换器简介
9.2.2STC89C52单片机与8位DA转换器DAC0832的接口设计
本章小结
思考题
第10章STC89C52单片机应用系统设计
10.1概述
10.2MCS51单片机应用系统设计
10.2.1总体设计
10.2.2硬件设计
10.2.3软件设计
10.2.4可靠性设计
10.2.5单片机应用系统的调试与测试
10.3单片机应用系统举例
10.3.1单片机在控制系统中的应用
10.3.2单片机在里程和速度计量中的应用
10.3.3单片机在家用电器中的应用
10.3.4基于STC89C52单片机的万年历的设计
本章小结
思考题
第11章单片机应用系统开发简介
11.1集成开发环境Keil C51简介
11.1.1Keil Vision2运行环境介绍
11.1.2Keil C51的安装
11.1.3Keil C51的使用
11.2集成开发工具Proteus简介
11.2.1Proteus概述
11.2.2Proteus的运行环境
11.2.3Proteus VSM的资源库和仿真工具
11.2.4Proteus ISIS初识
11.2.5Proteus设计与仿真基础
11.3Keil C与Proteus连接调试
本章小结
思考题
第12章STC89C52单片机实验与指导
12.1实验一P1口输入输出实验
12.2实验二继电器控制实验
12.3实验三8255输入输出实验
12.4实验四计数器实验
12.5实验五外部中断实验
12.6实验六定时器实验
12.7实验七AD转换实验
12.8实验八外部中断实验急救车与信号灯
12.9实验九交通灯控制实验
12.10实验十直流电机实验
本章小结
思考题
附录ASTC89C52单片机程序ISP烧录
参考文献
|
內容試閱:
|
前言20世纪90年代,单片机在我国迅速普及。如今,由单片机作为主控制器的全自动洗衣机、高档电风扇、电子厨具、变频空调、遥控彩电、摄像机、VCDDVD机、组合音响、电子琴等产品早已遍布人们的生活。从家用消费类电器到复印机、打印机、扫描仪、传真机等办公自动化产品,从智能仪表、工业测控装置到CT、MRI等医疗设备,从数码相机、摄录一体机到航天技术、导航设备、现代军事设备,从形形色色的电子货币(如电话卡、水电气卡)到身份识别卡、门禁控制卡、档案管理卡以及相关读写卡终端机等,单片机都在里面扮演重要角色。因此有人说单片机无处不在,无所不能。从学习的角度看,单片机作为一个完整的数字处理系统,具备构成计算机的主要单元部件,在这个意义上称之为单片微机并不过分。通过学习和应用单片机进入计算机硬件设备之门,可达到事半功倍的效果。从应用的角度看,单片机是一种大规模集成电路,可自成一体,相对于其他微处理器所需的大量外部器件的连接都在单片机内部完成,各种信息传递的时序关系变得非常简单,易于理解和接受。用单片机实现某个特定的控制功能十分方便。从设计思想看,单片机的应用意味着从以硬件电路设计为主的传统设计方法向以软件设计为主的、对单片机内部资源及外部引脚功能加以利用的设计方法的转变,从而使硬件成本大大降低,设计工作灵活多样。往往只需改动部分程序,就可以增加产品的功能,提高产品的性能。总之,单片机不同于通用微型计算机,它能够灵活地嵌入到各类电子产品中,使电子产品具备智能化和傻瓜化操作,已经成为电子自动化技术的核心基础。因此,学习单片机非常有必要。本书选用STC89C52单片机,它以MCS51为内核。选用该单片机最主要的原因是其具有在系统可编程功能(ISP),无须专用编程器,可通过串口直接下载用户程序,便于开发,因此受到初学者特别是学生的青睐。同时,由于该单片机可有效缩短系统开发时间,因此亦可被开发人员所使用。本书以读者掌握单片机应用技能为目标,将单片机仿真软件Proteus和Keil Vision引入单片机课程教学和实践教学中,并使之与现行教学大纲和实验大纲的基本内容紧密融合。通过单片机仿真实验,在模拟的应用环境下培养学生的单片机专业技能,不再受实验器材和实验学时的限制,并解决了以往基于电路实验箱教学验证性实验偏多带来的学生难以得到足够动手机会和教学实践效果不理想的问题。这种虚拟仿真平台便于学习者灵活、大胆地进行单片机电路设计、软件开发和系统调试的训练,能够极大程度地激发学生的学习兴趣,提高其学习效果。本书共分为13章。第1章是概述,介绍单片机的发展历程、应用领域和各种常用的低功耗单片机、增强型单片机的性能特点,并介绍国产STC系列单片机的选型; 第2章针对STC89C52单片机的硬件结构进行详细说明,特别是STC89C52的存储器结构、IO端口、时钟复位方式和省电工作模式,指出了该单片机与传统51单片机的不同之处; 第3章介绍单片机设计中普遍采用的C51编程语言,并且特别指出C51语言与标准C的区别,即C语言在单片机设计中应注意的地方; 第4章介绍STC89C52单片机中断基本概念、中断响应及处理方法等; 第5章介绍STC89C52单片机的定时计数器T0、T1和T2; 第6章介绍STC89C52单片机串行口的内部结构、串行口的4种工作方式以及4种工作方式下波特率的计算方法、串行口多机通信的工作原理以及双机串行通信的软件编程; 第7章介绍STC89C52单片机的系统扩展,如外扩ROM、RAM以及串行总线等; 第8章介绍STC89C52单片机应用系统的人机接口,配置输入外设和输出外设; 第9章介绍典型的ADC、DAC集成电路芯片,以及与STC89C52单片机的硬件接口设计及软件设计; 第10章介绍如何根据需求进行系统设计; 第11、12章以STC89C52单片机应用实验为主,介绍使用Proteus进行单片机仿真,精选了10个单片机编程实验项目。本书内容丰富,体系完整,编写工作由多位作者共同完成,具体分工为: 李传娣编写第1章和第8章,赵常松编写第2章和第9章,李继超编写第3章和第4章,王慧莹编写第5章和第6章,魏娜编写第10章,吴显义编写第7章,第11章由李传娣、赵常松、李继超和魏娜共同编写,第12章由王慧莹、魏娜和吴显义共同编写。参加本书编写工作的还有贾春凤、杨兴全和吴登娥,在此对他们付出的辛勤工作表示衷心感谢!由于本书涉及的知识点较多,并且编写时间仓促,难免有不足和疏漏之处,欢迎广大读者提出宝贵意见和建议,以便进一步改进和提高,使之满足实际教学的需要。
作者2016年8月
第5章STC89C52单片机定时计数器接口及应用
本章学习要点: STC89C52单片机定时计数器0、1、2的内部结构和工作原理。 定时计数器的控制寄存器设置和工作方式选择。 定时计数器初值计算、初始化设计和定时计数器中断的应用。在测控系统中,常常需要有实时时钟和计数器,以实现定时控制以及对外界事件进行计数。传统8051系列单片机有2个16位定时计数器,它们是定时计数器0、定时计数器1,STC89C52单片机在此基础上增加一个16位定时计数器2,简称为T0、T1和T2。5.1STC89C52定时计数器的组成传统8051系列单片机定时计数器由T0和T1组成,STC89C52单片机在此基础上增加一个T2。T0由特殊功能寄存器TH0T0高8位、TL0T0低8位构成,T1由特殊功能寄存器TH1T1高8位、TL1T1低8位构成,T2由特殊功能寄存器TH2T2高8位、TL2T2低8位和RCAP2HT2重装捕获高8位、RCAP2LT2重装捕获低8位构成。它们具有2种工作模式即定时器和计数器,定时是计片内时钟脉冲个数,计数是计片外时钟脉冲个数,T0和T1有4种工作方式方式0、方式1、方式2和方式3。T2有3种工作方式自动重装初值的16位定时计数器、捕获事件、波特率发生器。5.1.1定时计数器0和1STC89C52单片机的T0和T1,与传统8051的定时计数器完全兼容。当T1作波特率发生器时T0可以当两个8位定时器使用。STC89C52单片机内部设置的两个16位定时计数器T0和T1都具有定时和计数两种工作模式,在特殊功能寄存器TMOD中有一位控制位来选择T0或T1为定时器还是计数器,定时计数器的核心部件是一个加法计数器,其本质是对脉冲进行计数。只是计数脉冲来源不同: 如果计数脉冲来源于系统时钟,则为定时方式,此时定时计数器每12个时钟或每6个时钟得到一个计数脉冲,计数值加1; 如果计数脉冲来自单片机外部引脚T0为P3.4,T1为P3.5,则为计数方式,每来一个计数脉冲计数值加1。当定时计数器工作在定时模式时,可在烧录用户程序时(即STCISP编程器中)设置见第2章来确定计数脉冲为系统时钟1212T模式还是系统时钟66T模式,然后T0和T1对该计数脉冲进行计数。当定时计数器工作在计数模式时,对外部计数脉冲计数不分频。5.1.2与T0T1相关的寄存器STC89C52单片机T0T1的相关寄存器是TMOD和TCON。特殊功能寄存器TMOD用于选择定时计数器0、1的工作模式和工作方式,TCON用于控制定时计数器0、1的启动和停止,同时还包含了定时计数器0、1的状态。它们的内容由软件设置或查询,单片机复位时,TMOD、TCON的各位均为0。1. 工作方式控制寄存器TMOD工作方式控制寄存器TMOD用于选择定时计数器0、1的工作模式和工作方式,它的字节地址为89H,不可位寻址,其格式如表51所示。
表51工作方式控制寄存器TMOD的格式
符号字节地址位名称复位值
TMOD89HGATECM1M0GATECM1M00000 0000
8位分为两组,高4位为定时计数器1的方式控制字段,低4位为定时计数器0的方式控制字段。其功能如下。1 M1、M0: 定时计数器工作方式选择位定时计数器有四种工作方式,由M1、M0两位的状态确定,对应关系如表52所示。
表52定时计数器工作方式选择表
M1M0方式功 能 说 明
00013位定时器TH的8位和TL的低5位01116位定时器计数器102自动重装入初值的8位计数器113T0分成两个独立的8位计数器,T1在方式3时停止工作
2 C: 定时计数器工作模式选择位C=0时,定时计数器为定时器方式,定时计数器对晶振脉冲的分频信号机器周期进行计数,从定时计数器的计数值便可求得计数时间,因此称为定时器方式。C=1时,定时计数器为计数器方式,定时计数器对外部引脚T0P3.4或T1P3.5上输入的脉冲进行计数。CPU在每个机器周期的S5P2期间,对T0或T1引脚进行采样,如在前一个机器周期采得的值为1,后一个机器周期采得的值为0,则计数器加1。由于确认一次负跳变需要两个机器周期,因此最高计数频率为晶振频率的12412T模式或1126T模式。3 GATE: 门控位GATE=0时,定时计数器只由软件控制位TRxx为0或1来控制启停。TRx位为1时,定时计数器启动工作; 为0时,定时计数器停止工作。GATE=1时,定时计数器的启动要受外部中断引脚和TRx共同控制。只有当外部中断引脚INT0或INT1为高电平时,同时TR0或TR1置1时,才能启动定时计数器0或定时计数器1。2. 定时计数器控制寄存器TCON定时计数器控制寄存器TCON的字节地址为88H,可位寻址,其格式如表53所示。
表53定时计数器控制寄存器TCON的格式
符号字节地址位名称复位值
TCON88HTF1TR1TF0TR0IE1IT1IE0IT00000 0000
低4位与外部中断有关,已在第4章中介绍,高4位的功能如下。1 TR0: T0运行控制位,其功能与TR1类似。2 TF0: T0溢出中断请求标志位,其功能与TF1类似。3 TR1: T1运行控制位。TR1置1时,T1开始工作; TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时计数器的启动与停止。4 TF1: T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。T1工作时,CPU可随时查询TF1的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。5.2定时计数器的工作方式5.2.1方式0
定时计数器工作在方式0时,为13位计数方式,图51是定时计数器1方式0的逻辑框图定时计数器0与之类似。
图51定时计数器1方式0的逻辑结构
方式0的13位计数器是由TH1的全部8位和TL1的低5位构成,TL1低5位计数溢出则向TH1进位,TH1计数溢出则置位溢出标志TF1,向CPU申请中断或供CPU查询。如图51所示,C位控制的电子开关决定了定时计数器的工作模式。1 当C=1时,电子开关打在下方位置,定时计数器工作为计数器方式,计数脉冲为T1P3.5引脚上的外部输入脉冲。2 当C=0时,电子开关打在上方位置,定时计数器工作为定时器方式,计数脉冲为CPU晶体振荡器分频后产生的机器周期信号。控制计数器启动、停止的信号主要是门控位GATE和运行控制位TR1。GATE=0时,定时计数器运行只取决于TR1; GATE=1时,则由TR1和INT1共同决定。如图51所示,GATE=0时,或门输出总是1与INT1无关。若TR1=1,与门输出为1,控制电子开关闭合,计数器从TH1、TL1中的初值开始计数,直到溢出。若TR1=0,则封锁与门,电子开关断开,计数器无计数脉冲,停止计数。GATE =1时,则或门的输出状态受INT1控制。当INT1=1时,或门输出为1,若TR1=1,与门输出为1,控制电子开关闭合,计数器从TH1、TL1中的初值开始计数,直到溢出。当INT1=0时,或门输出为0,此时不论TR1为何状态,与门输出均为0,电子开关断开,计数器无计数脉冲,停止计数。5.2.2方式1定时计数器工作在方式1时,为16位计数方式,图52是定时计数器1方式1的逻辑结构框图定时计数器0与之类似。方式1的结构和工作过程几乎与方式0完全相同,唯一的区别是计数器的长度为16位TH1作高8位、TL1作低8位。
图52定时计数器1方式1的逻辑结构
5.2.3方式2定时计数器工作在方式2时,为8位自动重装载初值的计数方式。方式0、方式1在每次计数溢出时,寄存器THx、TLxx为0或1全部为0,若要重复循环定时或计数,还要重新装入计数初值。这样不仅编程麻烦,而且影响定时时间精度。方式2克服了它们的缺点,能自动重装计数初值。定时计数器1方式2的逻辑结构定时计数器0与之类似如图53所示。
图53定时计数器1方式2的逻辑结构
寄存器TL1作8位计数器用,寄存器TH1作为8位常数缓冲器,保存计数初值。当TL1计数产生溢出时,在TF1置1的同时,将保存在TH1中的计数初值自动装入TL1中,使TL1从设定的初值重新计数,如此循环不止。5.2.4方式3方式3是把定时计数器0拆成两个独立的8位定时计数器使用,从而使得单片机具有3个定时计数器。方式3只适用于定时计数器0,定时计数器1不能工作在方式3,如果使定时计数器1工作在方式3,则定时计数器1将处于关闭状态。定时计数器0方式3的逻辑结构如图54所示。
图54定时计数器0方式3的逻辑结构
定时计数器0在该方式下被拆成两个独立的8位计数器TL0和TH0,其中TL0使用原来定时计数器0的控制位C、GATE、TR0、TF0和引脚INT0、T0,其功能和操作与方式0、方式1完全相同,可作定时器也可作计数器用。该方式下的TH0被固定为8位的定时器模式,只能对内部的机器周期计数,它借用原定时计数器1的控制位TR1和TF1,同时占用了定时计数器1的中断请求源。当定时计数器0工作在方式3时,虽然定时计数器1仍可工作在方式0、方式1和方式2,但由于TH0占用了TR1和TF1,定时计数器1的启停不受TR1的控制,也不能向CPU申请中断,所以此时定时计数器1只能工作在不需要中断的场合。这时,定时计数器1往往工作在方式2,作为串行口波特率发生器使用。定时计数器0工作在方式3时,定时计数器1的各种工作方式示意图如图55((a)~(c))所示。
图55定时计数器0工作在方式3时定时计数器1的各种工作方式示意图
5.3定时计数器01的编程1. 定时计数器01初始化的步骤
定时计数器的功能是由软件编程确定的,一般在使用定时计数器前都要对其进行初始化,使其按设定的功能工作。定时计数器初始化的步骤一般如下。1 确定工作方式即对TMOD赋值。2 预置定时计数器的初值,可直接将初值写入TH0、TL0或TH1、TL1。3 根据需要决定是否开放定时计数器的中断,直接对IE对应位赋值。4 启动定时计数器。若步骤(1)中设定为非门控方式GATE=0,则将TRxx为0或1置1,定时计数器即开始工作; 若设定为门控方式GATE=1,则必须由外部引脚INTXx为0或1和TRx共同控制,只有当INTX引脚为高电平时,将TRx置1才能启动定时计数器工作。定时器一旦启动就按规定的方式定时或计数。2. 定时计数器01初值的计算因为在不同工作方式下定时计数器的计数位数不同,因而对应的最大计数值或最长定时时间也不同。定时计数器各工作方式下的最大计数值和最长定时时间如下。方式0: 最大计数值=213= 8192,最长定时时间=8192TcyTcy为机器周期。方式1: 最大计数值= 216= 65536,最长定时时间=65536Tcy。方式2: 最大计数值= 28= 256,最长定时时间=256Tcy。方式3: 定时器0分成两个8位计数器,其最大计数值均为256,最长定时时间均为256Tcy。因为定时计数器是作加1计数,并在计数溢出时产生中断,因此初值可以这样计算。工作在计数器模式下: 初值=最大计数值-计数值工作在定时器模式下: 初值=最大计数值-定时时间Tcy5.4定时计数器01的应用1. 工作方式0的应用例51设STC89C52单片机系统时钟频率fosc为6MHz,要在P1.0引脚上输出1个周期为2ms的方波,请采用中断方式编写C51程序。分析计算计数初值: 如果单片机工作在12T模式,那么Tcy=2s=210-6s,T0工作方式0,则最大计数值为8192,按照题意高低电平的定时时间=1ms;由于初值=最大计数值-定时时间Tcy因此初值=8192-1ms2s=7692=1E0CH= 1111000001100B由于13位数高8位装入TH0,即TH0=0F0H; 低5位放入TL0,即TL0=0CH。C51参考程序如下。
#include
sbitP10=P1^0;
voidmain{
SP=0x60;*设置堆栈指针*
TMOD=0x1;*定时器0: 定时、工作方式1、门控GATE0=0*
TL0=0x0c;*装载计数初值*
TH0=0xf0;
TR0=1; *启动定时器0计数*
ET0=1;*允许定时器0中断*
EA=1;*允许CPU中断*
while1{
}
}
voidtimer0intvoidinterrupt1 {
TL0=0x00; *重装载计数初值*
TH0=0xfe;
P10= ! P10;*P1.0输出求反*
}
2. 工作方式1的应用例52T0采用工作方式1实现例51的要求。分析计算计数初值: 如果单片机工作在12T模式,那么Tcy=2s=210-6s,T0工作方式1,则最大计数值为65536,按照题意定时时间=1ms;由于初值=最大计数值-定时时间Tcy因此初值=65536-1ms2s=65036=FE0CH即TH0=0FEH、TL0=0CH。C51参考程序如下。
#include
sbitP10=P1^0;
voidmain{
SP=0x60; *设置堆栈指针*
TMOD=0x1;*定时器0: 定时、工作方式1、门控GATE0=0*
TL0=0x0c;*装载计数初值*
TH0=0xfe;
TR0=1; *启动定时器0计数*
ET0=1;*允许定时器0中断*
EA=1;*允许CPU中断*
while1{
}
}
voidtimer0intvoidinterrupt1 {
TL0=0x0c; *重装载计数初值*
TH0=0xfe;
P10= ! P10;*P1.0输出求反*
}
例53设STC89C52单片机系统时钟频率fosc为6MHz,请编出利用定时计数器T0在P1.1引脚上产生周期为2s,占空比为50%的方波信号的程序。
分析方波信号程序可分两部分,其过程如下。1 主程序任务① 设定T0工作方式1,单片机工作在12T模式,则机器周期为2s,最大定时=2162s=131.072ms
#define uchar unsigned char
uchar COUNT=0;
sbitP11=P1^1;
voidmain{
SP=0x60;*设置堆栈指针 *
TMOD=0x1;*设置T0为定时,工作方式1,GATE0=0 *
TL0=0xb0;*装载定时计数初值=100ms*
TH0=0x3c;
IE=0x82;*定时计数溢出中断允许,CPU中断允许*
TR0=1;*启动定时器0计数*
COUNT=0xa;*软件计数初值=10 *
while1{*踏步等待中断*
}
}
void timer0intvoid interrupt 1 {*定时器0中断函数*
TL0=0xb0; TH0=0x3c;*重新装载定时计数初值*
switchCOUNT{*判断定时1s吗?*
case 0:{P11= ! P11; COUNT=0xa; break;}
*1s定时到,P1.1输出求反*
default:{COUNT=COUNT-1;break;}
* 没到1s,软件计数值减1*
}
}
例54设系统时钟频率为12MHz,编程实现: P1.1引脚上输出周期为1s,占空比为20%的脉冲信号。分析单片机工作在12T模式,定时时间为50ms,编程实现高电平时间为450ms、低电平时间为1650ms即可。C51参考程序如下。
#include
sbitP1_1=P1^1;
unsignedchari;定义计数变量
voidmain
{i=0; 初始化
TMOD=0x01;
TH0=65536-50000256;
TL0=65536-50000%256;
EA=1;ET0=1;
TR0=1;
while1;
}
voidtime0_intvoidinterrupt1中断服务程序
{
TH0=65536-50000256;重载初始值
TL0=65536-50000%256;
i=i 1;
ifi==4P1_1=0;高电平时间到变低
elseifi==20周期时间到变高
{P1_1=1;
i=0;计数变量清零
}
}
3. 工作方式2的应用
图56负跳变触发输出一个周期为1ms的方波
例55将STC89C52的T0P3.4引脚上发生负跳变信号作为P1.0引脚产生方波的启动信号。要求P1.0脚上输出周期为1ms的方波,如图56所示系统时钟6MHz。试分别采用中断和查询方式编写C51程序。
分析分别按中断方式及查询方式进行分析和编写程序。1 中断方式T0设为方式2计数,TH0=TL0=FFH。当外部计数输入端T0P3.4发生一次负跳变时,T0计数器加1则溢出,溢出标志位TF0置1,向CPU申请中断,此时T0相当于一个负跳沿触发的外部中断源。进入T0中断服务程序,说明T0引脚上已接收负跳变信号,则启动T1,而T1设置为方式2定时,每隔500s产生一次中断,在T1中断服务子程序中对P1.0求反,使P1.0产生频率为1kHz周期为1ms的方波。由于省去重新装载初值指令,所以可产生精确的定时时间。C51参考程序如下。
#include
sbitP10=P1^0;
voidmain {
SP=0x60;*设堆栈指针 *
TMOD=0x26;*T0方式2计数,T1方式2定时 *
TL0=0xff;*T0设置计数初值,计1个脉冲 *
TH0=0xff;
TL1=0x06;*T1设置定时初值 *
TH1=0x06;
ET0=1;*允许T0中断 *
ET1=1;*允许T1中断 *
EA=1;*允许总中断 *
TR0=1;*启动T0计数*
while1{*踏步等待中断*
}
}
******计数器0中断服务子程序 ******
void timer0xintvoid interrupt 1{
TR0=0;*禁止计数器0计数*
TR1=1;*启动定时器1 *
}
******定时器1中断服务子程序******
void timer1Tintvoid interrupt 3 {
P10=!P10;*P1.0输出求反*
}
2 查询方式当TF0置1软件查询TF0时,说明T0引脚上已接收负跳变信号,则启动T1,而T1设置为方式2定时,定时时间为500s,计满溢出软件查询TF1时对P1.0取反,则P1.0产生频率为1kHz的方波。由于采用查询方式,所以软件清零标志位为TF0和TF1。C51参考程序如下。
#include
sbitP10=P1^0;
voidmain {
SP=0x60;*设堆栈指针 *
TMOD=0x26;*T0方式2计数,T1方式2定时 *
TL0=0xff;*T0设置计数初值,计1个脉冲 *
TH0=0xff;
TL1=0x06;*T1设置定时初值 *
TH1=0x06;
TR0=1;*启动T0计数*
while1{
ifTF0{TR0=0;TR1=1; TF0=0;}*当TF0=1时,禁止T0,启动T1计数,清标志TF0*
ifTF1{ P10=!P10; TF1=0;}*当TF1=1时,P1.0输出求反,清标志TF1*
}
}
例56用STC89C52的T0P3.4监视一生产线,每生产100个工件,发出一包装命令,包装成一箱,并记录其箱数。
图57STC89C52的简易打包系统框图
分析T0采用方式2计数,计100个数,计满溢出申请中断,STC89C52的简易打包系统框图如图57所示。C51参考程序如下。
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitBAOZHUANG=P1^0;
uinti;
voiddelayxmsuintxms
{uintt1,t2;
fort1=xms;t10;t1--
fort2=110;t20;t2--;
}
voidmain
{i=0;
BAOZHUANG=0;
TMOD=0x06;
TH0=-100;
TL0=-100;
EA=1;
ET0=1;
TR0=1;
while1;
}
voidcountinterrupt1
{i=i 1;
BAOZHUANG=1;
delayxms50;
BAOZHUANG=0;
}
4. 工作方式3的应用例57STC89C52单片机外接6MHz晶振,通过T0定时,需要在P1.0和P1.1分别产生周期为400s和800s的方波。分析此时可以由TL0和TH0产生200s和400s的定时中断,并在中断服务程序中对P1.0和P1.1取反。由于采用了6MHz晶振12T模式,因此单片机的机器周期为2s。因此可计算TL0的初值X=156=9CH,TH0的初值X=56=38H。C51参考程序如下。
#include头文件
sbitWave1=P1^0;定义位变量
sbitWave2=P1^1;
voidT0ISRvoidinterrupt1T0中断响应
{Wave1=~ Wave1;
TL0=0x9C;重置计数初值
}
voidT1ISRvoidinterrupt3T1中断响应
{Wave2=~ Wave2;
TH0=0x38;重置计数初值
}
void mainvoid主函数
{Wave2=0;初始化P1^1=0
TMOD=0x03;设置定时器T0为模式3
TL0=0x9C;TH0=0x38;初始化
TR0=1;ET0=1;
TR1=1;ET1=1;EA=1;开中断
while1;主循环
}
5. 门控位GATEx的应用测量脉冲宽度例58门控GATE1使定时计数器T1启动计数受控。当GATE1为1,TR1为1时,只有INT1引脚输入高电平时,T1才被允许计数,故可测引脚P3.3上正脉冲宽度机器周期数,如图58所示单片机的晶振频率为6MHz,12T模式。
图58利用GATE位测量正脉冲的宽度
分析从如下4个方面来分析。1 建立被测脉冲。设置定时计数器0定时、工作方式2,门控GATE0=0,定时溢出使P3.0引脚求反,从而输出周期为1ms方波作为被测脉冲,P3.0输出信号连接到P3.3引脚。2 测量方法。采用查询方式来测量P3.3引脚输入正脉冲宽度,设置定时计数器1为定时工作方式1,GATE1=1,则利用P3.3引脚和TR1信号控制定时器1计数启、停,当GATE1=1时,INT1=1且TR1=1,启动定时器1计数,若INT1=0,或者TR1=0,禁止定时器计数,如图58所示。将计数器的TH1计数值送P2口,TL1计数值送P1口显示。3 计数初值的计算。计算定时器0工作方式2时,T0计数初值为: X=256-250=06H; 定时计数器1设置为定时工作方式1,计片内脉冲,从0开始计数,初值为0000H,即TH1=00H,TL1=00H。4 采用中断方式。从图58中知,外部中断1引脚P3.3第一次下降沿信号,产生第一次中断触发,在中断服务程序中设置TR1=1,此时INT1=0,不能启动定时器1工作,当P3.3引脚出现脉冲信号上升沿时,自动启动T1计数,而P3.3引脚出现脉冲信号第2次下降沿时,即降为0,自动停止T1计数,则在中断服务程序中使TR1=0,从启动T1计数到停止T1计数所记录的计数值乘以机器周期值就是正脉冲的宽度。C51参考程序如下。
#include
sbitP30=P3^0;
sbitflag=PSW^5;
voidmain{
SP=0x60;
TMOD=0x92;
TL0=0x06;
TH0=0x06;设置T0初值
TL1=0x0;
TH1=0x0;设置T1初值
TR0=1;
IT1=1;
IE=0x86;
flag=0; 软件标志位清0
while1{
P2=TH1;T1计数值高8位送显示器
P1=TL1;T1计数值低8位送显示器
}
}
void timer0intvoid interrupt 1{T0中断服务
P30=!P30;
}
void int1intvoid interrupt 2{T1中断服务
ifflag==0{TR1=1;flag=1;}
else TR1=0;
}
6. 实时时钟的设计例59试使用定时器计数器来实现实时时钟。实时时钟就是以秒、分、时为单位计时。1 计时的实现时钟最小计时单位是秒,如何获得1s定时?可将定时器T0的定时时间定为50ms,采用中断方式进行溢出次数的累计,计满20次,则秒计数变量s加1; 若秒计满60,则分计数变量m加1,同时将秒计数变量s清0; 若分钟计满60,则小时计数变量h加1; 若小时计数变量满24,则将小时计数变量清0。2 程序设计先将定时器以及各计数变量初始化,然后调用时间显示的子程序。计时功能由定时器T0的中断服务子程序来实现。C51参考程序如下。
#include
unsigned char int_time; *定义中断次数计数变量*
unsigned char second; *秒计数变量*
unsigned char minute; *分钟计数变量*
unsigned char hour; *小时计数变量*
voiddelayvoid *延时函数*
{unsigned char j;
forj=0;j
sbitP16=P1^6;*定义位变量P1.6*
sfrT2MOD = 0xC9;*定义特殊功能寄存器T2MOD*
sfrIPH = 0xB7;*定义特殊功能寄存器IPH*
voidmain{*主函数*
SP=0x60;*设置堆栈指针*
T2MOD=0x00;*设置定时器2向上计数且时钟输出不使能*
T2CON=0x04;*设置定时器2自动重装载、定时且启动T2计数*
TL2=0x18;TH2=0xfc;*装载定时器2的定时初值*
RCAP2H=0xfc;RCAP2L=0x18;*装载定时器2的定时初值*
IE=0xa0; *允许T2中断请求,总中断允许*
IP=0x20;IPH=0x20;*设置T2为第3级中断优先级*
while1{*踏步等待中断*
}
}
void timer1intvoid interrupt 5 {
TF2=0;*清定时溢出标志*
P16=!P16;*P1.6输出求反*
}
例511设STC89C52单片机系统时钟频率为12MHz,T2工作方式为捕获方式,将捕获的计数值低8位送P3口,高8位送P2口,用频率仪和示波器观察P1.1引脚捕获脉冲频率值和波形。分析根据题意知T2工作方式为捕获方式,T2CON中EXEN2选择两种选项,此处选择EXEN2=1,即外部捕获,选定时模式CT2=0,选择向上计数,即DCEN=0,而捕获脉冲是利用T0定时工作方式1,使P1.5输出周期为2ms的方波,该方波接入到P1.1引脚作为捕获脉冲。为了捕获P1.1引脚脉冲频率值,利用P1.1引脚负跳变触发定时器T2外部中断,第一次中断时,启动定时器T2开始计数,此时定时器T2的最初计数值为0,即TH2=00H,TL2=00H,而此时捕获值RCAP2L=00H,RCAP2H=00H; 第二次中断时,禁止定时器T2计数,此时捕获寄存器内容就是记录机器周期个数,可求出输出脉冲频率值。T0选择定时工作方式1,输出周期为2ms方波,12T模式,则定时器0的初值:X=65536-1000=64536=FC18H,即TH0=0FCH,TL0=18H。C51参考程序如下。
#include
#define uchar unsigned char
sbitP16=P1^6;
sbitP15=P1^5;
sbitP17=P1^7;
sfr T2MOD= 0xC9;
uchar n=0;
uchar reg1,reg2;
*************显示******************
void disp{
ifn==1{P2=0xff;P3=0xff;}
P2=reg2;
P3=reg1;
}
**********主程序*********
voidmain{
SP=0x60;
TMOD=0x01;
TH0=0xfc;
TL0=0x18;
TR0=1;
T2MOD=0x0;
T2CON=0x9;
TL2=0x0;
TH2=0x0;
RCAP2H=0x0;
RCAP2L=0x0;
IE=0xa2;
while1{
disp;
}
}
*********定时器0中断函数***********
void timer0intvoid interrupt 1{
TF0=0;
TH0=0xfc;
TL0=0x18;
P15=!P15;
}
*************定时器2中断函数**************
void timer2intvoid interrupt 5{
uchar i;
TF2=0;
ifTF2==1{
TF2=0;TH2=RCAP2H;TL2=RCAP2L;n;}
ifEXF2==1{
EXF2=0;
ifi==0{TR2=1;i;}*第一次外部信号触发中断,启动定时器2计数*
else{
reg1=RCAP2L;*保存捕获值*
reg2=RCAP2H;
i=0;
TR2=0;*停止定时器2计数*
EXEN2=0;*禁止T2EX负跳变产生捕获*
}
}
}
本章小结本章介绍STC89C52单片机定时计数器组成、与定时计数器相关的特殊功能寄存器,详细叙述这些特殊功能寄存器每一位的物理意义和使用这些特殊功能寄存器方法。介绍T0和T1的4种工作方式、它们的电路结构模型以及它们适合应用范围。介绍与T2相关的特殊功能寄存器以及寄存器每位的物理意义和使用方法,介绍T2的3种工作方式逻辑结构图,并举例说明T2各种工作方式应用。思考题1. 定时计数器工作于定时和计数方式时有何异同点?2. 当定时计数器T0用作方式3时,定时计数器T1可以工作在何种方式下?如何控制T1的开启和关闭?3. 利用定时计数器T0从P1.0输出周期为1s,脉宽为20ms的正脉冲信号,晶振频率为12MHz。试设计程序。4. 要求从P1.1引脚输出1000Hz方波,晶振频率为12MHz。试设计程序。5. 对于T2的自动重装方式,如何控制其向上计数还是向下计数?6. T0、T1的4种工作方式各有何特点?T2的3种工作方式各有何特点?7. 试用定时计数器T1对外部事件计数。要求每计数100,就将T1改成定时方式,控制P1.7输出一个脉宽为10ms的正脉冲,然后又转为计数方式,如此反复循环。设晶振频率为12MHz。8. 利用定时计数器T0产生定时时钟,由P1口控制8个指示灯。编一个程序,当STC单片机工作于6T模式时,使8个指示灯依次一个一个闪动,闪动频率为20次s8个灯依次亮一遍为一个周期。9. 若晶振频率为12MHz,如何用T0来测量20ms~1s之间的方波周期?又如何测量频率为0.5MHz左右的脉冲频率?
|
|