单片机内部结构与项目实践
作者简介
马荣潇,男,银川科技学院计算机与人工智能学院,2022级计算机科学与技术9班本科生,单片机原理及应用课程第4组。
指导老师:王兴泽
电子邮件:wxzeh_work@163.com
个人CSDN主页 2201_75434908-CSDN博客
前言
本篇文章是参考《单片机原理及应用(c语言版)第2版》杨居义·编著教材 清华大学出版" http://www.tup.tsinghua.edu.cn" 编写的笔记 。文章由 罗静、李佳泰、张钰轩、张睿睿、马荣潇同学共同完成,其中罗静、张钰轩、张睿睿同学负责笔记总结 ,李佳泰同学负责整理,由马荣潇负责编写排版。
本文章由理论和实践两大部分组成是我们自己的一些总结,欢迎阅读指正!
一、任务 18-1:工程知识
1. 定时器/计数器的工作方式
定时器/计数器有4种工作方式,即方式0、方式1、方式2和方式3, 由 TMOD 中的MO和M1位选择
1) 方式0
方式0构成一个13位定时器/计数器,以T0例图4-8为T0作方式0时的逻辑结构。T1在方式0时的逻辑结构和操作与T0完全相同。
由图4-8可知,定时器/计数器是由 TL0的低5位和 TH0的8位组成的一个13位加1计数器(TL0的高3位不用);若TL0的第5位有进位,直接进到TH0中的最低位。当THO溢出时,向中断位 TF0进位(硬件自动置位),申请中断。
当C/T=0时,多路开关连接12分频器输出,T0对机器周期进行计数,此时,T0为定时器。
当C/T=1时,多路开关与T0(P3.4)连通,外部计数脉冲由T0输入,当外部信号电平发生由0到1的负跳变时,计数器加1, 此时,T0为计数器。
当门控位 GATE=0时,或门输出始终为1,与门被打开,与门的输出电平始终与 TR0的电平一致,实现由TR0控制定时器/计数器的启动和停止。若软件使TR0置1,接通控制开关,启动T0,13位加1计数器在定时初值或计数初值的基础上进行加1计数;溢出时,13位加1计数器为0,,TF0由硬件自动置1, 申请中断。如要循环计数,则T0需重置初值,将TF0复位,可用重置初值语句和JBC 命令实现;若TR0清零,关断控制需重置初值,将 TF0复位,可用重置初值语句和JBC 命令实现。若TR0清零,关断控制开关,停止T0,加1计数器停止计数。
当GATE=1时,由输人电平和TR0位的状态来确定与门的输出。TR0=1则与门打开,外部信号 INT0的电平通过引脚直接开启或关断T0,高电平允许计数,低电平停止计数;TR0=0则与门被封锁,控制开关被关断,停止计数。
7MOD是8位计数器 (分旅位,低代位。
2) 方式1
T0工作于方式1时,逻辑结构图如图4-9所示。在方式1下,以T0为例,定时器/计数器是由TL0中的8位和TH0中的8位组成一个16位加1计数器。方式1的逻辑结构与操作几乎完全与方式0相同,最大的区别是方式1的加1计数器是16位。
3) 方式2
T0方式工作于方式2时,其逻辑结构图如图4-10所示。在方式2下,以T0为例,定时器机数器是一个能自动装人初值的8位加1计数器。TH0中的8位用于存放定时初值或计数初值,TL0中的8位用于加1计数器,当计数器溢出时,硬件TF0自动置1,同时自动将TH0中存放的定时初值或计数初值再次装入TL0,继续进行计数。方式0和方式1用于循环计数,在每次计满溢出后,计数器都会复0,要进行新一轮计数就必须重置计数初值。这不仅会使编程复杂,而且影响定时精度。而方式2具有自动装入初值功能,避免了上述缺点,适用于较高精度的定时信号发生器。
4)方式3
T0工作于方式3时,逻辑结构如图4-11所示。由图4-11可知,T0工作于方式3时,T0分为两个独立的8位加1计数器TH0和TL0。TL0既可用于定时,也可用于计数,而TH0只能用于定时。
在方式3下,TL0占用原T0的各控制位、引脚和中断源,即C/T、GATE、TR0、TF0和T0(P3.4)引脚、INT0(P3.2)引脚。而TH0占用原T1的控制位TF1和TR1,同时还占用了T1的中断源,其启动和关闭仅受TR1置1或清零控制。TH0只能对机器周期进行计数,因此,TH0只能用作简单的内部定时,不能用作对外部脉冲进行计数,是T0附加的一个8位定时器。
二、任务18-2-1:用T0查询方式控制P1.0引脚的蜂鸣器发出1kHz音频
1. 任务要求
(1)掌握TMOD的设置。
(2)掌握定时器/计数器初始值的计算。(3)掌握T0在方式1的编程方法。
2.任务描述
T0工作于方式1,采用查询方式控制P1.0引脚的蜂鸣器发出1kHz音频,设单片机晶振频率 fosc=12MHz。
3. 任务实现
1)分析
因T0工作于方式1,则TMOD=XXXX0001B。
- 设置T0的初始值:只要让单片机的P1.0引脚的电平信号每隔音频的半个周期取反一次即可发出1kHz音频。音频的半个周期为T=1/1000/2Hz=0.0005s,即500μs。由于T机=12T时钟=12X1/fosc =1μs,而方式1的最长定时时间为65.536ms,T0初始值X=2的16次方减T除T机
- 则
THO=(65536-500)/256; //TO 的高8位赋初值
TLO=(65536-500)*256; //TO 的低8位赋初
2) 程序设计
先建立文件夹XM18-2-1,然后建立工程项目XM18-2-1,最后建立源程序文件XM18-2-
1.c,输入如下源程序。
#include<reg51.h>
sbit sound = P1^0;
void main(void)
{
TMOD = 0x01;
TH0 = (65536 - 500)/256;
TL0 = (65536 - 500)%256;
TR0 = 1;
while(1)
{
while(TF0==0)
;
TF0 = 0;
sound = ~sound;
TH0 = (65536 - 1000)/256;
TL0 = (65536 - 1000)%256;
}
}
(3)用Proteus软件仿真
经过Keil软件编译通过后,在ProteusISIS编辑环境中绘制仿真电路图如2-1所示。
图2-1用T0查询方式控制P1.0引脚的蜂鸣器发出1kHz音频