版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第一章 从外行到内行的引言一、计算机能干什么?1. 让我们看下面的例子:(计算机的缺点:必须描述非常详细并清楚)拿着足够的钱,打算去买酸奶,桔子和面包,计划如下:如果酸奶打折就买两盒,否则就买一盒,买20个带绿叶的桔子,买最新鲜的面包一个。要求很简单,但是写出程序很复杂,首先写好左边一列的文字,然后画出右列的流程图,然后就可以使用任何一门程序语言编程。(1)出门,超市(2)来到酸奶柜前。(3)酸奶打折吗?打折拿两盒,不打折拿一盒。(4)来到卖橘子的大筐前。(5)看自己的筐里有20个砂糖桔吗?有则跳到(6),否则往下。 拿起下一个橘子,如果带绿叶就放在筐里,否则放弃。 回到(5)(6)来到买面包
2、的架子前,拿起一个面包。(7)架子上还有其他没有看过的面包吗?没有则跳到(8),否则往下。 查看下一个面包,如生产日期晚于手上这个,则把两个面包换一换,否则不动作。 回到(7)(8)来到收银台,付账。 回家。例二:让计算机解方程(计算机的优点:重复大量的工作速度很快)让计算机解一元二次方程。x2+bx+c=0,二元一次方程有两个系数。要让计算机解方程,首先要告诉它已知的这两个系数,然后它根据求根公式x1=-b+(b2-4c)1/2,给出两个解。(求根公式是数学家给出的,只要知道代入b和c可以算出根即可。)计算机的执行过程是这样的:(1)在输入设备上输入b,(2)在输入设备上输入c,(3)调用事
3、先设定好的公式,在计算机内部的运算器上,求出x1和x2,(4)在输出设备上显示x1,(5)在输出设备上显示x2。这五步和上个例子的多个步骤是一个概念。通常把这五步称为程序,把这段程序写到计算机中,就可以让计算机执行这段程序,完成“让计算机解方程”的功能。要让计算机解一个方程,得不偿失,但是解一万个方程就合适了。不过如何输入和获得结果?可以写这样一个文本文件,让计算机读取后改写,几分钟可能就搞定了。输入的文件形式输出的文件形式b=3 c=2b=7 c=12b=7 c=15b=3 c=2 : x1=1 x2=2b=7 c=12 : x1=3 x2=4b=8 c=15 : x1=3 x2=5综上所述
4、,要使用计算机,就要克服其缺点,利用其优点。要耐心详细的编制程序,然后把这个程序反复运行很多遍。程序(program)是为实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合。为实现预期目的而进行操作的一系列语句和指令。二、计算机的结构:计算机硬件由运算器、控制器、存储器、输入设备和输出设备五大部件组成。 由于运算器和控制器一般做在一个芯片上,合称CPU(Central Processing Unit,中央处理单元)。CPU的发展是多样化的。就像动物进化,一开始大家都是单细胞动物,发展到后来变成了鸟,鱼,人类,或者牛羊。CPU发展到后来,追求的目标不一样,包括运算速度更快,能
5、力更高,体积更小,更便宜,更省电,等等。发展至今,科学用的超大型计算机非专业人士看不到不用管,一般的台式计算机用的CPU追求的是“更快更强”,但体积太大,发热量太大,太耗电。手机用CPU,追求的是“低功耗,性能好,体积小”,但价格太贵;一般玩具用简单控制CPU,虽然能力差,但够用就行,而且体积小,价格便宜。所以,不要用最好的,要用就用最合适的。这就是为什么35年前的8051芯片,现在只卖10块钱但是仍然那么流行。下面三行分别就是台式机、手机和8051的芯片图片。本节只引入CPU和存储器的概念。控制器和运算器称CPU,其功能就是读取指令和执行指令。指令在存储器存放。其中控制器比较复杂,本节仅引入
6、一个基本功能。下面用一个例子来说明CPU和存储器。考虑某房间有一个人,一个工作台,很多排列整齐的抽屉,一个入口和一个出口。这个人就是控制器,(他带着一个能够跳数字的物品,称为程序指针)。工作台就是运算器,抽屉是存储器,每个存储器中放一个纸条,这个纸条就称为程序;入口和出口是输入和输出。一上电,相当于这个人就醒了,他醒了之后就看自己的“程序指针”,发现是000,于是他就去看第0个抽屉。(注意,计算机都是从0开始编号,所以首个编号是0);他从抽屉0中拿出纸条放在工作台上,然后把程序指针拨动一下到1,然后低头看纸条内容。上面写着,“请到入口接一个数b”,于是这个人就到入口等着,会有人给他一个数,拿到
7、数了以后,当前放在工作台上的纸条的命令就执行结束了;他看一下“程序指针”,现在指着1;他打开抽屉1,拿出纸条放在工作台上,把程序指针拨动一下到2,然后低头看内容,“把b这个数放在9号抽屉”,于是他打开9号抽屉把b放入,此条程序执行完成; 他看一下“程序指针”,现在指着2;他打开抽屉2,拿出纸条放在工作台上,把程序指针拨动一下到3,然后低头看内容,“请到入口接一个数c”,于是做了这件事情,此条程序执行完成;他看一下“程序指针”,现在指着7;他打开抽屉7,拿出纸条放在工作台上,把程序指针拨动一下到8,然后低头看内容,“请把程序指针减一”,于是他把程序指针减一,改成了7,然后此条程序执行完成;(这一
8、句一直在循环)抽屉0请到入口接一个数b抽屉1把b这个数放在9号抽屉抽屉2请到入口接一个数c抽屉3把c这个数放在10号抽屉抽屉4把9号抽屉和10号抽屉的数做运算,结果送到11号抽屉抽屉5抽屉6把11号抽屉的数送到出口抽屉7站在原地不动。抽屉8抽屉9这里会放一个数b抽屉10这里会放一个数c抽屉11这里会放一个计算好的数等在这里重要注释:存储器是一个个排列有序的格子,这个是硬件;存储器中存放的内容是软件。我们要建立一个概念,同样是存储器,可以放用来执行的程序,也可以放用来计算的数据,就看写程序的人怎么指定,纯属程序员的个人爱好。例如,编号是120-127号的这段存储器可以存放“请输出a+b”这段程序
9、;而编号128-199号这段存储器可以空着;编号是200-208号的这段存储器可以存放“1,2,3,4,5,6,7,8”这几个数字。重要注释:为什么到6不结束,因为程序没有结束指令,只要上电就必须一直的运行。所以只能用一个死循环假装结束。第二章 存储器一、存储器的各项指标:首选我们建立一个概念,就是存储器是有宽度的。假设一排的抽屉一共8192个,第一个抽屉编号是0,第二个抽屉编号是1,最后一个编号是8191。现在我们要去买标签纸给抽屉编号,请问需要买能写下多少个数字的标签纸?答:能写下4个数字的标签纸。于是8192号就正好写下了,那么0号怎么写?写最左边还是最右边?最好的办法是写成0000;同
10、理,可以把10号写成0010。123号写成0123。其实拉开抽屉也是一样,一个抽屉也就是一个存储单元,只能放下八个二进制的1,等于存放一个字母“A”的大小,一个单词“Apple”需要连续存放五个抽屉即五个存储单元。基本上我们能见到的存储器,宽度都是一样的,我们称为该宽度是一个字节。既然每个存储单元的容量是一样的,该存储器的总容量有多少,取决于它有多少个存储单元,普通的计算机有很多,对于8051来说,只有几百个。二、存储器如何存储数据?计算机只能存储0和1,我们如何用0和1存储数字,字母,符号和汉字?1、二进制,十进制和十六进制二进制数表示逢二进一,十六进制表示逢十六进一,二进制后缀用B表示,例
11、如10001000B;十进制用D表示,例如57D;十六进制用H表示,例如CH;在十六进制中,因为数字只有0-9,所以人们用A表示10,B表示11,C表示12,D表示13,E表示14,F表示15。所以CH其实就是十进制的12D。因为人们常用十进制,所以凡是不带后缀的,都视为十进制,也就是57D可以简化成57。为什么要用十进制?因为人们都要用它;为什么要用二进制?因为计算机要用它;可是为什么要用十六进制呢?因为四个二进制等于一个十六进制,也就是说,十六进制是二进制的缩写。极大了方便了人们的描述。因此人们和计算机打交道的时候通常先使用十六进制进行描述,向计算机写的时候,机器会自动按照一变四的方式直接
12、转化为二进制。所以,二进制和十六进制的互相转化很简单,因为,可以把二进制每四个分成一组,每组直接转化,对于每个存储单元中的八个二进制数,正好可以转化成两个十六进制数,如下:0000B=0H0001B=1H0010B=2H0011B=3H0100B=4H0101B=5H0110B=6H0111B=7H1000B=8H1001B=9H1010B=AH1011B=BH1100B=CH1101B=DH1110B=EH1111B=FH例子:00001111B = 0000 1111 B = 0FH;0000 0000 = 00H00010001B = 0001 0001 B = 11H;1111 111
13、1 = FFH所以,上面所述,一个存储单元有八个二进制数11111111B,那么改为:一个存储单元有两个十六进制数FFH。2. 二进制表示正整数最简单的是正整数的存储,例如57,用0和1怎么表示,这就是二进制和十进制的转化,书上的例子自己可以看,我们抓住其本质,就是任何一个进制下的数都可以用十进制数的下列公式表示。对每一位做:数值乘以进制的“位数减一次方”,然后求和。(如果描述不好请参考下面的例子)例如十进制57D 等于5乘以10的一次方加7乘以10的零次方。十进制以10为底: 二进制以2为底: 十六进制以16为底:上面的三个等式,左边是不同的进制,右边是某个常用的统一的进制,因为十进制是人们
14、普遍熟悉的,因此右边通常采用十进制。上面提到一个存储单元可以放八个1,也就是最小00000000(即00H),最大11111111(即FFH)。也就是一个存储单元存正整数,可以表示0到255。为了方便转化,需要牢记2的次方如下:例一:存储单元中有一个数是00001111请问这个数十进制是多少?答:例二:请问把十进制正整数17放入存储器后是二进制多少?答:反过来转化通常使用凑数法,把17写成各个2的不同次方相加。17D因为都是八位,最后前面补全,最终结果17D=00010001B3. 二进制表示正小数(带小数点的数):上面的表示法同样适用于小数,例如:十进制: 二进制:十六进制:例一:把25.8
15、H转化为十进制。答:例二:把12.25D转化为二进制和十六进制。同上,把12.25D表示乘2的次方。补全为:0000 1100.0100 0000B,每四位化成一个十六进制:0C.40H习题:把35.8H化成十进制。(答案:53.5D)把7.75化成十六进制和二进制。(答案:7.CH或07.C0H)4. 二进制表示负整数上面说了,一个存储单元八个二进制数,可以表示正整数0-255共256个数。那么如何表示负数?起先,人们使用左边最高位作为符号位,其他的作为数字位,例如00000001表示正1,10000001表示负1,这样的表示直观,但是这样会出现一个问题,00000000表示正0,10000
16、000表示负0,这样,0这个数就有两种表示方法,不科学,因此,人们想出了另一种方法,在00000000八位中,最高位如果是1,表示负128,其他七位表示正数。在了解原理之后,在计算时,通常使用两种方法,算法1:按照定义,先从被求数中提出一个-128,剩下的按照正数计算,通常远离0的数用此方法。算法2:按照书上的方法,先算被求数的正数,然后全部取反,然后加1计算。通常靠近0的数用此方法。例1:计算十进制-121的二进制。答:-121远离0,使用算法1:先从-121中提出一个-128,剩下的按照正数计算。例2:计算十进制-2的二进制。答:-2靠近0,使用算法2:先求正2的二进制,然后按位取反加1。
17、取反表示把0改成1,1改成0,请看例子。(1)(2) 按位取反为 ,(3) (4)最终得到:例3:计算十进制-128、127、-1的二进制。答:11111111B如果按照正数解释是255,如果按照负数解释是-1。同样一个内容可以表达不同的意思,正如你给人写张纸条,约人明天8点见面,纸条只负责记录8点这个数,它不知道是上午还是下午八点,只有写的人和看的人才知道。综上:用一个字节,也就是八位的二进制来表示数,如果最高位是0,即01111111,此时没有分歧,无论如何都表示0127;如果最高位是1,即11111111,那么需要判断,如果表示正数,则最高位的1表示128,此时该二进制可以表示0255,
18、如果表示负数,则最高位表示-128,此时该八位二进制可表示-128127。习题一:把-10,-110化成二进制。习题二:1000011B表示正数时是多少?表示负数时是多少?5.二进制表示字母和其他符号。一百二十三即123是数字,但是0、1等本身可以作为字符,例如昵称HYC1975,不能说这个昵称是三个字母和一个数组成,而说是由七个字符组成。像a、b、c这样的52个字母、一些常用的符号(例如*、#、等)在计算机中存储时也要使用二进制数来表示。为了表示这些字符,人们把这些字符进行了排序并且编号,美国有关的标准化组织出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。例如大写字母A的编
19、号是65号。下表是最简单版本的ASCII表格,分为三个部分,最上面一行是“高位”,读取的时候统一在左边填一个零;最左边一列是“低位”;右下方一个矩形是符号的位置,一共8*16=128个符号,分别用00000000111111表示。我们可以这样查:看到符号“A”,向上看到100,填零变成0100,向左看到0001,那么A的编号就是0100 0001B,也就是十六进制的41H,十进制的65D。也就是说,按照国际规定,从一个存储单元读出41H,如果看作是数字,就是65,如果看作是字符,就是A。上表中,我们需要记住关键的字符,0 011 0001是字符“1”或文本“1”,0 100 0001是大写的A
20、,0 110 0001是小写的a。记住这几个,其他的数字字符,大写和小写字母都能计算出来。还有常用的空格是32D,也就是20H,0010 0000B。例一:查出B的在计算机中存储。答:找到B,向上为0100,向左为0010,因此(B)=01000010B=42H例二:从计算机某存储单元读出一个01111001B,它做什么字符解释?答:去掉第一位0,先查111竖列,1001横列,得到y。习题一:查出g在计算机中存储。习题二:从计算机某存储单元读出01101000B,做什么字符解释?6.二进制表示汉字。(略)三、通用存储器和8051的特殊存储器的其他知识:1、通用存储器堆和栈的概念在计算机领域,栈
21、是一个不容忽视的概念,栈是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top)对数据项进行插入和删除。单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。我们这里只要知道,在存储器中,需要单独保留出一块区域,用来留给栈使用即可。2、8051特殊寄存器一些概念8051分程序存储器和数据存储器。其中程序存储器专门放程序,数据存储器专门放数据。8051可以访问到的程序存储器和数据存储器都是65536个,但是作为一个小芯片,8051内部不可能有那么大的空间装怎么多存储器,所以,要建立8051具有内部程序存储器和内部数据存储器的概念。外部程序存储器和外部数据
22、存储器需要外接硬件,后面再阐述。还要建立型号的概念,例如8031和8051的区别就在于后者有内部程序存储器,而前者没有。这就像手机荣耀7i (ATH-AL00)和荣耀7i (ATH-TL00H),型号差一个字母,前者3G的内存,后者2GB内存,其他地方一模一样。8031,8051,80C51,89C52、等等许多芯片,统称为8051系列。对于我们学习的8051,其片内有4096个字节的程序存储器,学习编程用足够了,更重要的是片内有255个数据存储器,其中可以自由用的只有几十个,其它都被CPU征用掉了,包括刚才的栈。后面再阐述。注释:(可以略过)存储器分哈佛结构和冯诺依曼结构。哈佛结构把程序和数
23、据分来放,冯诺依曼结构把两者放在一起。但是哈佛结构还要求数据和地址线独用,所以8051也不能算哈佛结构。3、存储器其他概念:有些存储器失去电源了,内容还在,例如优盘和硬盘;另一些例如台式机、手机的内存,失电了内容就没了。前者称为非易失性存储器,后者称为易失性存储器。在非易失性存储器中,又可以分为不可改写的存储器,例如光盘;紫外线可擦除的存储器,例如某些专用存储器;电可擦除存储器,例如优盘,也就是闪存盘,硬盘。上面讲的大部分正确,但是在存储器日新月异的现代,某些分类变得越来越模糊,所以很难区分某些存储器属于哪一类。存储器读取的速度通常比较写的速度快;更多存储器的概念请看专业书籍。第三章 CPU执
24、行程序和指令系统一、CPU的时序和指令人的心脏从出生开始就永久的周期性运行。心脏舒张时静脉血液回流入心,心脏收缩时血液泵到动脉。心脏每收缩和舒张一次构成一个心动周期。如以成年人平均心率每分钟75次计,每一心动周期平均为0.8秒,其中心房收缩期平均为0.1秒,舒张期平均为0.7秒。单片机的CPU和人的心脏一样,一旦上电,就按照一定的频率执行指令,根据这个频率,产生几个周期概念。最短的周期是晶振做振荡一次,称为一个振荡周期;12个振荡周期构成一个机器周期,在一个机器周期内,CPU可以完成取指令和执行大部分简单指令的动作。和心脏不同的是,人的血液是均匀的,指令不是,有些指令一个机器周期完成不了,需要
25、两个机器周期或者四个机器周期才能完成。8051系列的单片机一共有111条指令,其中64条单周期指令,45条双周期指令和2条四周期指令。二、CPU的常用控制资源CPU要从存储单元中取出指令并执行,前面提到至少需要一个称为“程序指针”的资源,来判定从哪里读取下一条指令。其实还需要很多其他的附属资源。所有这些资源其实都不是额外的,芯片设计者事先定好了存储器的某些特殊地址来存放这些资源,CPU在执行时可以照章办事的使用这些资源。80C51单片机内部有多个用于存储各个参数的存储单元,称为寄存器:累加寄存器,简称累加器:A,是专门存放算术或逻辑运算的一个操作数和运算结果的寄存器。能进行加、减、读出、移位、
26、循环移位和求补等操作。是运算器的主要部分。芯片设计者指定存储单元E0H作为A的地址。普通寄存器:R0R7共8个。用来存放一般数据,其实R0就是内部数据存储器00H的别称,“向R0中存数据”和“向00H中存数据”是一个意思。标志寄存器:PSW;这是一个存放条件标志、控制标志的寄存器,主要用于反映处理器的状态和运算结果的某些特征及控制指令的执行。后面用到时解释。设计者指定内部数据存储器的第D0H号单元作为PSW的地址。80C51单片机内部有三个常用的指针,即:程序指针PC:存放下一条将要从程序存储器取出的指令的地址;PC是唯一一个没有地址的资源。数据指针DPTR: 16位的特殊功能寄存器, 其高位
27、字节寄存器用DPH表示,低位字节寄存器用DPL表示,DPTR既可以作为一个16位的寄存器来处理,也可以作为两个独立的8位寄存器来使用。主要功能是存放16位地址,作为片外RAM寻址用的地址寄存器(间接寻址),故称数据指针,也可以将外部RAM中地址的内容传送到内部RAM的地址所指向的内容中。DPH和DPL的地址分别为83H、82H。堆栈指针SP:80C51在片内数据存储器中开辟栈区,按"先进后出"的原则存取数据。堆栈指针总是指向栈顶元素,开机复位后,单片机栈底和栈顶地址为07H。数据入栈的时候,堆栈指针先加1,再压栈。出栈的时候先弹出数据,堆栈指针再减1。栈的用处主要用来保存临
28、时数据,局部变量和中断/调用子程序程序的返回地址。SP的地址为81H。三、8051系列的指令系统任何复杂的结构都是由简单的结构组成的,世界上多么复杂的数学公式,都是由六种最基本的公式经过四则运算和复合组成的。任何一种计算机程序也是一样,8051的设计者一共提供了111种指令,就可以实现绝大多数的需求了。180C51指令的分类:80C51的指令系统共有111条指令,按其功能可分为5大类:数据传送类指令,算术运算类指令,逻辑运算类指令,控制转移类指令和布尔操作类指令。在80C51系列的指令系统中,有单子节指令,双子节指令,和三字节指令。还可按指令执行时间分类: 单周期指令(65),双周期指令(44
29、条),四周期指令(2条)。2. 80C51的寻址方式:单片机寻址方式就是指寻找操作数或操作地址的方式,常用的寻址方式有七种。在用到的时候,请自行查阅上的相关表格。第四章 8051的纯软程序示例一、执行程序段后,PSW的结果;CPU的使用的多种资源中,有一个资源是PSW,称为程序状态字,因为一个字节是八个二进制,因此PSW可以记录八个状态。其中初学者需要关心的是下面四个:(1)Cy(PSW.7),进位标志位,表示加法运算中的进位和减法运算中的借位,加法运算中有进位或减法运算中有借位则CY位置1,否则为0(2)Ac(PSW.6),辅助进位标志位,当低四位向高四位借进位时Ac被置1,否则清0。(5)
30、OV(PSW.2)溢出标志位,在执行有符号运算时,若运算结果超过了8位二进制数所能表示数据的范围即有符号数-128+127,则标志位置1。(7)P(PSW.0):奇偶标志位,判断累加器A中1的个数,如是奇数个就被置1。例一:MOV A, #0ACH ; 解释成无符号数是173,解释成有符号数是-84ADD A, #80H ; 解释成无符号数是128,解释成有符号数是-128二进制计算有符号数计算1010 1100+ 1000 0000(1) 0010 1110 =2EH第四位向第五位没有进位,因此Ac=0;00101110中1的个数4,因此P=0 -84+ -128 -212看上面的表格,80
31、51在做ADD A,80H的时候,不管程序员存的是无符号还是有符号数,一概按表格最左边二进制方法计算,然后把0010 1110这个数存入A。对于状态字,因为二进制计算时有进位,因此CY=1;然后再按表格右边有符号数计算一次,如果超过-128127,就把OV置一。所以,上述例子的执行结果是:(A)=2EH,(Cy)=1,(AC)=0,(P)=0,(OV)=1例二:MOV A, #0D3H ; 解释成无符号数是211,解释成有符号数是 -45ADD A, #0E8H ; 解释成无符号数是232,解释成有符号数是 -24二进制计算有符号数计算1101 0011+) 1110 1000 (1) 101
32、1 1011 = BBH第四位向第五位没有进位,因此Ac=0;10111011中1的个数6,因此P=0- 45 + - 24 - 69 因为二进制计算时有进位,所以Cy=1;按有符号计算没有超限,所以OV=0。则结果: CY=1,AC=0,P=0,OV=0,(A)=BBH (按有符号计算则D3H+E8H=BBH是正确)例三:设(A)=49H,Cy=0,执行SUBB A,#54H (49H=73D;54H=84D)二进制计算有符号数计算49H = 0100 1001-) 54H = 0101 0100 1111 0101 = F5H第四位向第五位没有进位,因此Ac=0;1111 0101中1的个
33、数4,因此P=0 73 - 84 - 11D = F5H因为有借位,所以Cy=1;按有符号计算没有超限,所以OV=0。则结果:CY=1,AC=0,P=0,OV=0,(A)=F5H(真值-11,按有符号计算是正确的)二、软件延时:写高级语言时,写个sleep(1),就可以延时1秒;写汇编语言,计算的就比较精确,设单片机的晶振频率为12MHz,则震荡一次的时间为秒,一个机器周期等于12个震荡周期,即一个机器周期的时间是秒。下面是延时的标准程序,事先查出指令MOV Rn, #data的执行时间是1个机器周期,指令NOP是1个机器周期,指令DJNZ Rn, Rel是2个机器周期。则计算方法如下:DEL
34、AY:MOV R7, #200; DEL1: MOV R6, #123; NOP;DJNZ R6, $;DJNZ R7, DEL1; RET;看右边的流程图,执行第1条指令花去了一个机器周期,执行第2、3条指令各花去一个机器周期,执行一次第4条指令花费两个机器周期,这一条指令会反复执行123次,共花费123*2个机器周期,然后才会落到第5条指令,所以,从第2条指令执行到第5条需要的机器周期为:1*1 + 1*1 + 123*2 +1*2第5条指令会根据R7的内容判断,前199次会跳到标号处执行,也就是第2条指令到第5条指令这一段,会重复执行200次。其指令的指令周期公式为:200 *(1*1
35、+ 1*1 + 123*2 +1*2) 加上第一条和第六条指令各执行了一次,前后各加一,得到最终的公式:t=1+200(1+1+2*123+2)+1»50000us=50ms三、数据传送将片内RAM从20H开始(增址方向)存放的8个单字节数据传送到片内30H开始(增址方向)的单元中。本段为原实验注释:分析:数据块传送,注意数据存放位置和顺序。流程:初始化、取数、送数、循环。寻址方式:源、目的两操作数均用寄存器间址(r0,r1)。注意:循环次数及循环结束控制方式。org 0 ;伪指令,告诉芯片从0000号; 存储单元开始存放程序。mov 20H, #01H ;在20H这个地址先放一个数
36、01mov 21H, #02H ;在21H这个地址先放一个数02mov 27H, #07H ;示例而已其他五个数不放不要紧deliver: mov r0, #20H;把20H这个数放入R0 mov r1, #30H;把30H这个数放入R1 mov r2, #8 ;把8这个数放入R2 ;程序执行到这里见右侧“内容1”deloop: mov a, r0 ;见下面解释。 mov r1, a inc r0 ;R0里面的数增1 inc r1 djnz r2, deloop ;R2先减1,如不等0跳转到deloop sjmp $ ;原地踏步 end ;程序执行到这里见右侧“内容2”地址编号地址内容1地址内
37、容2。31H空02H30H空01H。21H02H不变20H01H不变。R28H0HR130H38HR020H28H看了上面的程序,MOV 20H,#01H;MOV r0,#20H;inc r0;sjmp $;这些指令都好理解。请自行看书上的相关说明。mov a, r0 表示R0的内容作为地址,带的指令要读两次,第一次读到R0的内容是“20H”,第二次以这个“20H”为地址读取其中的内容是“01H”,所以是把“01H”放入到寄存器a中。四、数据搜索查找在内部RAM的20H50H单元中是否有0AAH这一数据,若有则将51H单元置为01H;若未找到,则将51H单元置为0。分析:将被检索数据集逐一与关
38、键字进行比较(作减法)。流程:初始化、取数、比较、置结果、循环。寻址方式:寄存器间址(r0或r1)。比较方式:用SUBB或CJNE均可作比较。注意:循环次数及循环结束控制方式。org 0search: mov r0, 20H mov a, #0AAH mov 51h, #0seloop: clr c subb a, r0 jnz senext mov 51h, #1 sjmp sedonesenext: inc r0 cjne r0, #50H, seloopsedone: sjmp $ end说明:(1) 请查阅带借位减法subb,累加器A中的内容减去另一个操作数的内容,还要减去进位位CY。
39、所以为什么上一条指令要清CY标志。(2) JNZ表示累加器A不为零则跳转。JNZ意为Jump if acc is Not Zero(3) cjne这条指令是比较R0与#50H,因为是从20H开始找,找不到就找下一个地址21H,一直找到50H五、分段赋值:假设P1口接一速度传感器,试编写程序根据速度值设定寄存器R1的值;要求:速度<10H时,R1=1;速度=10H时,R1=2;速度>10H时。R1=3ORG 0050HMOV A, P1;CJNE A, #10, L1;MOV R1, #2;LJMP L3;L1: JC L2;MOV R1, #3LJMP L3L2: MOV R1,
40、#1;L3: SJMP $END把P1的值读入放到累加器A。比较R0与#10H,如果两者不相等则跳转到L1。如相等就执行到这一句,把速度为10H时该赋的值赋上既然速度等于10H,执行完赋值就直接跳到结尾。速度不为10H就跳到这里。这个JC有讲究见下面。如上句不跳转,执行到这句说明速度>10H,因此赋3赋值完跳转到结尾。如果JC判断跳转就到这里,说明速度<10H,因此赋1原地踏步程序必须有END做结尾。CJNE这个指令教材上有专门的讲解,若两者相等则罢,如果不相当,因为其实际做了一次减法,因此会产生CY标志,对于CJNE A, #10, L1;来说,如果A中的数小于#10,则该指令执
41、行后,会导致CY=1,这一点就在JC L2;这一句被利用上了。这一句就是判断CY,如果CY=1则跳转。结合上面CJNE这一句,如果A小于#10,就会导致CY=1,这里就会跳转。六、使用查表指令编写程序。通常,程序放在程序存储器,数据放在数据存储器,一般,在执行程序期间,程序存储器是只读的,数据存储器是可读可写的。但是某些程序中,有一些数据是固定的,可以提前设好的,最典型的就是七段数码管,显示零的时候点亮某几个管子,显示一的时候点亮另外某几个管子;这些数据因为从来不变,因此可以当做是只读的,可以放在程序存储器。下面给出一例:将存放在片内50H的1位十六进制数转换成相应的ASCII码,保存回原地址
42、。答:因为一个存储单元是8位的,即11111111,换成16进制是两个F即FF;因此一个单元其实存放了两位的十六进制,先只需将1位十六进制转换,则这里把高位去掉再转换。此外,请回过去看本文第二章存储器的第五点,一个数字“1”,可以看做一个数值,这是保存在存储器中是01H,但是如果把这个“1”看成字符,则根据ASCII表,其保存在存储器中就是31H。本题的目的就是若原50H内的值是1,就表示其数值为“1”,将转化为ASCII即为31。ORG 0000HMOV A, 50H; /把50H的内容放到AANL A, #0FH; /与操作,执行后A中原数为XYH,现在就是0YH,高位被清零MOV DPT
43、R, #TABLE; /把#TABLE的地址的值赋给DPTRMOVC A, A+DPTR; /把程序存储器中A+DPTR这个地址的内容赋给AMOV 50H, A; /把A的内容存入50HSJMP $TABLE: DB 0, 1, 2, 3, 4, 5, 6, 7, 8, 9;DB A, B, C, D, E, F;END本例中这两句最关键:MOV DPTR, #TABLE; MOVC A, A+DPTR;(1)要理解MOV DPTR, #TABLE;先要说道CPU执行指令的过程。先要有编译软件把汇编语言改写成机器码,然后才能写到存储器中。编译软件先按照书上的一一对应关系,把MOV A,0x50
44、 改写成E5 50,放到00 00的存储器位置。因为E5 50占两个位置,因此占据了00 01这两个位置。接下来ANL A,#0x0F被翻译成54 0F,接着放,那么就放到02 03这两个位置,以此类推。写到MOV DPTR, #TABLE;这一句时,知道先把MOV DPTR, XXXX翻译成90XXXX,后面的这两个位置不知道写什么,因此就先把位置占着,继续翻译,直到全部程序翻译完,如下表。第二次编译时,才把漏掉的TABLE位置填上。存储器机器码 汇编语言0x00 00E5 50MOV A,0x500x00 0254 0FANL A,#0x0F0x00 0490 00 0CMOV DPTR,
45、#0x000C;这里的00 0C是第二遍翻译时写上的0x00 0793 MOVC A,A+DPTR0x00 08F5 50MOV 0x50,A0x00 0A80 FESJMP $0x00 0C30 31 32 33这里开始是数据 ;编译程序第一遍翻译到这里,才知道0x00 1034 35 36 27 ;原来TABLE是代表00 0C的位置。0x00 1438 39 3A 3B0x00 183C一地址放一数据,只不过看着方便才把一组数据并起来0x00 193D0x00 1A3E0x00 1B3F(2)MOVC A, A+DPTR;MOVC是从程序存储器中读取,读取的内容是从RPTR开始算,偏移A
46、个位置,然后读出的数据放入A保存。例如,A中是3,那么由于DPTR是TABLE的值,也就是000C,因此从A偏移3个正好是33,33正好代表数字3的ASCII表示。这个表示非常典型,可以当做一个整体来记忆。基本上就是七段数码管会用到。第五章 8051的外部接口一、单片机的接口89C51共40个外接管脚,可以分批考虑:(1)主电源引脚VCC,VSS。(2)时钟引脚XTAL1,XTAL2。(3)输入输出引脚P0、P1、P2、P3共32根。(4)控制引脚:暂时牢记即可 ALE/PROG(上划线):地址锁存有效信号。 PSEN(上划线):片外存储器读选通信号。RESET:复位EA/Vpp:片外存储器选
47、用端。附:89C51单片机的低功耗方式包括待机方式和掉电保护方式。二、单片机的扩展在由单片机构成的实际测控系统中,最小应用系统往往不能满足要求,因此在系统设计时首先要解决系统扩展问题。单片机的系统扩展主要有程序存储器(ROM)扩展,数据存储器(RAM)扩展以及I/O口的扩展。89C51单片机的并行扩展三总线包括:地址总线、数据总线和控制总线。目前单片机系统扩展的方法有并行扩展和串行扩展。上面是微机原理及应用的前期内容。除此之外,通常89C51额外接其他以下芯片来实现常用的功能:例如串口,并口,等。在后续的课程中会提到。三、片外扩展程序存储器和数据存储器详解:这里本次补考复习暂时忽略。深刻体会上面提到的两个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年式通勤车租赁合同
- 《动态奖惩机制下装配式建筑质量链参与主体演化博弈研究》
- 《旋后肌综合征“三线定位法”诊断意义及临床应用研究》
- 《渐进式膈肌锻炼对肺癌围手术期患者肺康复效果的影响》
- 《miR-219a-5p在人骨髓间充质干细胞成骨分化中的作用及机制研究》
- 2024年那曲公交车从业资格证考试题库
- 2024年阿坝小型客运从业资格证考试题答案
- 2024年贵港道路旅客运输驾驶员继续教育试题
- 2024年度物流运输合同:物流公司与托运人就货物运输、保险等事项
- 2024年齐齐哈尔道路运输从业资格证考试
- 脑卒中基本知识课件
- 高效沟通与管理技能提升课件
- 消防维保方案 (详细完整版)
- 四年级上册英语课件- M3U1 In the school (Period 3 ) 上海牛津版试用版(共15张PPT)
- 档案馆建设标准
- 高边坡支护专家论证方案(附有大量的图件)
- 苏教版五年级上册数学试题-第一、二单元 测试卷【含答案】
- 人员定位矿用井口唯一性检测系统
- 电力系统数据标记语言E语言格式规范CIME
- 历史纪年与历史年代的计算方法
- 快递物流运输公司 国际文件样本 形式发票样本
评论
0/150
提交评论