没有合适的资源?快使用搜索试试~ 我知道了~
首页探索单片机世界:从基础到89C51详解
探索单片机世界:从基础到89C51详解
需积分: 9 1 下载量 172 浏览量
更新于2024-08-02
收藏 268KB DOC 举报
本教程深入探讨了单片机的基本概念和重要性,以及MCS51系列单片机的起源和发展。单片机是一种集成度极高的微控制器,它将计算机的主要组成部分——CPU、RAM、ROM、I/O设备等功能集成在一块小型芯片上,这使得它们体积小、价格适中,适合于各种低成本、低功耗的应用场景。 首先,单片机的核心概念是围绕何谓单片机展开的,它与传统的PC机中的多芯片结构形成对比。尽管早期的单片机如8051价格相对较低,但由于其生产规模大,技术成熟,性能与价格之间的性价比非常高,因此在许多不需要高性能计算的场合,单片机仍然具有广泛的应用。例如,用于简单控制任务的电冰箱温度控制系统,就不需要使用高性能的CPU。 其次,MCS51系列单片机是一个广泛的家庭,由INTEL公司开发,包括8031、8051、8751等多种型号。8051作为这个系列的标志性产品,因其基础性和广泛应用而被广泛提及。8031曾在中国市场非常流行,而89C51则是近年来在中国市场上非常受欢迎的一款单片机,它可能在功能上有所增强或改变,以适应不同用户的需求。 了解这些单片机之间的关系有助于选择合适的型号进行项目开发。在学习过程中,不仅要知道单片机的基本构造和工作原理,还要熟悉它们的功能扩展和演变历史,以便更好地理解和利用这些技术在实际工程中的价值。 单片机教程对于初学者来说是极其有价值的资源,它可以帮助读者掌握单片机的基础知识,理解其在现代电子系统中的角色,并了解如何根据应用场景选择和使用不同类型的单片机。无论是出于兴趣还是职业发展,学习单片机都是一门实用且有前景的技能。
资源详情
资源推荐
P0 80H P0 口锁存器
PCON 87H 电源控制寄存器
表 1
下面,我们介绍一下几个常用的 SFR,看图 2。
ACC:累加器,通常用 A 表示。这是个什么东西,可不能从名字上理解,它是一个寄存器,
而不是一个做加法的东西,为什么给它这么一个名字呢?或许是因为在运算器做运算时其
中一个数一定是在 ACC 中的缘故吧。它的名字特殊,身份也特殊,稍后我们将学到指令,
可以发现,所有的运算类指令都离不开它。
2、B:一个寄存器。在做乘、除法时放乘数或除数,不做乘除法时,随你怎么用。
3、PSW:程序状态字。这是一个很重要的东西,里面放了 CPU 工作时的很多状态,借此,
我们可以了解 CPU 的当前状态,并作出相应的处理。它的各位功能请看表 2
D7 D6 D5 D4 D3 D2 D1 D0
CY AC F0 RS1 RS0 OV P
表 2
下面我们逐一介绍各位的用途
(1)CY:进位标志。8051 中的运算器是一种 8 位的运算器,我们知道,8 位运算器只能
表示到 0-255,如果做加法的话,两数相加可能会超过 255,这样最高位就会丢失,造成运
算的错误,怎么办?最高位就进到这里来。这样就没事了。
例:78H+97H(01111000+10010111)
(2)AC:半进位标志。
例:57H+3AH(01010111+00111010)
(3)F0:用户标志位,由我们(编程人员)决定什么时候用,什么时候不用。
(4)RS1、RS0:工作寄存器组选择位。这个我们已知了。
(5)0V:溢出标志位。什么是溢出我们稍后再谈吧。
(6)P:奇偶校验位:它用来表示 ALU 运算结果中二进制数位“1”的个数的奇偶性。若为
奇数,则 P=1,否则为 0。
例:某运算结果是 78H(01111000),显然 1 的个数为偶数,所以 P=0。
4、DPTR(DPH、DPL):数据指针,可以用它来访问外部数据存储器中的任一单元,如
果不用,也可以作为通用寄存器来用,由我们自已决定如何使用。
5、P0、P1、P2、P3:这个我们已经知道,是四个并行输入/输出口的寄存器。它里面的内
容对应着管脚的输出。
6、SP:堆栈指针。
堆栈介绍:日常生活中,我们都注意到过这样的现象,家里洗的碗,一只一只摞起来,最
晚放上去的放在最上面,而最早放上去的则放在最下面,在取的时候正好相反,先从最上
面取,这种现象我们用一句话来概括:“先进后出,后进先出”。请大家想想,还有什么地
方有这种现象?其实比比皆是,建筑工地上堆放的砖头、材料,仓库里放的货物,都是“先
进后出,后进先出”,这实际是一种存取物品的规则,我们称之为“堆栈”。
在单片机中,我们也可以在 RAM 中构造这样一个区域,用来存放数据,这个区域存放数
据的规则就是“先进后出,后进先出”,我们称之为“堆栈”。为什么需要这样来存放数据呢?
存储器本身不是可以按地址来存放数据吗?对,知道了地址的确就可以知道里面的内容,
但如果我们需要存放的是一批数据,每一个数据都需要知道地址那不是麻烦吗?如果我们
让数据一个接一个地放置,那么我们只要知道第一个数据所在地址单元就可以了(看图
2)如果第一个数据在 27H,那么第二、三个就在 28H、29H 了。所以利用堆栈这种方法来
放数据可以简化操作
那么 51 中堆栈什么地方呢?单片机中能存放数据的区域有限,我们不能够专门分配一块地
方做堆栈,所以就在内存(RAM)中开辟一块地方,用于堆栈,但是用内存的哪一块呢?
还是不好定,因为 51 是一种通用的单片机,各人的实际需求各不相同,有人需要多一些堆
栈,而有人则不需要那么多,所以怎么分配都不合适,怎样来解决这个问题?分不好干脆就
不分了,把分的权利给用户(编程者),根据自已的需要去定吧,所以 51 单片机中堆栈的
位置是可以变化的。而这种变化就体现在 SP 中值的变化,看图 2,SP 中的值等于 27H 不
就相当于是一个指针指向 27H 单元吗?当然在真正的 51 机中,开始指针所指的位置并非就
是数据存放的位置,而是数据存放的前一个位置,比如一开始指针是指向 27H 单元的,那
么第一个数据的位置是 28H 单元,而不是 27H 单元,为什么会这样,我们在学堆栈命令时
再说明。
其它的 SFR,我们在用到时再介绍。
单片机第八课(寻址方式与指令系统)
通过前面的学习,我们已经了解了单片机内部的结构,并且也已经知道,要控制单片机,
让它为我们干学,要用指令,我们已学了几条指令,但很零散,从现在开始,我们将要系
统地学习 8051 的指令部份。
一、概述
1、指令的格式
我们已知,要让计算机做事,就得给计算机以指令,并且我们已知,计算机很“笨”,只能
懂得数字,如前面我们写进机器的 75H,90H,00H 等等,所以指令的第一种格式就是机
器码格式,也说是数字的形式。但这种形式实在是为难我们人了,太难记了,于是有另一
种格式,助记符格式,如 MOV P1,#0FFH,这样就好记了。 这两种格式之间的关系呢,
我们不难理解,本质上它们完全等价,只是形式不一样而已。
2、汇编
我们写指令使用汇编格式,而计算机只懂机器码格式,所以要将我们写的汇编格式的指令
转换为机器码格式,这种转换有两种方法:手工汇编和机器汇编。手工汇编实际上就是查
表,因为这两种格式纯粹是格式不同,所以是一一对应的,查一张表格就行了。不过手工
查表总是嫌麻烦,所以就有了计算机软件,用计算机软件来替代手工查表,这就是机器汇
编。
二、寻址
让我们先来复习一下我们学过的一些指令:MOV P1,#0FFH,MOV R7,#0FFH 这些指令
都是将一些数据送到相应的位置中去,为什么要送数据呢?第一个因为送入的数可以让灯
全灭掉,第二个是为了要实现延时,从这里我们可以看出来,在用单片机的编程语言编程
时,经常要用到数据的传递,事实上数据传递是单片机编程时的一项重要工作,一共有 28
条指令(单片机共 111 条指令)。下面我们就从数据传递类指令开始吧。
分析一下 MOV P1,#0FFH 这条指令,我们不难得出结论,第一个词 MOV 是命令动词,
也就是决定做什么事情的,MOV 是 MOVE 少写了一个 E,所以就是“传递”,这就是指令,
规定做什么事情,后面还有一些参数,分析一下,数据传递必须要有一个“源”也就是你要
送什么数,必须要有一个“目的”,也就是你这个数要送到什么地方去,显然在上面那条指
令中,要送的数(源)就是 0FFH,而要送达的地方(目的地)就是 P1 这个寄存器。在数
据传递类指令中,均将目的地写在指令的后面,而将源写在最后。
这条指令中,送给 P1 是这个数本身,换言之,做完这条指令后,我们可以明确地知道,P1
中的值是 0FFH,但是并不是任何时候都可以直接给出数本身的。例如,在我们前面给出的
延时程序例是这样写的:
MAIN: SETB P1.0 ;(1)
LCALL DELAY ;(2)
CLR P1.0 ;(3)
LCALL DELAY ;(4)
AJMP MAIN ;(5)
;以下子程序
DELAY: MOV R7,#250 ;(6)
D1: MOV R6,#250 ;(7)
D2: DJNZ R6,D2 ;(8)
DJNZ R7,D1 ;(9)
RET ;(10)
END ;(11)
表 1
MAIN: SETB P1.0 ;(1)
MOV 30H,#255
LCALL DELAY ;
CLR P1.0 ;(3)
MOV 30H,#200
LCALL DELAY ;(4)
AJMP MAIN ;(5)
;以下子程序
DELAY: MOV R7,30H ;(6)
D1: MOV R6,#250 ;(7)
D2: DJNZ R6,D2 ;(8)
DJNZ R7,D1 ;(9)
RET ;(10)
END ;(11)
这样一来,我每次调用延时程序延时的时间都是相同的(大致都是 0.13S),如果我提出
这样的要求:灯亮后延时时间为 0.13S 灯灭,灯灭后延时 0.1 秒灯亮,如此循环,这样的程
序还能满足要求吗?不能,怎么办?我们可以把延时程序改成这样(见表 2):调用则见表 2
中的主程,也就是先把一个数送入 30H,在子程序中 R7 中的值并不固定,而是根据 30H
单元中传过来的数确定。这样就可以满足要求。
从这里我们可以得出结论,在数据传递中要找到被传递的数,很多时候,这个数并不能直
接给出,需要变化,这就引出了一个概念:如何寻找操作数,我们把寻找操作数所在单元
的地址称之为寻址。在这里我们直接使用数所在单元的地址找到了操作数,所以称这种方
法为直接寻址。除了这种方法之外,还有一种,如果我们把数放在工作寄存器中,从工作
寄存器中寻找数据,则称之为寄存器寻址。例:MOV A,R0 就是将 R0 工作寄存器中的数
据送到累加器 A 中去。提一个问题:我们知道,工作寄存器就是内存单元的一部份,如果
我们选择工作寄存器组 0,则 R0 就是 RAM 的 00H 单元,那么这样一来,MOV A,00H,
剩余61页未读,继续阅读
zljhgx
- 粉丝: 14
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 最优条件下三次B样条小波边缘检测算子研究
- 深入解析:wav文件格式结构
- JIRA系统配置指南:代理与SSL设置
- 入门必备:电阻电容识别全解析
- U盘制作启动盘:详细教程解决无光驱装系统难题
- Eclipse快捷键大全:提升开发效率的必备秘籍
- C++ Primer Plus中文版:深入学习C++编程必备
- Eclipse常用快捷键汇总与操作指南
- JavaScript作用域解析与面向对象基础
- 软通动力Java笔试题解析
- 自定义标签配置与使用指南
- Android Intent深度解析:组件通信与广播机制
- 增强MyEclipse代码提示功能设置教程
- x86下VMware环境中Openwrt编译与LuCI集成指南
- S3C2440A嵌入式终端电源管理系统设计探讨
- Intel DTCP-IP技术在数字家庭中的内容保护
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功