51单片机的入门速成法
01-经典51内核资源全览浓缩图
02-重要外设特殊功能寄存器概览
03-程序开发流程与设计要点
04-三大外设的开发与可重用代码
05-应用程序设计入门一例通
01-经典51内核资源全览浓缩图
<1> 四组8位并行I/O端口:
P0端口:PC门,集电极开路输出,必须接上拉电阻才能输出高电平。
P1端口:无特殊之处。
P2端口:访问外部存储器时,作高8位地址用。
P3端口:功能复用端口,详情看表。
<2> 三大外设:外部中断、定时/计数、串行通信
<3> 五个中断源:2个外部中断、2个定时/计数中断、1个串行通信中断
注意:要记住中断号与中断源的对应关系…编程时会用到
<4> 三大特殊功能寄存器:TCON、SCON、TMOD
不管是复杂的处理器还是简单的单片机,其功能大多通过外设来体现出来,而外设与内核的交互则通过寄存器和中断系统来实现。因此底层的单片机程序开发实际上大部分都在编程操作各种特殊功能寄存器和处理中断的响应。
02-重要外设特殊功能寄存器概览
1、经典型51单片机的重要外设
不管简单还是复杂的微处理器,其基本架构都是“内核+外设”,而控制外设的重要途径就是特殊功能寄存器。底层的程序开发,绝大部分都在跟各种特殊功能寄存器打交道。
51单片机的外设不多,可以分成三大块:中断系统、定时/计数器和串行接口。
要想把这些外设应用好,首先得把控制这些外设的特殊功能寄存器弄明白:
IE寄存器:中断控制寄存器。
IP寄存器:中断优先级寄存器。
TCON寄存器:中断状态标志寄存器。
TMOD寄存器:定时/技术模式控制寄存器。
THx和TLx寄存器:定时/计数器的技术初值寄存器。
SCON寄存器:串口控制寄存器。
SBUF寄存器:串行接口收据发送和接收缓冲器。
2、重要的寄存器归纳
<1> IE寄存器与IP寄存器(IP用的不多)
<2> TCON寄存器
<3> TMOD寄存器
<4> SCON寄存器
03-程序开发流程与设计要点
在程序设计过程中,需要注意2点:
<1> 要引入相关芯片的头文件。
<2> 中断服务函数的特殊写法。
开发流程。
<1> 建立新工程或者打开已有工程:Project菜单项。
<2> 如果是新建工程,单击“New uVision Project”菜单项,输入工程名字。
<3> 为新工程选择芯片类型。
<4> 给新建的工程中添加代码文件,如果没有代码文件可以新建一个空文件。
<5> 配置工程的选项参数,主要的设置输出HEX文件。
<6> 编写代码,根据不同的芯片引入对于的头文件。
<7> 编译代码,有时候允许有警告存在。
<8> 打开ISP下载软件,导入HEX代码文件。
<9> 将程序代码烧写到芯片中,在断电状态下单击“下载”按钮,然后上电,程序就自动下载到芯片了。
3、程序设计要点
<1> 引入头文件
在单片机的程序设计中,很多时候需要操作特殊功能寄存器,而这些寄存器实际上就是芯片中的一个内存地址。记住这些地址很难,且代码编写复杂。为方便记忆和使用,给每一个特殊功能寄存器都起了一个名字。在程序设计中想直接使用这些名字,就需要引入对应芯片头文件,如51单片机,需引入“reg52.h”文件。
特殊功能寄存器P0的地址为80H,引入这个头文件之后,就可使用P0这个名字
P0 = 0x02;
<2> 中断服务函数的格式
在51单片机中有5个中断源,每个中断源都有固定的入口地址(也就是中断向量)和中断号。程序设计的过程中,不要记住中断向量地址,但需知每个中断源对应的中断号
一般情况下,中断的处理函数有两个,其一为中断初始化函数,其二为中断服务函数。初始化函数就是一个普通的函数,而中断服务函数却有特殊的格式要求:
A. 中断函数没有返回值,也不能带参数。
B. 函数名后面要跟一个关键字interrupt,说明这是一个中断服务函数。
C. 在关键字interrupt后面要跟上中断号,说明这个中断服务函数是为那个中断服务的。
中断服务函数的格式为:
void函数名()interrupt中断号
{----函数体----}
如定时器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、基本思路
我的设计模式是自上而下,从整体到局部。所以,在编写代码之前,我的脑子里面基本上已经有了比较完整的轮廓,包括应该定义那些变量,应该安排那些函数,程序框架大致如何。
从本题的需求分析中,我们可以获得以下的信息:
<1>秒闪功能,需要使用定时器0,得安排一个初始化函数Init_Timer0()和一个中断服务函数SeviceTimer0()。
<2> 定时器0使用16位模式,在12MHz晶振情况下,最大的定时值也只有65.535ms,因此要定时500ms不能够直接实现,那么就需要多次定时进行累加。把定时器0的间隔定时确定为50ms比较方便,累计10次就是500ms了,那么就需要一个定时累计变量t_count。
<3> 按键功能,首先要定义一个按键扫描函数ScanKeys(),在扫描过程中需要做去抖动处理,那么就要安排一个简易的延时函数Delay()。
<4> 再检查思考一下,还有什么吗?没有了。
3、程序框架
严格来说,在开始编写代码之前,应该将程序的流程图和数据定义表做出来。不过,对于简单的功能,可以通过编写代码搭建整体框架的方式来体现。这就跟建设框架结构的房子一样,先把毛坯建好,再去做个单元进行装修。我比较喜欢这做。本题在基本思路分析指导下,可以搭建出程序框架结构。
4、逐个填充
<1> 定时器初始化函数:这个代码是可以重用的,直接拷贝过来就行了。
<2> 定时器中断服务函数。
<3> 按键扫描函数。
就这样,一个简单的51单片机应用程序开发就完成了。