单片机下载程序软件程序的时候,会有这样的数字,这是什么东西,代表什么意思。。。

[转载]单片机世界01
单片机的产生
&& 单片机,专业名称—Micro Controller
Unit(微控制器件),它是由大名鼎鼎的INTEL公司发明的,最早的系列是MCS-48,后来有了MCS-51,现在还有MCS-96系列,我们经常说的51系列单片机就是MCS-51,它是一种8位的单片机,而MCS-96系列则是一种16位的单片机,至于它们之间有何区别,我们以后会讲到。后来INTEL公司把它的核心技术转让给了世界上很多的小公司(不过,再小也有几个亿的销售/年哦),所以世界上就有许多公司生产51系列兼容单片机,比如飞利浦的87
LPC系列,伟邦的W78L系列,达拉斯的DS87系列,现代GSM97系列等等,目前在我国比较流行的就是美国ATMEL公司的89C51它是一种带Flash&
ROM的单片机(至于什么是Flash&
ROM,我在这儿先不作介绍,等以后大家学到相关的知识时自然就会明白),我们的讲座就是以该型号的单片机来作实验的。讲到这里,也许有的人会问:我平时在各种书上看到全是讲解等型号的单片机,它们又有什么不同呢?其实它们同属于一个系列,只是89C51的单片机更新型一点(事实上,89C51目前正在用89S51代替,我们的实验系统采用就是89S52的,兼容89C52)。这里随便说一下,目前国内的单片机教材都是以8051为蓝本的,尽管其内核也是51系列的,但毕竟8051的单片机已经属于淘汰产品,在市场上也很少见到了,所以由此感叹,国内的高等教育是如此的跟不上时代的发展需要!这话可能会引起很多人的不满,所以大家千万别传出去哦!
二.主要单片机的分类
&再给大家介绍一下我们经常在各种刊物上看到的AVR系列和PIC系列单片机是怎么回事?以便让大家对单片机的发展有一个较全面的认识。在没有学习单片机之前,这是一个令很多初学者非常困惑的问题,这么多的单片机我该先学哪一种呢?
&AVR系列单片机也是ATMEL公司生产的一种8位单片机,它采用的是一种叫RISC(精简指令集单片机)的结构,所以它的技术和51系列有所不同,开发设备也和51系列是不通用的,它的一条指令的运行速度可以达到纳秒级(即每秒次),是8位单片机中的高端产品。由于它的出色性能,目前应用范围越来越广,大有取代51系列的趋势,所以学完了51系列的,看来必须学会AVR的才行,可叹知识爆炸,人生苦短。说完了AVR的,再来说说另一种--PIC系列单片机,它是美国MICROCHIP公司,唉,又是老美,叫微芯公司的生产的另一种8位单片机,它采用的也是RISC的指令集,它的指令系统和开发工具与51系列更是不同,但由于它的低价格和出色性能,目前国内使用的人越来越多,国内也有很多的公司在推广它,不过它的影响力远没有51系列的大,所以作为初学者,51系列当然(不,绝对)是首选。
&以上几种只是比较多见的系列,其实世界上还有许多的公司生产各种各样的单片机,比如:MOTOROLA的MC68H系列(老牌的单片机),TI的MSP430C系列(极低功耗的单片机),还有日本的TOSHIBA,日立的HITACH,德国的西门子SIEMENS等等,它们都有各自的结构体系,并不与51系列兼容。为了不搞大家的脑筋,这里就不介绍了,等大家入门了以后自己再去研究它吧!现在我们还是回来了解一下51系列单片机到底是个什么东西,它有那些部分组成,请接着往下看:
三.单片机的结构及组成
&单片机到底是一种什么东东,它究竟能做什么呢?其实它就是一种能进行数学和逻辑运算,根据不同使用对象完成不同控制任务的面向控制而设计的集成电路,此话好象有点绕口,没关系,大家都应该知道我们经常使用的电脑吧,在电脑上,我们可以用不同的软件在相同的硬件上实现不同的工作。比如我们用WORD可以打字,用PROTEL可以设计图纸等等,单片机其实也是如此,同样的芯片可以根&&&&&&&
们不同的要求做出截然不同的产品,只不过电脑是面向应用的,而单片机是面向控制的,比如控制一个指示灯的亮和灭,控制一台电机的启动和停止等等。&那么它的内部究竟由哪些部件组成的呢?大家都知道我们的电脑有很多的零件,比如CPU(中央处理),RAM(内存),ROM(程序存储器),输入输出设备(并行串行口)等等,在单片机中这些部件都有,而且还把它们全部做到了一块芯片上(这就是单片机名称的由来)。
讲到这里,您一定会想,这么多零件集成在一块芯片上,那为什么单片机的价格会这么便宜(89S51每块才10元左右),其实原因很简单----功能有强弱,就象我们平时用的PLC,控制一台数控机床要用128点的,而控制一台电机有几点的就足够了,另外这种芯片的产量很大,技术也非常的成熟,自然价格也就很低了。那么单片机是如何来工作的,我们学习单片机又需要做哪些准备呢?对于一个初学者来说这是很
有必要了解的:
四.学习单片机的准备工作
首先您需要一台电脑,这是最基本的,配置嘛,P2以上的就可以了;然后您需要一套开发单片机的软件,这个软件叫KEIL
C51,它是美国Keil
Software公司专门为MCS-51系列单片机开发的第三方软件,最新版本是V7.09,安装时选择Uvision2,虽然有2K代码的限制,但足以满足我们学习的需要;其次,您还需要一台编程器,它一种把程序写进单片机芯片的设备,这种设备品种很多,操作也很简单,大家既可以买现成的产品(价格从200多元到2000多元的都有),也可以自己制作;有了这两样东西还不行,为了看到程序执行的结果,我们还需要一块实验板。
&好在现在出现了一种支持在线下载的单片机,只要满足一定的外部条件,就能够直接把汇编的程序下载到目标单片机中。经过反复的实验,我们开发设计了这样的一套实验系统,它采用了一套集源代码编辑、软件汇编、程序下载于一体的专业软件,采用具有在线下载功能的FLASH&
ROM单片机89S52,配合本教程,可以完成教程中的每一个实验。这样既免去了您添置编程器和仿真器等设备的昂贵费用,又可以直接在实验板上看到程序执行的结果,更由于采用的是FLASH&
ROM的存储器,烧写次数可以达到1000次以上。
单片机引脚功能介绍
1.VCC(40):电源+5V。
2.VSS(20):接地,也就是GND。
3.XTL1(19)和XTL2(18):振荡电路。
&单片机是一种时序电路,必须有脉冲信号才能工作,在它的内部有一个时钟产生电路,有两种振荡方式,一种是内部振荡方式,只要接上两个电容和一个晶振即可;另一种是外部振荡方式,采用外部振荡方式时,需在XTL2上加外部时钟信号(详细的内容将在以后的课程中专门介绍)。
4.PSEN(29):片外ROM选通信号,低电平有效。
5.ALE/PROG(30):地址锁存信号输出端/EPROM编程脉冲输入端。
6.RST/VPD(9):复位信号输入端/备用电源输入端。什么是复位信号,为什么要加复位信号?当然也暂时不去管它。
7.EA/VPP(31):内/外部ROM选择端。在30、9脚的功能上不知大家注意没有,都有一个/,什么意思呢?这是引脚的第二功能,也就是说,该引脚既可以作前面的功能,也可以作后面的功能,至于它是如何工作的,我们暂时也别去研究&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
8.P0口(39-32):双向I/O口。9.P1口(1-8):准双向通用I/0口。
10. P2口(21-28):准双向I/0口。11.P3口(10-17):多用途口。I/O就是英文IN/OUT
的缩写,这些引脚的功能想必大家也都明白了,(就是输入/输出的意思),这32个I/O口就是留给我们作连接外围电路用的,那么它们之间有些什么不同呢?这个问题稍微有点复杂。
二、单片机的电路连接和开发过程
单片机是如何工作的?我们的实验是让一个LED灯亮起来,亮哪一个?这就随便你了,比如我们就让LED1
亮起来吧,仔细看一下电路图,LED1接在什么地方呢?接在单片机的P1.0的引脚(也就是1脚)上,那么按照该电路图的连接方法,当1脚为高电平时,LED1是不亮的;只有当1脚为低电平时,LED1才会亮起来,怎样才能让1脚由高电平变为低电平呢?我们让人做事,就必须对她说一声,也就是发布命令,想让单片机工作,也得发布命令,不过在计算机中那叫指令,我们要让1脚变为低电平的指令是CLR&
P1.0(让1脚变为高电平的指令是SETB&
P1.0),这就是我们通常所说的源代码,(这是我们开发产品的第一步—源代码编辑);怎么做呢?我们首先得打开实验软件,屏幕出现一个浏览器的软件窗口,点击左边的扩展实验,选中实验16—自动温度控制器,再点击工具栏里的调试按钮,弹出一个记事本对话框,写入
CLR& P1.0;
分号必须在英文状态下输入
,输入完毕后选择文件→保存即可;那么单片机能读懂这条指令吗?当然不能,接下来我们还有一件事情要做,就是把这句指令翻译成单片机能读懂的东西,单片机能读懂什么呢?它其实只懂一样--就是数字,因此,我们就把CLR
&P1.0翻译成C2H,90H,至于为什么要翻译成这样,这当然是INTEL公司规定好的,我们就不需要去研究它了。这个过程我们叫作编译,(这是我们开发产品的第二步),那么指令是译过来的呢?这就得靠专业的软件了,我们做实验使用的软件就有此功能,只要点击工具栏上的编译按钮,稍等片刻即出现一个编译信息窗口,如果编译通过就会有编译完成,结果如下:0个警告,0个错误的编译信息,如果编译错误则会出现编译错误的信息,并提示错误的行号;编译完了之后通常要进行程序仿真(这是第三步,当然我们的实验程序很简单是不需要仿真的;接下来怎么才能把编译通过的指令写入单片机中呢?这通常需要借助于一种硬件工具,叫编程器(也叫烧录器),不过我们的实验板采用的是具有串行下载功能的单片机,所以您只要直接点击快捷工具栏上的下载按钮,程序就进入了实验(这是第四步—编程)。自此就完成了单片机开发的全过程。
&全部工作结束后,我们看到了什么?接P1.0(1脚)的LED1亮了起来;改变源代码,变成SETB&
行编译,下载,看看结果是不是LED1不亮了。
单片机内部结构(一)
单片机的内部究竟有哪些部分组成的,它们都有些什么作用呢?让我们先来了解其中的ROM存储器:
一.半导体存储器ROM
1.几个基本概念
上一课我们讲到了把编译后的指令下载到单片机后这条指令一定在单片机内的某个地方,那么它究竟在哪里呢?原来它就放在一个叫程序存储器的地方,英文名称ROM(全称为Read
Only Memory),叫只读存储器。它是一个什么东西呢?在讨论这个问题之前,让我们先来看几个物理现象:(1)数和物理现象的关系
不知大家是否还记得,在学习数字电路时我们曾用一盏灯的亮和灭来表示电平的高和低,即用“1”来表示高电平,用“0”来表示低电平,如果现在有两盏灯那它会有几种状态呢?
0 0 0 1 1 0 1 1
两盏灯的组合就是四种状态:00,01,10,11。如此看来灯的亮和灭这种物理现象同数字确实有着某种联系,如果我们把它们按一定的规律排列好,那么电平的高或低就可以用数字来表了,换句话说:不同的数字可以代表不同数量灯的电平高或低。比如:
,,,,,,,这十六种组合就可以代表四盏灯的状态,能理解吗?
(2)位及字节的含义
在单片机中,一盏灯(实际上是一根线)我们称它为一位,它有两种状态(“0”或“1”),分别应电平的高或低,它是单片机最基本的数量单位,用BIT来表示。8盏灯(八根线)有256种状态,这8盏灯(也就是8位)我们把它称为一个字节,用BYTE表示。至于为什么要怎么规定,这就不需要你我操心了,我们只要记住就可以了。那么单片机是如何来储存这些数字所代表的字节的状态的呢?接着往下看:
2.半导体存储器的工作原理
存储器就是用来存放数据的地方,它其实是利用电平的高或低来存放数据的,也就是说,它实际上存放的是电平的高或低的状态,而不是我们所习惯上认为的“1234”这样的数字。那它是如何工作的呢?一个存储器就象一个小抽屉,一个小抽屉里有8个小盒子每个小盒子用来存放1位“电荷”,电荷通过与它相连的电线传进来或释放掉,至于电荷在小盒子里是怎样存放的,这就不用我们操心了,您可以把电线想象成水管,小盒子里的电荷就象是水,那就好理解了存储器中的1个小抽屉我们把它称之为1个“单元”,相当于1个字节,而1个小盒子就相当于1位。有了这么一个构造,我们就可以开始存放数据了,比如我们要放进一个数据“”,我们只要把第2号、第4号和第5号小盒子里存满电荷,而其它小盒子里的电荷给放掉就行了。可是问题又出来了,一个存储器有好多相同的单元,线是并联着的(看D7-D0),在放入电荷的时候,会将电荷放入所有的字节单元中,而释放电荷的时候,会把每个单元中的电荷都放掉,这样的话,不管存储器有多少个字节单元,都只能放同一个数,这当然不是我们所希望的。因此,我们要在结构上稍作变化,看上面的图,在每个单元上有根线与译码器相连,我想要把数据放进哪个单元,就通过译码器给哪个单元发一个信号,由译码器的通过这根线把相应的开关打开,这样电荷就可以自由地进出了。那么这样是不是就能随意地向存储器写入或者读出数据了呢?其实还不能,当我们向存储器写入数据时,必须先把这个开关切换到写入端;而要读出数据时,就得先把开关切换到读出端;而片选端则是为了区分不同的存储器设置的。
3.半导体存储器的译码
简单介绍一下:我们知道,1根线可以代表2种状态;2根线可以代表4种状态;3根线可以代表8种;256种状态又需要几根线代表?8根线,所以一片6264存储器我们只需要16根线就可以了。
4.存储器的选片及总线的概念
至此,译码的问题解决了,让我们再来关注另外一个问题:送入每个字节的8根线又是从什么地方来的呢?它就是从单片机的外部引脚上接过来的,一般这8根线除了接一个存储器之外,还要接其它的器件,这样问题又出来了,这8根线既然不是存储器和单片机之间专用的,如果总是将某个单元接在这8根线上,就不行了,比如这个存储器单元中的数值是“FFH”,另一个存储器的单元是“00H”,那么这根线到底是处于高电平,还是低电平?岂不是要打架看谁历害了?所以我们必须让它们分离。办法当
然也简单,当外面的线接到集成电路的引脚上来后,不直接接到各单元去,中间再加一组开关就行了。这组开关就是前面提到的控制器(看前面的图),平时我们让开关打开着,如果确实是要向这个存储器中写入数据,或要从存储器中读出数据,再让开关切换到相应的位置就行了。这组开关由三根引线选择读控制端、写控制端和片选端,要将数据写入,先由控制器选中该片,然后发出相应的写信号,开关切换到相应的位置,并将传过来的数据(电荷)写入片中;如果要读信号,先选中该片,然后发出读信号,开关也切换到相应的位置上,数据就被送出去了;另外读和写信号还同时受到译码器的控制,由于选端的不同,所以虽有读或写信号,但没有片选信号,所以另一个存储器就不会“误会”而开门,造成冲突,那么会不会同时选中两个存储器呢?只要是设计好的系统就不会,因为它是由计算机来控制的,如
果真的出现同时选中两个存储器的话,那就是电路出故障了。
如此看来,存储器要想写入或者读出数据还真是不简单,不过好在这些都是由计算机自动完成的,不需要我们去操心。从上面的介绍中我们已经看到,用来传递数据的8根线(51单片机是8根)并不是专用的,而是很多器件大家共用的,所以我们把它们称之为数据总线(总线英文名为BUS),即公交道,谁都可以走;而16根地址线(51单片机共有16根地址线,这些以后会讲解,这里不必死记硬背)也是连在一起的,我们把它们称之为地址总线,
5.半导体存储器的分类
第一课中我们提到过,89C51是一种带Flash ROM的单片机,什么是Flash
ROM?它到底是一种什么东西呢?ROM我们已经知道,是只读存储器,所谓只读,从字面上理解那就是只可以从里面读出数据,而不能写进去,它类似于我们的书本,发到我们手里之后,我们只能读里面的内容,不可以随意更改书本上的内容。ROM就是单片机中用来存放程序的地方,前面我们下载到单片机的指令就放在这个地方。讲到这里大家也许会感到困惑,既然ROM是只读存储器,那么指令又是如何进入其中的呢?其实所谓的只读只是针对正常工作情况下而言,也就是在使用这块存储器的时候,而不是指制造这块芯片的时候,只要让存储器满足一定的条件就能把数据预先写进去,这个道理也很好理解,书本拿到我们手里是不能改了,但当它还是原材料--白纸的时候,我们完全可以由印刷厂把内容印上去嘛。前面的编程就是这么回事!Flash
ROM是一种快速存储式只读存储器,这种程序存储器的特点就是既可以电擦写,而且掉电后程序还能保存,编程寿命可以达到几千至几万次,所以我们的实验系统是可以反复烧写的,您尽管使用。目前新型的单片机都采用这种程序存储器;当然,除了这种程序存储器外,还有两种早期的程序存储器产品,简单介绍一下:PROM
EPROM和EEPROM,PROM称之为可编程只读存储器,就象我们的练习本,买来的时候是空白的,可以写东西上去,可一旦写上去,就擦不掉了,所以它只能写一次,要是写错了,就报废了,习惯上我们把带这种程序存储器的单片机称为OTP型单片机,如果您的产品批量生产,又要求价格比较低的话,带这种程序存储器的单片机是非常合适的;EPROM,称之为紫外线擦除的可编程只读存储器,它里面的内容写上去之后,如果觉得不满意,可以用一种特殊的方法去掉后重写,就是用紫外线照射,紫外线就象“消字灵”,可以把字去掉,然后再重写,当然消的次数多了,也就不灵光了,所以这种芯片可以擦除的次数也是有限的——几百次吧,电脑上的BIOS芯片采用的就是这种结构的存储器;EEPROM,前一种存储器的擦写要用紫外线,而这种存储器可以直接用电擦写,比较方便数据的改写,它有点类似于FLASH存储器,但比FLASH存储器速度要慢,现在新型的外部扩展存储器都是都是这种结构。
了解了ROM,让我们再来简单讲讲另一种存储器,叫随机存取存储器,也叫内存,英文缩写为RAM(Random Access
Memory),它是一种既可以随时改写,也可以随时读出里面数据的存储器,类似于我
们上课用的黑板,可以随时写东西上去,也可以用黑板擦随时擦掉重写,它也是单片机中重要的组成部分,单片机中有很多的功能寄存器都与它有关。
二.本课总结
本课主要讲述了单片机的两种半导体存储器—只读存储器ROM和随机存储器RAM的工作原理,它们是单片机的重要组成部分,了解它的内部结构对我们学习单片机是很有帮助的。不过如果您一时对本课的内容还无法搞得很明白,也没有关系,随着学习的深入,我们还会慢慢地讲解相应的基础知识,可千万不要放弃哟?我在没有学会单片机之前也是如此囫囵吞枣的。
单片机内部结构(二)
一.LED灯闪烁的实验程序
我们要让LED1不断的闪烁,就象大海中用的航标灯。怎样才能让LED1不断的闪烁呢?实际上就是让它亮几秒,再灭几秒,也就是让P1.0交替地输出高电平或低电平,按照前面所学的知识,我们写出下面的程序:CLR
SETB P1.0;编译后下载到单片机?
这里有两个问题:首先计算机执行指令的速度很快,执行完第1条指令后LED1是灭了,但在极短的时间内又去执行第2条指令,LED1又亮了,我们根本无法看到灯曾经灭过;第二个问题是当执行完第2条指令后,不会再去执行第1条指令了,因为单片机执行指令的过程是一条一条地顺序执行的。
如何解决这两个问题呢?我们可以作如下的设想:第一,执行完第1条指令后让单片机延时一段时间(几秒或零点几秒),然后再去执行第2条指令,这样就可以看到LED1曾经灭过了;第二,让单片机执行完全部指令后再返回去执行第1条指令,如此不断的循环就可以达到我们的要求了。
实验程序如下:
MAIN:SETB P1.0 ;
LCALL DELAY ;
CLR P1.0 ;
LCALL DELAY ;
LJMP MAIN ;
DELAY:MOV R7,#250 ;
D1:MOV R6,#250 ;
D2:DJNZ R6,D2 ;
DJNZ R7,D1 ;
还记得软件的使用方法吗?调试,写入源代码,编译,下载到单片机,看看是不是我们想要的结果??
在分析这段程序之前,先来说明几个标点符号的意义:
1.分号在这里起一个分隔符的作用,表示这条指令到此为止;
2.括号内的数字在这里是为了解释程序用的,实际的编译过程中是没有意义的,也就是说没有也是一样的,只是为了程序的可读性更强,我们一般会在分号的后面加上程序的注释文字(后面我们会用到);
3.特别?:程序中的标点符号只能在英文状态下输入,当使用中文输入时,必须切换到半角状态,不然编译软件会出错。接下来我们分析一下这段程序:按照我们的要求,第1条,让灯灭,第2条应该是延时,第3条是让灯亮,第4条和第2条一样也应该是延时,第5条应当返回去执行第1条指令。看一下上面的程序,第1条我们已经懂了,是让LED1灭,第2条和第4条我们等一下讨论,第5条是LJMP
MAIN,LJMP是一条指令,意思是转移,转移到什么地方去呢?看一下LJMP后面跟着什,是MAIN,什么地方有MAIN,在第1条指令的开头就是MAIN,所以第5条指令的意思就是跳转到MAIN(即第1条指令处继续执行),如此一来,就不断地重复执行这些指令。那么MAIN又是什么意思呢?它实际上是我们为这段程序起的
一个名称,专业术语叫标号,既然是一个名称那可不可以用mcu,CHINA等等的其他名字呢?当然可以,这完全取决于您的需要(?:不过也有一些是不能采用的,我们以后再讲)。再来分析第2条和第4条指令,看看它们是如何实现延时的?
DELAY,LCALL也是一条指令,这条指令叫做调用子程序指令,看看LCALL后面跟着的是什么--DELAY,哪里有DELAY,在第6条指令的开头,很显然这也是一个标号,这条指令的作用就是当执行到这条指令时就转去执行LCALL后面标号所在处的程序,如果在执行程序时遇到RET指令(RET叫返回指令),就返回到LCALL指令的下面一条(即第3条指令)处继续执行,在第9条指令后确实有RET指令,那么在执完第2条指令后就应该去执行第6.7.8.9条指令,之后遇到第10条指令:RET,执行完这条指令后就回去执行第3条指令,将P1.0清零,也就是让LED1亮,然后再去执行第4条指令,执行完后又回到6.7.8.9.10
条指令,最后执行第5条指令:LJMP MAIN,也就是我们刚才说的跳转到第1条,将P1.0置位,就是LED1
灭掉。如此周而复始,LED1就不断的闪烁。好好理解这段文字,务必把它搞清楚!!!
从标号DELAY处(即第6条)开始到RET的这一段指令我们称之为子程序,它是一段延时程序,至于延时多长时间,我们会在以后的课程中学习。程序的最后一条是END,它不是指令,它只是告诉编译软件整个程序到此结束了,它叫“伪指令”。在大家以后的编程中,写完程序都要加上这一条。
在上面的程序中我们知道了从标号DELAY开始的子程序是一段延时程序,那么它又是如何工作的呢?在了解它的工作过程之前我们必须先知道其中的一些符号,就从R7开始吧,它是单片机内部的一个重要组成部分,叫工作寄存器,什么是工作寄存器?下面我们就来讲解这个问题:
二.工作寄存器
上一课我们已经讲过,在单片机中有许多的功能寄存器和半导体存储器RAM有关,那么工作寄存器又属于哪一部分呢?它是用来干什么的呢?要搞清楚这个问题,让我们先从日常生活中的一个例子说起,如我们要做一道数学题123+456,您会马上得出答案:579,接下来再看一道题:
123+456+789,要你马上得出答案就不那么容易了,通常我们会怎么做呢?一般总是先把123+456的结果
579写在一张纸上,然后再算579+789=1368,这1368就是我们想要的最终结果,而579只是为了得到最终结果而暂时记下来的中间结果,单片机中做运算和我们生活中做运算一样,也需要把中间结果放在某个地方,那么计算机把它放在哪儿呢?前面我们提到的ROM(只读存储器)中,不行!因为ROM是用来存放程序的,它只能写进去,能读出来(再次提醒一下,这只是相对而已),所以只能放在单片机的另一个区域—RAM中(即随机存取存储器)中。R7就是RAM区域中划出的一部分。知道了R7,接下来让我们来分析一下这段子程序(延时程序)。
三.LED灯闪烁程序子程序的分析
首先看第6条,MOV
R7,#250,这也是一条指令,意思是传递数据。我们知道在日常生活中,要传递一件东西就必须要有一个传递者,一个接受者和被传递的东西,那么在单片机中是怎么区分它们的呢?在这条指令中,R7是接受者,250就是要传递的东西(单片机中要传递的东西当然是数字了),这
里传递者被省略了(顺便提一下,并不是每条指令都能省略的,事实上大部分的指令都要有传递者)
,这样一来,这条指令的意思也很清楚了:就是把250这个数传递给R7这个工作寄存器(也就是把250个数送入R7中),这样执行完这条指令后R7中的值就应该是250,我们可以用DUBG8051这个软件来验证一下,看是不是符合。讲到这里,不知大家注意没有,在250这个数的前面有个#,它是什么意思呢?这个#就说明250是一个被传递的数的本身,而不是传递者。看懂了MOV
R7,#250,那么MOV R6,#250也应该很清楚了。
接着看第8条DJNZ
R6,D2,这又是另一条指令,我们来看一下DJNZ后面跟着什么,一个是R6,一个是D2,R6我们已经知道了,再找一下D2,D2在本行的开头,我们已经学过,它是标号。那么这条指令是怎么执行的呢?它的执行过程是这样的:它将后面的值(即工作寄存器R6中的值)减1,然后查一下这个值是否等于“0”,如果等于“0”就往下执行,如果不等于“0”就转移,转移到什么地方去呢?大家应该明白了,实际上这条指令的执行结果就是在原地转250次;当R6中的值等于“0”之后,程序就去执行第9条指令,也就是DJNZ
R7,D1,大家自行分析一下这条指令的结果(是不是转去执行MOV
R6,#250,同时R7中的值减1),这段子程序的最终执行结果就是DJNZ R6,#250这条指令被 16
执行了250*250=62500次,执行这么多次干吗?就是为了延时。
单片机内部结构(三)
&1.时序的由来
已经知道单片机执行指令的过程就是顺序地从ROM(程序存储器)中取出指令一条一条的顺序执行,然后进行一系列的微操作控制,来完成各种指定的动作。它在协调内部的各种动作时必须要有一定的顺序,换句话说,就是这一系列微操作控制信号在时间上要有一个严格的先后次序,这种次序就是单片机的时序。就好比学校上课时用的电铃,为了保证课堂秩序,学校就必须在铃声的统一协调下安排各个课程和活动。那么单片机的时序是如何规定的呢?接着往下看:
&&2.时序的周期&
计算机每访问一次存储器的时间,我们把它称为一个机器周期,它是一个时间基准,就象我们日常生活中使用的秒一样,计算机中一个机器周期包括12
个振荡周期,什么是振荡周期?一个振荡周期是多少时间?振荡周期就是振荡源的周期,也就是我们使用的晶振的时间周期,一个12M
的晶振,它的时间周期是多少,如果电子技术学得好的朋友应该不难算出(T=1/f),也就是1/12 (微秒),那么使用12M
晶振的单片机,它的一个机器周期就应该等于12*1/12(微秒),也就是1μS。
系列单片机中,有些指令只要一个机器周期,而有些指令则需要两个或三个机器周期,另外还有两条指令需要4
个机器周期,这也不难理解,你在家擦地板的话总比擦桌子的时间要长,不过我可是大男子主义,从来不做家务的。开句玩笑!!!如何衡量指令执行时间的长短?我们就要用到一个新的概念:指令周期—即执行一条指令所需的机器周期,INTEL
公司规定了每一条指令执行的机器周期,当然这不需要我们非把它记住,不过在这里DJNZ
指令我们是要记住的,它是双周期指令,执行一次需要两个机器周期,即2μS。(12M
晶振的话),回到我们上一课的实验,延时的时间就应该算出来了吧,是62500*2μS=125000μS,也就是125mS
。这么大的数字也就0.125S,怪不得LED1
闪烁的这么快。二.单片机的时钟电路,单片机是在一定的时序控制下工作的,那么时序和时钟又有什么关系呢?时钟是时序的基础,单片机本身就如同一个复杂的同步时序电路,为了保证同步工作方式的实现,电路就要在唯一的时钟信号控制下按时序进行工作。那么单片机内的时钟是如何产生的呢?
1. 内部时钟电路
单片机的内部有一个高增益的反相放大器,其输入端为引脚XTL1(19),输出端为XTL2
我们只要在外部接上两个电容和一个晶振,就能构成一个稳定的自激振荡器,它的内部电路的工作原理就不介绍了,这里主要讲一下电容和晶振的选择,看上面的图,晶振的大小与单片机的振荡频率有关,我们到串行接口时再详细讲解,电容的大小影响着振荡器振荡的稳定性和起振的快速性,通常选择10-30P
的瓷片电容或校正电容;另外在设计电路时,晶振和电容应尽可能的靠近芯片,以减少PCB
板的分布电容保证振荡器振荡工作的稳定性,提高系统的抗干扰能力
2. 外部时钟电路
除了内部时钟方式外,单片机还可以采用外部引入时钟的振荡方式,什么时候需要采用外部时钟方式呢?当我们的系统由多片单片机组成时,为了保证各单片机之间时钟信号的同步,就应当引入唯一的公用的外部脉冲信号作为各单片机的振荡脉冲,此时应将XTAL2
悬空不用,外部脉冲信号由XTAL1 引入,如上右图所示,外部信号的高低电平持续时间应大于20mS,
单片机内部结构(四)
&一.单片机I/O 口的输出实验
&1.实验程序
程序如下:
LOOP:MOV P1,#0FFH ; LCALL DELAY ; MOV P1,#00H ;
LCALL DELAY ; LJMP LOOP ;
调试,写入源代码,编译,下载,看到了什么?8 只LED 灯都在闪烁(注意:前面的实验是让一个LED
灯闪烁),分析一下程序:
2.程序分析
这段程序和前面的程序比较,有两处不同,第1 条,原来是SETB
P1.0,现在改为MOV& P1,#0FFH,第3
条,原来是CLR& P1 ,现在改为MOV& P1,#00H
。为什么这样改了之后就变成了8 只LED 灯同时闪烁了?原来P1 代表了P1.7-P1.0
的全部,我们把它当作一个存储器单元(即一个字节),不过对一个存储器单元送数就应该用MOV 指令了;在这里P1(P1.7-P1.0
)接的是LED 灯(也就是负载),它起到了一个输出端的作用。那如果把P1 改为P2 或P3 或P4
行不行呢?答案是肯定的,为什么?我们稍后再谈,接着看第2 个实验。二.单片机I/O 口的输入实验
&1.实验程序
程序如下:
&MAIN:MOV P3,#0FFH ;
把程序下载到单片机,按下第1 个按钮,第1 个LED 灯亮了,按下第2 个按钮,第2 个LED
灯亮了,松开按钮,相应的灯就灭了,是不是有点象工业控制中的点动控制原理。分析一下这个程序:
&2.程序分析
看附图的硬件接线图,有4 个按钮分别接到了P3.2,P3.3,P3.4,P3.5
,引脚上。再来分析一下程序,第1 条,使P3 口(包括P3.7-P3.0 )全部为高电平(为什么MOV P3,#0FFH 能使P3
口全部为高电平,我们在下一课中讨论);第2 条MOV& A,P3;MOV
我们已经知道,是送数的意思,这条指令的意思就是把P3 口的数送到A 中去,A 是什么呢?我们也可以把它看成一个中间单元,就象R7
寄存器一样,第3 条指令就是把A 中的数送到P1 口去;第4 条是循环,这些我们都已经见过,当我们按下P3.2
所连接的按钮时,#0FFH 这个数就被送到了A 中,通过程序又送到了P1,使P1.2 输出低电平,LED3
就亮了,按下P3.3-P3.5 连接的按钮,对应的LED4-LED6 也亮了,松开按钮,相应的LED
灯就灭了。如果把按钮接到P2.0-P2.7 或P4.0-P4.7 可不可以呢?当然可以。所以在这里P3
口又起到了一个输入端的作用。
由上面两个实验我们得出结论,凡是以P 开头的管脚都可以用作输入输出口,在89C51 中这32
个管脚我们就称之为并行口。它们实际上就是特殊功能存储器SFR
(什么是特殊功能寄存器,我们后面再讲)中的四个,记作P0,P1,P2,P3,它们都是双向通道,即既可以作为输出口,也可以作为输入口,作输出时数据可以锁存,作输入时数据可以缓冲,那么它们是怎么实现输入输出功能的呢?继续往下看。
三.单片机并行口的结构分析先来看看输入结构:
1.输入结构
口作为输入口时有两种工作方式,即所谓的读端口与读引脚。读端口时实际上并不从外部读入数据,而是把端口锁存器的内容读入到内部总线,经过某种运算或变换后再写回到端口锁存器。比如取反,置位,清零等等指令;而读端口时才真正地把外部的数据读入到内部总线,图中的两个三角形表示的就是输入缓冲器,CPU
将根据不同的指令,分别发出“读端口”或“读引脚”信号,以完成不同的操作,这是硬件自动完成的,不需要我们操心。
读引脚时,也就是把端口作为外部输入线时,首先要通过外部指令把端口锁存器置“1”,然后再实行读引脚操作,否则就可能读入出错。为什么?看上面的图,如果不对端口置“1”,端口锁存器原来的状态有可能为“0”(Q
端为0,Q^为1)加到场效应管栅极的信号为“1”,该场效应管就导通,对地呈现低阻抗,此时即使引脚上输入的信号为“1”,也会因端口的低阻抗而使信号变低,使得外加的“1”信号读入后不一定是“1”,若先执行置“1”操作,则可以使场效应管截止,引脚信号直接加到三态缓冲器中,实现正确的读入。由于在输入操作时还必须附加一个准备动作,所以这类I/O
口被称为“准双向”口,MCS-51 的P0,P1,P2,P3
口作为输入/输出口时都是“准双向”口。接下来让我们再看另一个问题,从图中可以看出,这四个端口还有一个差别,除了P1
口外,P0,P2,P3 口都还有第二功能,这些第二功能又是作什么用的呢?
&2.端口的工作原理(1)。P0 口
先来看P0 口,从图中可以看到,P0 口的内部有一个2 选1
的选择器,受内部信号的控制,如果在图中的位置则处在I/O
口工作方式,此时相当于一个“准双向口”,输入时须先将口置“1”,每根口线可以独立定义为输入或输出,但是须在口线上加上拉电阻。如果将开关往另一个方向,则就是另一个功能—作为地址/数据复用总线用,此时不能逐位定义为输入/输出,它有两种用法:当作数据总线用时,输入8
位数据;而当作地址总线用时,则输出8 位地址。再强调一点,当P0 口作为地址/数据总线用之后,就再也不能作I/O
口使用了。讲到这里,也许大家会感到困惑,什么叫作地址/数据复用?这其实是当单片机的并行口不够用时,需要扩展输入输出口时的一种用法,知道了P0
口,再来看P1 口。
&(2)。P1 口
同P0 不同,P1 口只能作为I/O
口使用,但它的内部有一个上拉电阻,所以连接外围负载时不需要外接上拉电阻,这一点P1,P2,P3
都一样,务必请大家注意。&
(3)。P2 口
P2 口作为I/O 口线用时,与P0
口一样,当内部开关向另一个方向时,即作地址输出时,可以输出程序存储器或外部数据存储器的高8 位地址,并与P0
口输出的低地址一起构成16 位的地址线,从而可以分别寻址64K 的程序存储器或外部数据存储器,同样地址线是8
位一起自动输出的,不能象I/O 口线那样逐位定义。
&(4)。P3 口
P3 口作为I/O 口线用时,同P1 口相同,也是“准双向口”;不同的是,P3
口的每一位都有另一种功能,也叫第二功能,各位的功能如下,它们的具体作用我们用到时再详细解释。
既然单片机的引脚有第二功能,那么CPU
是如何来区分的呢?这是一个令许多初学者困惑的问题,其实单片机的第二功能是不需要人工干预的,也就是说只要CPU
执行到相应的指令,就自动转成了第二功能。了解了各个I/O 口的功能和作用,再来给大家讲解一下单片机I/O
与外围电路的连接方法。
四.单片机I/O 口的连接方法
当单片机的I/O
口作输出时可以直接与外部设备连接,不过由于在实际的应用中,由于其驱动电流是有限的(P0 口10mA,P1,P2,P3
口20mA),所以我们常常需要通过接口电路来扩展它的驱动能力,在单片机的后向通道控制系统中,常用的功率控制器件有机械继电器、晶闸管、固态继电器等等,下面我们将以机械继电器和固态继电器的应用为例介绍其具体的使用方法。
1. 单片机与机械继电器的接口
单片机的一个I/O 口只能灌入20mA
的电流,所以往往不足以驱动一些功率开关(比如稍大一点的机械继电器等),此时,就应该采用必要的扩展电路,如何来实现单片机与机械继电器的接口呢?其实很简单,我们通常采用下面的接法(如图),为了防止前向通道信号的干扰,常采用一些光电隔离器件,比如光电耦合器4N25,PC814
等,当单片机的P1.0 脚输出为低电平时,光藕受电导通,Q1 饱和开通,继电器吸合,负载电路接通。这里请注意☺:P0-P3
口作输出控制端时,应尽量采用低电平控制方法,这是因为在低电平时,I/O
口允许灌入的电流比高电平时要大,一般情况下,低电平的灌入电流为高电平的4 倍。
另外为了防止电压间的互相干扰,继电器的工作电压VDD 与单片机的工作电压VCC
不要使用同一个电源,接地端也不要连在一起,即所谓的模拟地与数字地分开,驱动管的电流要大于继电器的工作电流,其他的元件就不讲了,大家自行分析一下。讲了单片机与继电器的接口,再来介绍与固态继电器的接口方法,接着往下看:
2. 单片机与固态继电器的接口
普通继电器由于开关速度慢、易跳火、易机械磨损,通常用于要求不高的场合,在某些特殊应用场合,比如防火、防爆等系统中,则应采用固态继电器。固态继电器是一种无触点的电子继电器,它的输入端只要很小的控制电流,可以与单片机的I/O
口直接连接;输出则采用双向晶闸管控制,其输入输出间均通过内部光电耦合器隔离,可以防止信号间的干扰,是单片机接口的理想器件,随着其技术的成熟,应用的广泛,价格也已经非常的便宜,1A/250V
的目前在10 元左右,它与单片机的连接方法如图所示,当“-”端所接的P1.0 为低电平时,SSR
导通,负载工作。除了以上两种连接方法外,单片机与TTL,CMOS 管等都可以连接。.
单片机内部结构(五)
讲到了指令MOV P3,#0FFH 能使P3 口全部为高电平,而在第四课中LED 灯闪烁程序中给R7 送数用的指令是MOV
R7,#250 ,那么这#250 和#0FFH 到底有什么不同?它们又代表什么意思呢?
复习一下数字电路中学过的数制概念:
1.十进制数(Decimal Number)
在日常生活中,我们表示数的多少用的是十进制数,即0,1,2,3,4,5,6,7,8,9。它遵循“逢十进一,借一当十”的原则,通常我们把计数符号的个数叫做基数,十进制的基数就是十。
比如一个十进制数0+8*100+4*10+7*1
,它的每一个数码都有一个系数,10,1;这个系数叫做权或位权。十进制数虽然非常符合我们的使用习惯,但计算机中却无法采用,因为计算机只能有两种状态:“0”和“1”,所以我们还得应用二进制数。
2.二进制数(Binary Number)
二进制的基数为二,0
和1,它遵循的是“逢二进一,借一当二”的进借位原则。也就是当某位计数到两个数时就向高位进“1”,同时本位变为“0”。
比如二进制数+1*22+0*21+0*20,二进制数只有0 和1
两个数,正好代表了计算机中电路的两种状态,所以它在计算机中被广泛应用。下面是二进制的加法和乘法运算规则:
加法:0+0=0;1+0=0+1=1;1+1=10
乘法:0*0=0;1*0=0*1=0;1*1=1
二进制数虽然在计算机中处理很方便,但当位数较多时,就不容易记忆和书写了,所以计算机中又有了十六进制数。
3.十六进制数(Hexadecimal Number)
十六进制也遵循两个规则,一是有十六个基数,即0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F;另一个规则是“逢十六进一,借一当十六”。
比如我们前面提到的#0FFH
就是一个十六进制数,#--我们已经明白了,它表示的是传递数的本身,“H”叫数制简码,它表示这个数是十六进制数,为什么前面我在标题后面都加了英文注释,相信大家也应该明白了吧(这里随便提一下,二进制简码B
和十进制简码D 通常是可以省略的,我们以后的课程中用到的数都是这样写的),那么0FFH
这个十六进制数的表示方法是怎么样的呢?用十进制表示0FFH=F*161+F*160,即等于255
。(大家也许会疑问?这里的“0”到哪里去了呢?原来,在单片机中,当我们用十六进制格式表示一个数时,如果高位的数字为“A-F
”时,高位前面就得加上个“0”,不然,编译软件会出错,就象#0FFH。二.进制之间的转换
十进制有使用比较习惯的特点,二进制有易于表示和运算方便的特点,十六进制又有表示位数较多的特点,但有时我们常常要把十进制数转换成二进制数或十六进制数来处理;把二进制数逆转换成十六进制数,如何进行这种转换呢?下面就举几个例子:
1. 十进制数与非十进制数之间的转换
(1)非十进制数转换为十进制数
具体做法是:将一个非十进制数按权展开成一个多项式,每项是该位数码与相应权值之积,把多项式按十进制的规则进行计算求和,所得的结果就是该数的十进制形式。
比如:二进制数1011B 转换成十进制为1*23+0*22+1*21+1*20=8+2+1=11D ,再比如:十六进制数FFH
转换成十进制为255D。
(2)十进制数转换为非十进制数
十进制数转换为非十进制数时,可将其分为整数部分和小数部分分别进行转换,最后将结果合并为目的数。为了简单,我这里只讲整数部分的转换。这种转换叫做除基取余法,具体做法是用欲转换数制的基数去除十进制数的整数部分,第一次除所得余数为目的数的最低位,把得到的商再除以该基数,所得余数为目的数的次低位,依次类推,继续上面的过程,直至商位为0,此时所得余数为目的数的最高位。
比如:将十进制数53D 转换成二进制数为53D=110101B。
2└26⋯⋯1
2└13⋯⋯0
2└6⋯⋯1
2└3⋯⋯0
2└1⋯⋯1
0 ⋯⋯1
2. 二进制数与十六进制数之间的转换
四位二进制共有16 种组合,而这16 种组合正好与十六进制数的16 个基数一致,所以每4
位二进制数对应一位十六进制数,我们只要把二进制数的整数部分自右向左每4 位一组,最后不足4 位的用0 补足;小数部分自左向右每4
位一组,最后不足4 位的在右面补0,再将每4
位二进制数对应的十六进制数写出即可。相反,如果将十六进制数转换为二进制数只需将每位十六进制数写成对应的4 位二进制数即可。
比如:将1101011B 转换成十六进制数为D6H,再比如:将F0FH 转换成二进制数为B 。
上面的表格就是二进制数、十进制数和十六进制数之间的对应关系。
三.立即数的写法
通过前面一小节的讲解,我们已经懂了,MOV R7,#250 和MOV R7,#OFFH 中#250 和#0FFH
原来是十进制数250D 和十六进制数FFH 的区别,在单片机中,通常我们把这个数称之为立即数,那么如果我在编写指令时把立即数#0FFH
写成二进制数(即 )或用十进制写法(255
)是不是可以呢?当然可以,立即数既可以是二进制数,也可以是十进制数或十六进制数。不过有一点再重复一遍:那就是当用十六进制格式表示一个立即数时,如果高位的数字为“A-F”时,高位前面要加上个“0”,请大家务必记住了。
这里再讲一下,关于数制以及二进制、十进制和十六进制数的关系,大家可以在以后的实践中慢慢去理解和掌握,如果您一时记不住,千万不要刻意地去死记硬背!下面让我们来讨论另一个问题:
四.存储器的地址
什么是存储器的地址,地址和数据又有什么关系呢?这个问题往往让初学者非常的难以理解,既然单片机存储器内存放的是数据,为什么还要有地址的概念?让我们从生活中的一个例子谈起:大家都知道寄信是怎么回事吧!我们要寄一封信就必须写好信的内容,然后在信的封面写上详细地址,邮局才能按地址把它寄出去;我们给单片机送数也一样,除了要给出立即数(犹如信的内容),还必须知道这个数送达的地址(犹如信的地址或邮政编码),所以就必须给每个寄存器(即半导体存储器)都规定不同的地址,只不过在单片机中地址的编码也是用数字来表示的,那么单片机中有多少个寄存器呢?它们的地址又是如何规定的呢?
前面我们学过,单片机有两种存储器,即只读存储器ROM
和随机存储器RAM,它们都被规定了各自的地址,我们把它称做寻址空间。既然是空间,就必然有一个范围的概念,接下来就让我们看看MCS-51
单片机中程序存储器ROM 的寻址范围:
1.内部R0M 的寻址范围
89C51 的内部有4K 的FLASH ROM 空间,其寻址范围为000H-0FFH(16*16*16),这4K 的ROM
空间就是用来存放我们为单片机编写的程序的,单片机执行指令时就是一条一条地顺序地从ROM 中寻找指令进行执行。了解了ROM
的寻址范围,让我们接着来看另一种存储器:内部RAM 的寻址范围
单片机的内部RAM 共有256 个字节,寻址范围为00H-FFH(即16*16),它被分为两个部分:第一部分从00H-7FH 共128
个字节是真正的RAM 区,可以用来读写各种数据,在这128 个字节中,又分成三个区域:第一个区域00H-1FH 安排了4
组工作寄存器,每组用8 个字节,共32
个字节,分别为R0-R7,当然在同一时刻,只能用其中的一组工作寄存器,怎么来控制它,就要用程序状态字PWS 中的RS0、RS1
两位,(这我们后面再讲);第二个区域20H-2FH 共16 个字节除了可以作为一般的RAM
单元读写外,还可以对每个字节的每一位(即每一个抽屉中的每一个小盒子)进行操作,并且对这些位都规定了固定的位地址:从20H 单元的第0
位开始到2FH 单元的第7 位结束共128 位;第三个区域就是一般的RAM 单元,地址为30H-7FH,共80
个字节;第二部分从80H-FFH 是专门用于特殊功能寄存器(SFR)的,89C51 共用21
个特殊功能寄存器(这些我们都将在下一课中讲解),它们每个也都有8 位,这部分的128 个字节并没有全部用完。
单片机内部结构(六)
&&& 我们已经讲过,R7,R6
是工作寄存器,P0,P1,P2,P3
是并行口,那么单片机中还有些什么东西?它们的结构又是怎么样的呢?这就是本课要讨论的问题。一.单片机的特殊功能寄存器,在单片机中,除了前面介绍的RAM,ROM,P0-P3
和CPU 外,方框内的还有许多其他的东西它们被称为特殊功能寄存器,英文简写SFR ,下表例出的就是MCS-51
单片机中几个常用的特殊功能寄存器。这一课我们先来介绍几个:
二.几个常用的特殊功能寄存器
1.累加器ACC
表示,它是一个什么东西呢?我们知道单片机在做运算时它的中间结果需要放在某个地方,这个地方就是累加器,它的名字很特殊,功能也很特殊,几乎所有的运算类指令都离不开它。
B 寄存器在做乘法时用来存放一个乘数,在做除法时用来存放一个除数,不做乘除法时随你怎么用。
3.程序状态字PSW
它是一个很重要的东西,里面放了CPU 工作时的很多状态,知道它就可以了解CPU
当前的工作状态,它有点象平时看书用的目录,我们浏览它就可以了解一本书的内容。它是一个8 位的寄存器,用到了其中的7
位。其格式如下:
下面来逐位介绍它的功能:
(1)CY:进位标志位
MCS-51 是一种8 位的单片机,它的运算结果只能表示到28(即0-255),但我们有时候的运算结果要超过255
,怎么办呢?就要用CY 位。例如:79H+87H(10111)=1
,这里的“1”就进到了CY 中去了。
(2)AC:半进位标志位
当D3 位向D4 位进位/借位时,AC=1,通常用于十进制调整运算中。
(3)F0:用户自定义标志位
由编程人员自行决定,什么时候用,什么时候不用。
(4) RS1、RS0:工作寄存器组选择位。
前面讲到单片机共有四个工作寄存器组(0 组-3 组),它们就是由RS1,RS0
来控制,这两位就在这里,它共有四种组合状态,看上面的表格:每个工作寄存器组有8 个字节,分别记为R0-R7 ,当然在某一时刻,CPU
只使用其中的一组。
假设PSW 为“10”(即),那么RS1=1,RS0=0,则用到了第2 组寄存器组(地址10H-17H),RO-R7
即为10H-17H ,用DUBG8051 软件输入数值,看看内部RAM 中地址为10H-17H 中的值是不是为输入值。
(5) 0V:溢出标志位
什么时候溢出,我们讲到定时器时再研究。
(6) P:奇偶检验位
每次运算结束后若A 中二进制数“1”的个数为奇数,则P=1 ,否则P=0 。例:某运算结果是58H
(),显然“1”的个数为奇数,所以P=1。
4.DPTR(DPH,DPL):数据指针
数据指针是一个16 位的寄存器,我们可以用它来访问外部RAM ,也可以访问外部ROM 中的表格,具体应用以后再讲。
5.SP:堆栈指针:
让我们先来理解一下堆栈是什么意思?你在家洗碗吗?我们洗好碗之后,是怎么放的呢?一般总是先洗的放在下面,晚洗的放在上面,然后用的时候呢,总是晚放上去的先用,先放上去的后用;如果你不洗碗不要紧,知道码头上仓库里堆的货物吗?一般也是先进去的后出来,而后进去的先出来,这种符合“先进后出,后进先出”存放规则的现象我们就把它叫做“堆栈”。(其实栈在中文中的意思就是码头)。
在单片机中,我们可以在内部RAM
中构造出(注意☺:是可以构造)这样一个区域,这个区域存放数据的规则就符合堆栈中“先进后出,后进先出”的原则。为什么要有这样一个区域呢?存储器本身不也同样可以存放数据吗?是的,知道了存储器地址确实可以读出它里面的内容,但如果我们要读出的是一批数据,每一个数据都要给出一个地址就会很麻烦,为了简化操作就可以利用堆栈的存放方法来读取数据,具体的应用我们将在十五课中结合具体实验来讲,这里只是让大家先了解一下。那么堆栈在单片机的什么地方?也就是说把RAM
空间的哪一块区域作为堆栈呢?这就不好定了,因为51
系列单片机是一种通用的单片机,每个人的实际需要各不相同,有人需要多一些堆栈,而有人则不需要那么多堆栈,所以INTEL
公司就干脆不分了,把分的权利让给用户(编程者),也就是说我们可以根据自已的需要来决定,所以单片机中堆栈的位置是可以变化的,而这种变化就体现在SP
中值的变化,看下面的图,SP 中的值等于27H 不就相当于是一个指针指向27H 单元吗?这就是堆栈指针的由来。
当然在MCS-51 单片机中,指针开始所指的位置并非就是数据存放的位置,而是数据存放的前一个位置。例如一开始堆栈指针是指向27H
单元的,那么第一个数据的存放位置就在28H 单元中,而不是27H 单元中,这一点请大家注意。
6.电源控制寄存器PCON
单片机在以电池供电的系统中,有时为了节电,我们需要让它尽量降低电源的消耗,所以单片机就有多种的工作方式,其中一种就是低功耗方式,PCON
寄存器就是用来控制单片机进入低功耗方式的。
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 单片机数字电压表程序 的文章

 

随机推荐