01-经典51内核资源浓缩图
02-重要外设特殊功能寄存器概述
03-程序开发流程及设计要点
04-三大外设开发及可复用代码
05-应用程序设计快速介绍
01-经典51内核资源浓缩图
四组8位并行I/O端口:
P0口:PC门,集电极开路输出,必须接上拉电阻才能输出高电平。
P1口:没什么特别的。
P2口:作为访问外部存储器时的高8位地址。
P3口:功能复用口,具体见表。
三大外设:外部中断、定时/计数、串行通信
五个中断源:2个外部中断、2个定时器/计数中断、1个串行通信中断
注意:记住中断号和中断源的对应关系…编程时会用到
三个特殊功能寄存器:TCON、SCON、TMOD
无论是复杂的处理器还是简单的微控制器,其大部分功能都是通过外设来体现的,外设与内核的交互是通过寄存器和中断系统来实现的。 因此,大部分底层单片机程序开发实际上就是对各种特殊功能寄存器进行编程和操作以及处理中断响应。
02-重要外设特殊功能寄存器概述
1、经典51单片机的重要外设
无论是简单微处理器还是复杂微处理器,其基本架构都是“核心+外设”,而控制外设的重要途径就是特殊功能寄存器。 底层程序开发大部分都是在和各种特殊功能寄存器打交道。
51单片机的外设并不多,可分为中断系统、定时器/计数器和串行接口三大部分。
为了很好地应用这些外设,首先要了解控制这些外设的特殊功能寄存器:
IE寄存器:中断控制寄存器。
IP寄存器:中断优先级寄存器。
TCON寄存器:中断状态标志寄存器。
TMOD寄存器:时序/技术模式控制寄存器。
THx和TLx寄存器:定时器/计数器的技术初值寄存器。
SCON寄存器:串口控制寄存器。
SBUF寄存器:串行接口接收发送和接收缓冲区。
2. 重要寄存器汇总
IE寄存器和IP寄存器(IP用得不多)
TCON寄存器
TMOD寄存器
SCON寄存器
03-程序开发流程及设计要点
在编程过程中,需要注意2点:
引入相关芯片的头文件。
编写中断服务函数的特殊方式。
开发流程。
创建新项目或打开现有项目:“项目”菜单项。
如果是新项目,点击“New uVision Project”菜单项,输入项目名称。
选择新项目的芯片类型。
将代码文件添加到新创建的项目中。 如果没有代码文件,可以创建一个空文件。
配置项目选项参数并输出主要设置的HEX文件。
根据不同的芯片编写代码并引入头文件。
编译代码,有时允许警告存在。
打开ISP下载软件并导入HEX代码文件。
将程序代码烧录到芯片中,断电时点击“下载”按钮,再上电,程序就会自动下载到芯片中。
3. 程序设计要点
引入头文件
在单片机的编程中,经常需要对特殊功能寄存器进行操作,而这些寄存器实际上就是芯片中的内存地址。 这些地址很难记住并且编码复杂。 为了方便记忆和使用,每个特殊功能寄存器都被赋予了一个名称。 如果想在编程中直接使用这些名称,则需要引入相应的芯片头文件,如51单片机,则需要引入“reg52.h”文件。
特殊功能寄存器P0的地址为80H。 引入这个头文件后,就可以使用P0这个名字了
P0 = 0x02;
中断服务函数格式
51单片机中有5个中断源,每个中断源都有固定的入口地址(即中断向量)和中断号。在编程过程中,不用记住中断向量地址,但需要知道中断每个中断源对应的编号。
一般中断处理函数有两个,一是中断初始化函数,二是中断服务函数。 初始化函数是普通函数,但中断服务函数有特殊的格式要求:
A、中断函数没有返回值,不能带参数。
B、函数名后面应有关键字interrupt,表明这是一个中断服务函数。
C、关键字interrupt后面必须跟中断号,表示中断服务函数服务于哪个中断。
中断服务函数的格式为:
void 函数名()中断 中断号
{—-函数体—-}
例如,定时器0的中断服务函数可以用C语言编写如下:
04-三大外设开发及可复用代码
1.外部中断模块
51单片机有两个中断模块,INT0和INT1。 外部触发信号可以是电平或边沿,由寄存器TCON 的IT0 和IT1 位决定。
2. 计时/计数模块
51单片机有两个定时器T0和T1,可用于内部计时和外部计数。 初始化时需要确定模块是否具有计时功能或计数功能,工作模式是什么,最大计数值是多少。
3. 串行接口模块
在51单片机的串行接口中,需要占用定时器T1来产生波特率。 发送数据时,内容放在SBUF中。 数据发送完毕后,TI 会被置 1,当一条数据接收完毕后,RI 会被置 1,然后就可以从 SBUF 中读出内容了。 无论是TI还是RI标志位,都需要手动清0。 一般情况下,发送数据采用查询方式,接收数据采用中断方式。
05-应用程序设计快速介绍
1. 题目要求
2. 基本思路
我的设计模式是自上而下,从整体到局部。 所以,在写代码之前,我脑子里基本上已经有了一个比较完整的轮廓,包括应该定义哪些变量,应该安排哪些函数,以及程序框架大致是什么样的。
从本题的需求分析中,我们可以得到以下信息:
第二个flash功能需要使用定时器0,并且必须安排一个初始化函数Init_Timer0()和一个中断服务函数ServiceTimer0()。
定时器0使用16位模式。 在12MHz晶振的情况下,最大定时值仅为65.535ms。 因此无法直接实现定时500ms,需要多次定时累加。 设置定时器0的间隔定时为50ms比较方便。 10次累加就是500ms,所以需要一个定时累加变量t_count。
对于按键函数,首先要定义一个按键扫描函数ScanKeys()。 如果扫描过程中需要进行去抖处理,则必须安排一个简单的延时函数Delay()。
再检查一下,再想一想,还有什么问题吗? 已经没有了。
三、方案框架
严格来说,在开始写代码之前,应该先做好程序的流程图和数据定义表。 但对于简单的功能,可以通过编写代码构建整体框架来体现。 这就像建造一座框架结构的房子一样。 先建造毛坯结构,然后制作单元进行装饰。 我更喜欢这样做。 本题在基本思想分析的指导下,可以构建程序框架结构。
4、一一填写
定时器初始化函数:这段代码可以重复使用,复制过来即可。
定时器中断服务函数。
按键扫描功能。
这样,一个简单的51单片机应用程序的开发就完成了。