关闭

关闭

关闭

封号提示

内容

首页 平凡单片机教程.pdf

平凡单片机教程.pdf

平凡单片机教程.pdf

上传者: 牛子蛋2011 2011-10-10 评分 0 0 0 0 0 0 暂无简介 简介 举报

简介:本文档为《平凡单片机教程pdf》,可适用于IT/计算机领域,主题内容包含平凡的单片机教程自学单片机第页共页原作:平凡的单片机平凡的单片机教程自学单片机第页共页单片机教程第一课:单片机概述、何谓单片机一台能够工作的计算机要符等。

平凡的单片机教程自学单片机第页共页原作:平凡的单片机平凡的单片机教程自学单片机第页共页单片机教程第一课:单片机概述、何谓单片机一台能够工作的计算机要有这样几个部份构成:CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入输出设备(例如:串行口、并行输出口等)。在个人计算机上这些部份被分成若干块芯片安装一个称之为主板的印刷线路板上。而在单片机中这些部份全部被做到一块集成电路芯片中了所以就称为单片(单芯片)机而且有一些单片机中除了上述部份外还集成了其它部份如ADDA等。天!PC中的CPU一块就要卖几千块钱这么多东西做在一起还不得买个天价!再说这块芯片也得非常大了。不价格并不高从几元人民币到几十元人民币体积也不大一般用脚封装当然功能多一些单片机也有引脚比较多的如引脚功能少的只有多个或多个引脚有的甚至只只引脚。为什么会这样呢?功能有强弱打个比方市场上面有的组合音响一套才卖几百块钱可是有的一台功放机就要卖好几千。另外这种芯片的生产量很大技术也很成熟系列的单片机已经做了十几年所以价格就低了。既然如此单片机的功能肯定不强干吗要学它呢?话不能这样说实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能一个控制电冰箱温度的计算机难道要用PIII?应用的关键是看是否够用是否有很好的性能价格比。所以出来十多年依然没有被淘汰还在不断的发展中。、MCS单片机和、、C等的关系我们平常老是讲又有什么现在又有C它们之间究竟是什么关系MCS是指由美国INTEL公司(对了就是大名鼎鼎的INTEL)生产的一系列单片机的总称这一系列单片机包括了好些品种如等其中是最早最典型的产品该系列其它单片机都是在的基础上进行功能的增、减、改变而来的所以人们习惯于用来称呼MCS系列单片机而是前些年在我国最流行的单片机所以很多场合会看到的名称。INTEL公司将MCS的核心技术授权给了很多其它公司所以有很多公司在做以为核心的单片机当然功能或多或少有些改变以满足不同的需求其中C就是这几年在我国非常流行的单片机它是由美国ATMEL公司开发生产的。以后我们将用C来完成一系列的实验。单片机教程第二课:单片机的内部、外部结构(一)一、单片机的外部结构拿到一块芯片想要使用它首先必须要知道怎样连线我们用的一块称之为C的芯片下面我们就看一下如何给它连线。、电源:这当然是必不可少的了。单片机使用的是V电源其中正极接引脚负极(地)接引脚。、振蒎电路:单片机是一种时序电路必须提供脉冲信号才能正常工作在单片机内部已集成了振荡器使用晶体振荡器接、脚。只要买来晶振电容连上就可以了按图接上即可。、复位引脚:按图中画法连好至于复位是何含义及为何需要复要复位在单片机功能中介绍。、EA引脚:EA引脚接到正电源端。至此一个单片机就接好通上电单片机就开始工作了。我们的第一个任务是要用单片机点亮一只发光二极管LED显然这个LED必须要和单片机的某个引脚相连否则单片机就没法控制它了那么和哪个引脚相连呢?单片机上除了刚才用掉的个引脚还有个我们将这个LED和脚相连。(见图其中R是限流电阻)按照这个图的接法当脚是高电平时LED不亮只有脚是低电平时LED才发亮。因此要脚我们要能够控制也就是说我们要能够让引脚按要求变为高或低电平。即然我们要控制脚就得给它起个名字总不能就叫它一脚吧?叫它什么名字呢?设计芯片的INTEL公司已经起好了就叫它P这是规定不可以由我们来更改。AdministratorUnderline平凡的单片机教程自学单片机第页共页图名字有了我们又怎样让它变'高'或变'低'呢?叫人做事说一声就可以这叫发布命令要计算机做事也得要向计算机发命令计算机能听得懂的命令称之为计算机的指令。让一个引脚输出高电平的指令是SETB让一个引脚输出低电平的指令是CLR。因此我们要P输出高电平只要写SETBP要P输出低电平只要写CLRP就可以了。现在我们已经有办法让计算机去将P输出高或低电平了但是我们怎样才能计算机执行这条指令呢?总不能也对计算机也说一声了事吧。要解决这个问题还得有几步要走。第一计算机看不懂SETBCLR之类的指令我们得把指令翻译成计算机能懂的方式再让计算机去读。计算机能懂什么呢?它只懂一样东西数字。因此我们得把SETBP变为(DH,H)把CLRP变为(CH,H)至于为什么是这两个数字这也是由芯片的设计者INTEL规定的我们不去研究。第二步在得到这两个数字后怎样让这两个数字进入单片机的内部呢?这要借助于一个硬件工具"编程器"。我们将编程器与电脑连好运行编程器的软件然后在编缉区内写入(DH,H)见图写入……好拿下片子把片子插入做好的电路板接通电源……什么灯不亮?这就对了因为我们写进去的指令就是让图P输出高电平灯当然不亮要是亮就错了。现在我们再拨下这块芯片重新放回到编程器上将编缉区的内容改为(CH,H)也就是CLRP写片拿下片子把片子插进电路板接电好灯亮了。因为我们写入的()就是让P输出低电平的指令。这样我们看到硬件电路的连线没有做任何改变只要改变写入单片机中的内容就可以改变电路的输出效果。三、单片机内部结构分析我们来思考一个问题当我们在编程器中把一条指令写进单片要内部然后取下单片机单片机就可以执行这条指令那么这条指令一定保存在单片机的某个地方并且这个地方在单片机掉电后依然可以保持这条指令不会丢失这是个什么地方呢?这个地方就是单片机内部的只读存储器即ROM(READONLYMEMORY)。为什么称它为只读存储器呢?刚才我们不是明明把两个数字写进去了吗?原来在C中的ROM是一种电可擦除的ROM称为FLASHROM刚才我们是用的编程器在特殊的条件下由外部设备对ROM平凡的单片机教程自学单片机第页共页进行写的操作在单片机正常工作条件下只能从那面读不能把数据写进去所以我们还是把它称为ROM。单片机教程第三课:几个基本概念数的本质和物理现象。我们知道计算机可以进行数学运算这可令我们非常的难以理解计算机吗我们虽不了解它的组成但它总只是一些电子元器件怎么可以进行数学运算呢?我们做数学题如是这样做的先在纸上写然后在下面写然后大脑运算最后写出结果运算的原材料:、和结果:都是写在纸上的计算机中又是放在什么地方呢?为了解决这个问题先让我们做一个实验:这里有一盏灯我们知道灯要么亮要么不亮就有两种状态我们可以用’’和’’来代替这两种状态规定亮为’’不亮为’’。现在放上两盏灯一共有几种状态呢?我们列表来看一下:状态表达请大家自已写上盏灯的情况我们来看这个不就是我们学过的的二进制数吗?本来灯的亮和灭只是一种物理现象可当我们把它们按一按的顺序排更好后灯的亮和灭就代表了数字了。让我们再抽象一步灯为什么会亮呢?看电路是因为输出电路输出高电平给灯通了电。因此灯亮和灭就可以用电路的输出是高电平还是低电平来替代了。这样数字就和电平的高、低联系上了。(请想一下我们还看到过什么样的类似的例子呢?(海军之)灯语、旗语电报甚至红、绿灯)位的含义:通过上面的实验我们已经知道:一盏灯亮或者说一根线的电平的高低可以代表两种状态:和。实际上这就是一个二进制位因此我们就把一根线称之为一“位”用BIT表示。字节的含义:一根线可以表于和两根线可以表达四种状态也就是可以表于到而三根可以表达计算机中通常用根线放在一起同时计数就可以表过到一共种状态。这根线或者位就称之为一个字节(BYTE)。不要问我为什么是根而不是其它数因为我也不知道。(计算机世界是一个人造的世界不是自然界很多事情你无法问为什么只能说:它是一种规定大家在以后的学习过程中也要注意这个问题)存储器的工作原理:、存储器构造存储器就是用来存放数据的地方。它是利用电平的高低来存放数据的也就是说它存放的实际上是电平的高、低而不是我们所习惯认为的这样的数字这样我们的一个谜团就解开了计算机也没什么神秘的吗。图图让我们看图。这是一个存储器的示意图:一个存储器就象一个个的小抽屉一个小抽屉里有八个小格子每个Administrator下划线Administrator下划线Administrator下划线平凡的单片机教程自学单片机第页共页小格子就是用来存放“电荷”的电荷通过与它相连的电线传进来或释放掉至于电荷在小格子里是怎样存的就不用我们操心了你可以把电线想象成水管小格子里的电荷就象是水那就好理解了。存储器中的每个小抽屉就是一个放数据的地方我们称之为一个“单元”。有了这么一个构造我们就可以开始存放数据了想要放进一个数据也就是我们只要把第二号和第三号小格子里存满电荷而其它小格子里的电荷给放掉就行了(看图)。可是问题出来了看图一个存储器有好多单元线是并联的在放入电荷的时候会将电荷放入所有的单元中而释放电荷的时候会把每个单元中的电荷都放掉这样的话不管存储器有多少个单元都只能放同一个数这当然不是我们所希望的因此要在结构上稍作变化看图在每个单元上有个控制线我想要把数据放进哪个单元就给一个信号这个单元的控制线这个控制线就把开关打开这样电荷就可以自由流动了而其它单元控制线上没有信号所以开关不打开不会受到影响这样只要控制不同单元的控制线就可以向各单元写入不同的数据了同样如果要某个单元中取数据也只要打开相应的控制开关就行了。、存储器译码那么我们怎样来控制各个单元的控制线呢?这个还不简单把每个单元元的控制线都引到集成电路的外面不就行了吗?事情可没那么简单一片存储器中有个单元把每根线都引出来这个集成电路就得有万多个脚?不行怎么办?要想法减少线的数量。我们有一种方法称这为译码简单介绍一下:一根线可以代表种状态根线可以代表种状态根线可以代表几种种状态又需要几根线代表?种根线所以种状态我们只需要根线就可以代表了。、存储器的选片及总线的概念至此译码的问题解决了让我们再来关注另外一个问题。送入每个单元的八根线是用从什么地方来的呢?它就是从计算机上接过来的一般地这八根线除了接一个存储器之外还要接其它的器件如图所示。这样问题就出来了这八根线既然不是存储器和计算机之间专用的如果总是将某个单元接在这八根线上就不好了比如这个存储器单元中的数值是FFH另一个存储器的单元是H那么这根线到底是处于高电平还是低电平?岂非要打架看谁历害了?所以我们要让它们分离。办法当然很简单当外面的线接到集成电路的引脚进来后不直接接到各单元去中间再加一组开关(参考图)就行了。平时我们让开关打开着如果确实是要向这个存储器中写入数据或要从存储器中读出数据再让开关接通就行了。这组开关由三根引线选择:读控制端、写控制端和片选端。要将数据写入片中先选中该片然后发出写信号开关就合上了并将传过来的数据(电荷)写入片中。如果要读先选中该片然后发出读信号开关合上数据就被送出去了。注意图读和写信号同时还接入到另一个存储器但是由于片选端不同所以虽有读或写信号但没有片选信号所以另一个存储器不会“误会”而开门造成冲突。那么会不同时选中两片芯片呢?只要是设计好的系统就不会因为它是由计算控制的而不是我们人来控制的如果真的出现同时出现选中两片的情况那就是电路出了故障了这不在我们的讨论之列。从上面的介绍中我们已经看到用来传递数据的八根线并不是专用的而是很多器件大家共用的所以我们称之为数据总线总线英文名为BUS总即公交车道谁者可以走。而十六根地址线也是连在一起的称之为地址总线。半导体存储器的分类按功能可以分为只读和随机存取存储器两大类。所谓只读从字面上理解就是只可以从里面读不能写进去它类似于我们的书本发到我们手回之后我们只能读里面的内容不可以随意更改书本上的内容。只读存储器的英文缩写为ROM(READONLYMEMORY)所谓随机存取存储器即随时可以改写也可以读出里面的数据它类似于我们的黑板我可以随时写东西上去也可以用黑板擦擦掉重写。随机存储器的英文缩写为RAM(READRANDOMMEMORY)这两种存储器的英文缩写一定要记牢。注意:所谓的只读和随机存取都是指在正常工作情况下而言也就是在使用这块存储器的时候而不是指制造这块芯片的时候。否则只读存储器中的数据是怎么来的呢?其实这个道理也很好理解书本拿到我们手里是不能改了可以当它还是原材料白纸的时候当然可以由印刷厂印上去了。顺便解释一下其它几个常见的概念。PROM称之为可编程存储器。这就象我们的练习本买来的时候是空白的可以写东西上去可一旦写上去Administrator下划线Administrator下划线Administrator下划线Administrator下划线Administrator下划线Administrator下划线平凡的单片机教程自学单片机第页共页就擦不掉了所以它只能用写一次要是写错了就报销了。EPROM称之为紫外线擦除的可编程只读存储器。它里面的内容写上去之后如果觉得不满意可以用一种特殊的方法去掉后重写这就是用紫外线照射紫外线就象“消字灵”可以把字去掉然后再重写。当然消的次数多了也就不灵光了所以这种芯片可以擦除的次数也是有限的几百次吧。FLASH称之为闪速存储器它和EPROM类似写上去的东西也可以擦掉重写但它要方便一些不需要光照了只要用电学方法就可以擦除所以就方便许多而且寿面也很长(几万到几十万次不等)。再次强调这里的所有的写都不是指在正常工作条件下。不管是PROM、EPROM还是FLASHROM它们的写都要有特殊的条件一般我们用一种称之为“编程器”的设备来做这项工作一旦把它装到它的工作位置就不能随便改写了。单片机教程第四课:第一个小程序上一次我们的程序实在是没什么用要灯亮还要重写一下片子下面我们要让灯不断地闪烁这就有一定的实用价值了比如可以把它当成汽车上的一个信号灯用了。怎样才能让灯不断地闪烁呢?实际上就是要灯亮一段时间再灭一段时间也就是说要P不断地输出高和低电平。怎样实现这个要求呢?请考虑用下面的指令是否可行:SETBPCLRP……这是不行的有两个问题第一计算机执行指令的时间很快执行完SETBP后灯是灭了但在极短时间(微秒级)后计算机又执行了CLRP指令灯又亮了所以根本分辨不出灯曾灭过。第二在执行完CLRP后不会再去执行SETBP指令所以以后再也没有机会让灭了。为了解决这两个问题我们可以做如下设想第一在执行完SETBP后延时一段时间(几秒或零点几秒)再执行第二条指令就可以分辨出灯曾灭过了。第二在执行完第二条指令后让计算机再去执行第一条指令不断地在原地兜圈我们称之为"循环"这样就可以完成任务了。以下先给出程序(后面括号中的数字是为了便于讲解而写的实际不用输入):主程序:LOOP:SETBP(1)LCALLDELAY(2)CLRP(3)LCALLDELAY(4)AJMPLOOP(5)以下子程序DELAY:MOVR#(6)D:MOVR#(7)D:DJNZRD(8)DJNZRD(9)RET(10)END(11)按上面的设想分析一下前面的五条指令。第一条是让灯灭第二条应当是延时第三条是让灯亮第四条和第二条一模一样也是延时第五条应当是转去执行第一条指令。第二和第四条实现的原理稍后谈先看第五条LJMP是一条指令意思是转移往什么地方转移呢?后面跟的是LOOP看一下什么地方还有LOOP对了在第一条指令的前面有一个LOOP所以很直观地我们可以认识到它要转到第一条指令处。这个第一条指令前面的LOOP被称之为标号它的用途就是给这一行起一个名字便于使用。是否一定要给它起名叫LOOP呢?当然不是起什么名字完全由编程序的人决定可以称它为AX等等当然这时第五条指令LJMP后面的名字也得跟着改了。第二条和第四条指令的用途是延时它是怎样实现的呢?指令的形式是LCALL这条指令称为调用子程序指令看一下指令后面跟的是什么DELAY找一下DELAY在第六条指令的前面显然这也是一个标号。Administrator下划线Administrator下划线Administrator下划线平凡的单片机教程自学单片机第页共页这条指令的作用是这样的:当执行LCALL指令时程序就转到LCALL后面的标号所标定的程序处执行如果在执行指令的过程中遇到RET指令则程序就返回到LCALL指令的下面的一条指令继续执行从第六行开始的指令中可以看到确实有RET指令。在执行第二条指令后将转去执行第6条指令而在执行完6789条指令后将遇到第10条令:RET执行该条指令后程序将回来执行第三条指令即将P清零使灯亮然后又是第四条指令执行第四条指令就是转去执行第条指令然后回来执行第条指令第条指令就是让程序回到第条开始执行如此周而复始灯就在不断地亮、灭了。在标号DELAY标志的这一行到RET这一行中的所有程序这是一段延时程序大概延时零点几秒至于具体的时间以后我们再学习如何计算。程序的最后一行是END这不是一条指令它只是告诉我们程序到此结束它被称为"伪指令"。单片机内部结构分析:为了知道延时程序是如何工作的我们必需首先了解延时程序中出现的一些符号就从R开始R被称之为工作寄存器。什么是工作寄存器呢?让我们从现实生活中来找找答案。如果出一道数学题:让你回答结果是多少你会马上答出是再看下面一道题:要让你要上回答就不这么容易了吧?我们会怎样做呢?如果有张纸就容易了我们先算出=把写在纸上然后再算得到结果是。这其中是我们想要的结果而并非我们所要的结果但是为了得到最终结果我们又不得不先算出并记下来这其实是一个中间结果计算机中做运算和这个类似为了要得到最终结果往往要做很多步的中间结果这些中间结果要有个地方放才行把它们放哪呢?放在前面提到过的ROM中可以吗?显然不行因为计算机要将结果写进去而ROM是不可以写的所以在单片机中另有一个区域称为RAM区(RAM是随机存取存储器的英文缩写)它可以将数据写进去。特别地在MCS单片机中将RAM中分出一块区域称为工作寄存器区单片机教程第五课:延时程序分析上一次课中我们已经知道程序中的符号R、R是代表了一个个的RAM单元是用来放一些数据的下面我们再来看一下其它符号的含义。DELAY:MOVR#(6)D:MOVR#(7)D:DJNZRD(8)DJNZRD(9)RET(10)MOV:这是一条指令意思是传递数据。说到传递我们都很清楚传东西要从一个人的手上传到另一个人的手上也就是说要有一个接受者一个传递者和一样东西。从指令MOVR#中来分析R是一个接受者是被传递的数传递者在这条指令中被省略了(注意:并不是每一条传递指令都会省的事实上大部份数据传递指令都会有传递者)。它的意义也很明显:将数据送到R中去因此执行完这条指令后R单元中的值就应当是。在前面有个#号这又是什么意思呢?这个#就是用来说明就是一个被传递的东西本身而不是传递者。那么MOVR#是什么意思应当不用分析了吧。DJNZ:这是另一条指令我们来看一下这条指令后面跟着的两个东西一个是R一个是DR我们当然已知是什么了查一下D是什么。D在本行的前面我们已学过这称之为标号。标号的用途是什么呢?就是给本行起一个名字。DJNZ指令的执行过程是这样的它将其后面的第一个参数中的值减然后看一下这个值是否等于如果等于就往下执行如果不等于就转移转到什么地方去呢?可能大家已猜到了转到第二个参数所指定的地方去(请大家用自已的话讲一下这条语句是怎样执行的)。本条指令的最终执行结果就是在原地转圈次。Administrator下划线Administrator下划线平凡的单片机教程自学单片机第页共页执行完了DJNZRD之后(也就是R的值等于之后)就会去执行下面一行也就是DJNZRD请大家自行分析一下这句话执行的结果。(转去执行MOVR#同时R中的值减)最终DJNZRD这句话将被执行*=次执行这么多次同一条指令干吗?就是为了延时。一个问题:如果在R中放入会有什么样的结果。二、时序分析:前面我们介绍了延时程序但这还不完善因为我们只知道DJNZRD这句话会被执行次但是执行这么多次需要多长时间呢?是否满足我们的要求呢?我们还不知道所以下面要来解决这个问题。先提一个问题:我们学校里什么是最重要的。(铃声)校长可以出差老师可以休息但学校一日无铃声必定大乱。整个学校就是在铃声的统一指挥下步调一致统一协调地工作着。这个铃是按一定的时间安排来响的我们可以称之为“时序##时间的顺序”。一个由人组成的单位尚且要有一定的时序计算机当然更要有严格的时序。事实上计算机更象一个大钟什么时候分针动什么时候秒针动什么时候时针动都有严格的规定一点也不能乱。计算机要完成的事更复杂所以它的时序也更复杂。我们已知计算机工作时是一条一条地从ROM中取指令然后一步一步地执行我们规定:计算机访问一次存储器的时间称之为一个机器周期。这是一个时间基准好象我们人用“秒”作为我们的时间基准一样为什么不干脆用“秒”多好很习惯学下去我们就会知道用“秒”反而不习惯。一个机器周期包括个时钟周期。下面让我们算一下一个机器周期是多长时间吧。设一个单片机工作于M晶振它的时钟周期是(微秒)。它的一个机器周期是*()也就是微秒。(请计算一个工作于M晶振的单片机它的机器周期是多少)。MCS单片机的所有指令中有一些完成得比较快只要一个机器周期就行了有一些完成得比较慢得要个机器周期还有两条指令要个机器周期才行。这也不难再解不是吗?我让你扫地的执行要完成总得比要你完成擦黑板的指令时间要长。为了恒量指令执行时间的长短又引入一个新的概念:指令周期。所谓指令周期就是指执行一条指令的时间。INTEL对每一条指令都给出了它的指令周期数这些数据大部份不需要我们去记忆但是有一些指令是需要记住的如DJNZ指令是双周期指令。下面让我们来计算刚才的延时。首先必须要知道晶振的频率我们设所用晶振为M则一个机器周期就是微秒。而DJNZ指令是双周期指令所以执行一次要个微秒。一共执行次正好微秒也就是毫秒。练习:设计一个延时毫秒的延时程序。要点分析:、一个单元中的数是否可以超过。、如何分配两个数。三、复位电路任何单片机在工作之前都要有个复位的过程复位是什么意思呢?它就象是我们上课之前打的预备铃。预备铃一响大家就自动地从操场、其它地方进入教室了在这一段时间里是没有老师干预的对单片机来说是程序还没有开始执行是在做准备工作。显然准备工作不需要太长的时间复位只需要ms的时间就可以了。如何进行复位呢?只要在单片机的RST引脚上加上高电平就可以了按上面所说时间不少于ms。为了达到这个要求可以用很多种方法这里提供一种供参考见图。实际上我们在上一次实验的图中已见到过了。这种复位电路的工作原理是:通电时电容两端相当于是短路于是RST引脚上为高电平然后电源通过电阻对电容充电RST端电压慢慢下降降到一定程序即为低电平单片机开始正常工作。单片机教程第六课:单片机的内外部结构分析(四)上两次我们做过两个实验都是让P这个引脚使灯亮我们可以设想:既然P可以让灯亮那么其它的引脚可不可以呢?看一下图它是单片机引脚的说明在P旁边有PP…P它们是否都可以让灯亮呢?除了以P开头的外还有以PPP开头的数一下一共是个引脚前面我们以学过个引脚加上这个这个了。它们都以P字开头只是后面的数字不一样它们是否有什么联系呢?它们能不能都让灯亮呢?在我们的实验板上除了P之外还有P##P都与LED相连下面让我们来做一个实验程序如下:MAIN:MOVP#FFHAdministrator下划线Administrator下划线Administrator下划线Administrator下划线Administrator下划线Administrator下划线Administrator下划线Administrator下划线Administrator下划线Administrator下划线平凡的单片机教程自学单片机第页共页LCALLDELAYMOVP#HLCALLDELAYLJMPMAINDELAY:MOVR#D:MOVR#D:DJNZRDDJNZRDRETEND将这段程序转为机器码用编程器写入芯片中结果如何?通电以后我们可以看到只LED全部在闪动。因此P##P是全部可以点亮灯的。事实上凡以P开头的这个引脚都是可以点亮灯的也就是说:这个引脚都可以作为输出使用如果不用来点亮LED可以用来控制继电器可以用来控制其它的执行机构。程序分析:这段程序和前面做过的程序比较只有两处不一样:第一句:原来是SETBP现在改为MOVP#FFH第三句:原来是CLRP现在改为MOVP#H。从中可以看出P是P##P的全体的代表一个P就表示了所有的这八个管脚了。当然用的指令也不一样了是用MOV指令。为什么用这条指令?看图我们把P作为一个整体就把它当作是一个存储器的单元对一个单元送进一个数可以用MOV指令。二、第四个实验除了可以作为输出外这个引脚还可以做什么呢?下面再来做一个实验程序如下:MAIN:MOVP#FFHLOOP:MOVAPMOVPALJMPLOOP先看一下实验的结果:所有灯全部不亮然后我按下一个按钮第()个灯亮了再按下另一个按钮第()个灯亮了松开按钮灯就灭了。从这个实验现象结合电路来分析一下程序。从硬件电路的连线可以看出有四个按钮被接入到P口的PPPP。第一条指令的用途我们可以猜到:使P口全部为高电平。第二条指令是MOVAP其中MOV已经见是送数的意思这条指令的意思就是将P口的数送到A中去我们可以把A当成是一个中间单元(看图)第三句话是将A中的数又送到P口去第四句话是循环就是不断地重复这个过程这我们已见过。当我们按下第一个按钮时第()只灯亮了所以P口应当输出是低电平为什么P口会输出低电平呢?我们看一下有什么被送到了P口只有从P口进来的数送到A又被送到了P口所以肯定是P口进来的数使得P位输出电平的。P口的P位的按钮被按下使得P位的电平为低通过程序又使P口输出低电平所以P口起来了一个输入的作用。验证:按第二、三、四个按钮同时按下个、个、个按钮都可以得到同样的结论所以P口确实起到了输入作用这样我们可以看到以P字开头的管脚不仅可以用作输出还可以用作输入其它的管脚是否可以呢?是的都可以。这个引脚就称之为并行口下面我们就对并行口的结构作一个分析看一下它是怎样实现输入和输出的。并行口结构分析:、输出结构先看P口的一位的结构示意图(只画出了输出部份):从图中可以看出开关的打开和合上代表了引脚输出的高和低如果开关合上了则引脚输出就是低如果开关打开了则输出高电平这个开关是由一根线来控制的这根数据总线是出自于CPU让我们回想一下数据总线是一根大家公用的线很多的器件和它连在一起在不同的时候不同的器件当然需要不同的信号如某一时刻我们让这个引脚输出高电平并要求保持若干时间在这段时间里计算机当然在忙个不停在与其它器件进行联络这根控制线上的电平未必能保持原来的值不变输出就会发生变化了。怎么解决这个问题呢?我们在存储器一节中学过存储器中是可以存放电荷的我们不妨也加一个小的存储器的单元并在它的前面加一个开关要让这一位输出时就把开关打开信号就进入存储器Administrator下划线平凡的单片机教程自学单片机第页共页的单元然后马上关闭开关这样这一位的状态就被保存下来直到下一次命令让它把开关再打开为止。这样就能使这一位的状态与别的器件无关了这么一个小单元我们给它一个很形象的名字称之为“锁存器”。、输入结构这是并行口的一位的输出结构示意图再看除了输出之外还有两根线一根从外部引脚接入另一根从锁存器的输出接出分别标明读引脚和读锁存器。这两根线是用于从外部接收信号的为什么要两根呢?原来在单片机中输入有两种方式分别称为‘读引脚’和‘读锁存器’第一种方式是将引脚作为输入那是真正地从外部引脚读进输入的值第二种方式是该引脚处于输出状态时有时需要改变这一位的状态则并不需要真正地读引脚状态而只是读入锁存器的状态然后作某种变换后再输出。请注意输入结构图如果将这一根引线作为输入口使用我们并不能保证在任何时刻都能得到正确的结果(为什么?)参考图输入示意图。接在外部的开关如果打开则应当是输入而如果闭合开关则输入但是如果单片机内部的开关是闭合的那么不管外部的开关是开还是闭单片机接受到的数据都是。可见要让这一端口作为输入使用要先做一个‘准备工作’就是先让内部的开关断开也就是让端口输出‘’才行。正因为要先做这么一个准备工作所以我们称之为“准双向IO口”。以上是P口的一位的结构P口其它各位的结构与之相同而其它三个口:P、P、P则除入作为输入输出口之外还有其它用途所以结构要稍复杂一些但其用于输入、输出的结构是相同的。看图()。对我们来说这些附加的功能不必由我们来控制所以我们就不去关心它了。单片机教程第七课:单片机内部结构分析(五)通过前面的学习我们已知单片机的内部有ROM、有RAM、有并行IO口那么除了这些东西之外单片机内部究竟还有些什么这些个零碎的东西怎么连在一起的让我们来对单片机内部作一个完整的分析吧!看图()(本图太大请大家找本书看吧一般讲单片机的书随便哪本都有)。从图中我们可以看出在单片机内部有一个CPU用来运算、控制有四个并行IO口分别是P、P、P、P有ROM用来存放程序有RAM用来存放中间结果此外还有定时计数器串行IO口中断系统以及一个内部的时钟电路。在一个单片机的内部包含了这么多的东西。对上面的图进行进一步的分析我们已知对并行IO口的读写只要将数据送入到相应IO口的锁存器就可以了那么对于定时计数器串行IO口等怎么用呢?在单片机中有一些独立的存储单元是用来控制这些器件的被称之为特殊功能寄存器(SFR)。事实上我们已接触过P这个特殊功能寄存器了还有哪些呢?看表符号地址功能介绍BFHB寄存器ACCEH累加器PSWDH程序状态字IPBH中断优先级控制寄存器PBHP口锁存器IEAH中断允许控制寄存器PAHP口锁存器SBUFH串行口锁存器SCONH串行口控制寄存器平凡的单片机教程自学单片机第页共页PHP口锁存器THDH定时器计数器(高位)THCH定时器计数器(低位)TLBH定时器计数器(高位)TLAH定时器计数器(低位)TMODA定时器计数器方式控制寄存器TCONH定时器计数器控制寄存器DPHH数据地址指针(高位)DPLH数据地址指针(低位)SPH堆栈指针PHP口锁存器PCONH电源控制寄存器表下面我们介绍一下几个常用的SFR看图。ACC:累加器通常用A表示。这是个什么东西可不能从名字上理解它是一个寄存器而不是一个做加法的东西为什么给它这么一个名字呢?或许是因为在运算器做运算时其中一个数一定是在ACC中的缘故吧。它的名字特殊身份也特殊稍后我们将学到指令可以发现所有的运算类指令都离不开它。、B:一个寄存器。在做乘、除法时放乘数或除数不做乘除法时随你怎么用。、PSW:程序状态字。这是一个很重要的东西里面放了CPU工作时的很多状态借此我们可以了解CPU的当前状态并作出相应的处理。它的各位功能请看表DDDDDDDDCYACFRSRSOVP表下面我们逐一介绍各位的用途()CY:进位标志。中的运算器是一种位的运算器我们知道位运算器只能表示到如果做加法的话两数相加可能会超过这样最高位就会丢失造成运算的错误怎么办?最高位就进到这里来。这样就没事了。例:HH()()AC:半进位标志。例:HAH()()F:用户标志位由我们(编程人员)决定什么时候用什么时候不用。()RS、RS:工作寄存器组选择位。这个我们已知了。()V:溢出标志位。什么是溢出我们稍后再谈吧。()P:奇偶校验位:它用来表示ALU运算结果中二进制数位“”的个数的奇偶性。若为奇数则P=否则Administrator下划线平凡的单片机教程自学单片机第页共页为。例:某运算结果是H()显然的个数为偶数所以P=。、DPTR(DPH、DPL):数据指针可以用它来访问外部数据存储器中的任一单元如果不用也可以作为通用寄存器来用由我们自已决定如何使用。、P、P、P、P:这个我们已经知道是四个并行输入输出口的寄存器。它里面的内容对应着管脚的输出。、SP:堆栈指针。堆栈介绍:日常生活中我们都注意到过这样的现象家里洗的碗一只一只摞起来最晚放上去的放在最上面而最早放上去的则放在最下面在取的时候正好相反先从最上面取这种现象我们用一句话来概括:“先进后出后进先出”。请大家想想还有什么地方有这种现象?其实比比皆是建筑工地上堆放的砖头、材料仓库里放的货物都是“先进后出后进先出”这实际是一种存取物品的规则我们称之为“堆栈”。在单片机中我们也可以在RAM中构造这样一个区域用来存放数据这个区域存放数据的规则就是“先进后出后进先出”我们称之为“堆栈”。为什么需要这样来存放数据呢?存储器本身不是可以按地址来存放数据吗?对知道了地址的确就可以知道里面的内容但如果我们需要存放的是一批数据每一个数据都需要知道地址那不是麻烦吗?如果我们让数据一个接一个地放置那么我们只要知道第一个数据所在地址单元就可以了(看图)如果第一个数据在H那么第二、三个就在H、H了。所以利用堆栈这种方法来放数据可以简化操作那么中堆栈什么地方呢?单片机中能存放数据的区域有限我们不能够专门分配一块地方做堆栈所以就在内存(RAM)中开辟一块地方用于堆栈但是用内存的哪一块呢?还是不好定因为是一种通用的单片机各人的实际需求各不相同有人需要多一些堆栈而有人则不需要那么多所以怎么分配都不合适怎样来解决这个问题分不好干脆就不分了把分的权利给用户(编程者)根据自已的需要去定吧所以单片机中堆栈的位置是可以变化的。而这种变化就体现在SP中值的变化看图SP中的值等于H不就相当于是一个指针指向H单元吗?当然在真正的机中开始指针所指的位置并非就是数据存放的位置而是数据存放的前一个位置比如一开始指针是指向H单元的那么第一个数据的位置是H单元而不是H单元为什么会这样我们在学堆栈命令时再说明。其它的SFR我们在用到时再介绍。单片机第八课(寻址方式与指令系统)通过前面的学习我们已经了解了单片机内部的结构并且也已经知道要控制单片机让它为我们干学要用指令我们已学了几条指令但很零散从现在开始我们将要系统地学习的指令部份。一、概述、指令的格式我们已知要让计算机做事就得给计算机以指令并且我们已知计算机很“笨”只能懂得数字如前面我们写进机器的HHH等等所以指令的第一种格式就是机器码格式也说是数字的形式。但这种形式实在是为难我们人了太难记了于是有另一种格式助记符格式如MOVP#FFH这样就好记了。这两种格式之间的关系呢我们不难理解本质上它们完全等价只是形式不一样而已。、汇编我们写指令使用汇编格式而计算机只懂机器码格式所以要将我们写的汇编格式的指令转换为机器码格式这Administrator下划线平凡的单片机教程自学单片机第页共页种转换有两种方法:手工汇编和机器汇编。手工汇编实际上就是查表因为这两种格式纯粹是格式不同所以是一一对应的查一张表格就行了。不过手工查表总是嫌麻烦所以就有了计算机软件用计算机软件来替代手工查表这就是机器汇编。二、寻址让我们先来复习一下我们学过的一些指令:MOVP#FFHMOVR#FFH这些指令都是将一些数据送到相应的位置中去为什么要送数据呢?第一个因为送入的数可以让灯全灭掉第二个是为了要实现延时从这里我们可以看出来在用单片机的编程语言编程时经常要用到数据的传递事实上数据传递是单片机编程时的一项重要工作一共有条指令(单片机共条指令)。下面我们就从数据传递类指令开始吧。分析一下MOVP#FFH这条指令我们不难得出结论第一个词MOV是命令动词也就是决定做什么事情的MOV是MOVE少写了一个E所以就是“传递”这就是指令规定做什么事情后面还有一些参数分析一下数据传递必须要有一个“源”也就是你要送什么数必须要有一个“目的”也就是你这个数要送到什么地方去显然在上面那条指令中要送的数(源)就是FFH而要送达的地方(目的地)就是P这个寄存器。在数据传递类指令中均将目的地写在指令的后面而将源写在最后。这条指令中送给P是这个数本身换言之做完这条指令后我们可以明确地知道P中的值是FFH但是并不是任何时候都可以直接给出数本身的。例如在我们前面给出的延时程序例是这样写的:MAIN:SETBP(1)LCALLDELAY(2)CLRP(3)LCALLDELAY(4)AJMPMAIN(5)以下子程序DELAY:MOVR#(6)D:MOVR#(7)D:DJNZRD(8)DJNZRD(9)RET(10)END(11)表MAIN:SETBP(1)MOVH#LCALLDELAYCLRP(3)MOVH,#LCALLDELAY(4)AJMPMAIN(5)以下子程序DELAY:MOVRH(6)D:MOVR#(7)D:DJNZRD(8)DJNZRD(9)RET(10)END(11)Administrator下划线Administrator下划线平凡的单片机教程自学单片机第页共页这样一来我每次调用延时程序延时的时间都是相同的(大致都是S)如果我提出这样的要求:灯亮后延时时间为S灯灭灯灭后延时秒灯亮如此循环这样的程序还能满足要求吗?不能怎么办?我们可以把延时程序改成这样(见表):调用则见表中的主程也就是先把一个数送入H在子程序中R中的值并不固定而是根据H单元中传过来的数确定。这样就可以满足要求。从这里我们可以得出结论在数据传递中要找到被传递的数很多时候这个数并不能直接给出需要变化这就引出了一个概念:如何寻找操作数我们把寻找操作数所在单元的地址称之为寻址。在这里我们直接使用数所在单元的地址找到了操作数所以称这种方法为直接寻址。除了这种方法之外还有一种如果我们把数放在工作寄存器中从工作寄存器中寻找数据则称之为寄存器寻址。例:MOVAR就是将R工作寄存器中的数据送到累加器A中去。提一个问题:我们知道工作寄存器就是内存单元的一部份如果我们选择工作寄存器组则R就是RAM的H单元那么这样一来MOVAH和MOVAR不就没什么区别了吗?为什么要加以区分呢?的确这两条指令执行的结果是完全相同的都是将H单元中的内容送到A中去但是执行的过程不同执行第一条指令需要个周期而第二条则只需要个周期第一条指令变成最终的目标码要两个字节(EHH)而第二条则只要一个字节(Eh)就可以了。这么斤斤计较!不就差了一个周期吗如果是M的晶振的话也就个微秒时间了一个字节又能有多少?不对如果这条指令只执行一次也许无所谓但一条指令如果执行上次就是毫秒如果要执行万次就是S的误差这就很可观了单片机做的是实时控制的事所以必须如此“斤斤计较”。字节数同样如此。再来提一个问题现在我们已知寻找操作数可以通过直接给的方式(立即寻址)和直接给出数所在单元地址的方式(直接寻址)这就够了吗?看这个问题要求从H单元开始取个数分别送入A累加器。就我们目前掌握的办法而言要从H单元取数就用MOVAH那么下一个数呢?是H单元的怎么取呢?还是只能用MOVAH那么个数不是得条指令才能写完吗?这里只有个数如果要送个或个数那岂不要写上条或条命令这未免太笨了吧。为什么会出现这样的状况?是因为我们只会把地址写在指令中所以就没办法了如果我们不是把地址直接写在指令中而是把地址放在另外一个寄存器单元中根据这个寄存器单元中的数值决定该到哪个单元中取数据比如当前这个寄存器中的值是H那么就到H单元中去取如果

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +2积分

资料评价:

/12
仅支持在线阅读

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部