平凡的单片机教程 自学单片机第6页共60页 EPROM,称之为紫外线擦除的可编程只读存储器。它里面的内容写上去之后,如果觉得不满意,可以用一种特 殊的方法去掉后重写,这就是用紫外线照射,紫外线就象“消字灵”,可以把字去掉,然后再重写。当然消的次 数多了,也就不灵光了,所以这种芯片可以擦除的次数也是有限的一一几百次吧 FLASH,称之为闪速存储器,它和 EPROM类似,写上去的东西也可以擦掉重写,但它要方便一些,不需要光 照了,只要用电学方法就可以擦除,所以就方便许多,而且寿面也很长(几万到几十万次不等) 再次强调,这里的所有的写都不是指在正常工作条件下。不管是PROM、 EPROM还是 FLASH ROM,它们的写 都要有特殊的条件,一般我们用一种称之为“编程器”的设备来做这项工作,一旦把它装到它的工作位置,就不 能随便改写了 单片机教程第四课:第一个小程罔 上一次我们的程序实在是没什么用,要灯亮还要重写一下片子,下面我们要让灯不断地闪烁,这就有一定的 实用价值了,比如可以把它当成汽车上的一个信号灯用了。怎样才能让灯不断地闪烁呢?实际上就是要灯亮一段 时间,再灭一段时间,也就是说要P10不断地输出高和低电平。怎样实现这个要求呢?请考虑用下面的指令是否 SETB P10 CLR P1O 这是不行的,有两个问题,第一,计算机执行指令的时间很快,执行完 SETB P10后,灯是灭了,但在极短时间 (微秒级)后,计算机又执行了CLRP10指令,灯又亮了,所以根本分辨不出灯曾灭过。第二,在执行完CLRP10 后,不会再去执行 SETB P10指令,所以以后再也没有机会让灭了 为了解决这两个问题,我们可以做如下设想,第一,在执行完 SETB P10后,延时一段时间(几秒或零点几 秒)再执行第二条指令,就可以分辨出灯曾灭过了。第二在执行完第二条指令后,让计算机再去执行第一条指令, 不断地在原地兜圈,我们称之为"循环",这样就可以完成任务了。 以下先给出程序(后面括号中的数字是为了便于讲解而写的,实际不用输入) 主程序: LOOP: SETB P10 (1) LCALL DELAY (2) CLR P10 (3) LCALL DELAY (4) AJMP LOOP (5) ;以下子程序 DELAY: MOV R7, #250 :(6) DI: MOV R6, #250 D2 DJNZ R6, D2 DJNZ RT, DI (9) 10) END 按上面的设想分析一下前面的五条指令 第一条是让灯灭,第二条应当是延时,第三条是让灯亮,第四条和第二条一模一样,也是延时,第五条应当 是转去执行第一条指令。第二和第四条实现的原理稍后谈,先看第五条,LJMP是一条指令,意思是转移,往什 么地方转移呢?后面跟的是LOOP,看一下,什么地方还有LOOP,对了,在第一条指令的前面有一个LOOP 所以很直观地,我们可以认识到,它要转到第一条指令处。这个第一条指令前面的LOOP被称之为标号,它的 用途就是给这一行起一个名字,便于使用。是否一定要给它起名叫LOOP呢?当然不是,起什么名字,完全由 编程序的人决定,可以称它为A,X等等,当然,这时,第五条指令LJMP后面的名字也得跟着改了。 第二条和第四条指令的用途是延时,它是怎样实现的呢?指令的形式是 LCALL,这条指令称为调用子程序 指令,看一下指令后面跟的是什么, DELAY,找一下 DELAY,在第六条指令的前面,显然,这也是一个标号。 这条指令的作用是这样的:当执行 LCALL指令时,程序就转到 LCALL后面的标号所标定的程序处执行,如果
平凡的单片机教程 自学单片机第 6 页 共 60 页 6 EPROM,称之为紫外线擦除的可编程只读存储器。它里面的内容写上去之后,如果觉得不满意,可以用一种特 殊的方法去掉后重写,这就是用紫外线照射,紫外线就象“消字灵”,可以把字去掉,然后再重写。当然消的次 数多了,也就不灵光了,所以这种芯片可以擦除的次数也是有限的——几百次吧。 FLASH,称之为闪速存储器,它和 EPROM 类似,写上去的东西也可以擦掉重写,但它要方便一些,不需要光 照了,只要用电学方法就可以擦除,所以就方便许多,而且寿面也很长(几万到几十万次不等)。 再次强调,这里的所有的写都不是指在正常工作条件下。不管是 PROM、EPROM 还是 FLASH ROM,它们的写 都要有特殊的条件,一般我们用一种称之为“编程器”的设备来做这项工作,一旦把它装到它的工作位置,就不 能随便改写了。 单片机教程第四课:第一个小程序 上一次我们的程序实在是没什么用,要灯亮还要重写一下片子,下面我们要让灯不断地闪烁,这就有一定的 实用价值了,比如可以把它当成汽车上的一个信号灯用了。怎样才能让灯不断地闪烁呢?实际上就是要灯亮一段 时间,再灭一段时间,也就是说要 P10 不断地输出高和低电平。怎样实现这个要求呢?请考虑用下面的指令是否 可行: SETB P10 CLR P10 …… 这是不行的,有两个问题,第一,计算机执行指令的时间很快,执行完 SETB P10 后,灯是灭了,但在极短时间 (微秒级)后,计算机又执行了 CLR P10 指令,灯又亮了,所以根本分辨不出灯曾灭过。第二,在执行完 CLR P10 后,不会再去执行 SETB P10 指令,所以以后再也没有机会让灭了。 为了解决这两个问题,我们可以做如下设想,第一,在执行完 SETB P10 后,延时一段时间(几秒或零点几 秒)再执行第二条指令,就可以分辨出灯曾灭过了。第二在执行完第二条指令后,让计算机再去执行第一条指令, 不断地在原地兜圈,我们称之为"循环",这样就可以完成任务了。 以下先给出程序(后面括号中的数字是为了便于讲解而写的,实际不用输入): ;主程序: LOOP: SETB P10 ;(1) LCALL DELAY ;(2) CLR P10 ;(3) LCALL DELAY ;(4) AJMP LOOP ;(5) ;以下子程序 DELAY: MOV R7,#250 ;(6) D1: MOV R6,#250 ;(7) D2: DJNZ R6,D2 ;(8) DJNZ R7,D1 ;(9) RET ;(10) END ;(11) 按上面的设想分析一下前面的五条指令。 第一条是让灯灭,第二条应当是延时,第三条是让灯亮,第四条和第二条一模一样,也是延时,第五条应当 是转去执行第一条指令。第二和第四条实现的原理稍后谈,先看第五条,LJMP 是一条指令,意思是转移,往什 么地方转移呢?后面跟的是 LOOP,看一下,什么地方还有 LOOP,对了,在第一条指令的前面有一个 LOOP, 所以很直观地,我们可以认识到,它要转到第一条指令处。这个第一条指令前面的 LOOP 被称之为标号,它的 用途就是给这一行起一个名字,便于使用。是否一定要给它起名叫 LOOP 呢?当然不是,起什么名字,完全由 编程序的人决定,可以称它为 A,X 等等,当然,这时,第五条指令 LJMP 后面的名字也得跟着改了。 第二条和第四条指令的用途是延时,它是怎样实现的呢?指令的形式是 LCALL,这条指令称为调用子程序 指令,看一下指令后面跟的是什么,DELAY,找一下 DELAY,在第六条指令的前面,显然,这也是一个标号。 这条指令的作用是这样的:当执行 LCALL 指令时,程序就转到 LCALL 后面的标号所标定的程序处执行,如果
平凡的单片机教程 自学单片机第7页共60页 在执行指令的过程中遇到RET指令,则程序就返回到 LCALL指令的下面的一条指令继续执行,从第六行开始 的指令中,可以看到确实有RET指令。在执行第二条指令后,将转去执行第6条指令,而在执行完6,7,8 9条指令后将遇到第10条令:RET,执行该条指令后,程序将回来执行第三条指令,即将P10清零,使灯亮, 然后又是第四条指令,执行第四条指令就是转去执行第6,7,8,9,10条指令,然后回来执行第5条指令,第 5条指令就是让程序回到第1条开始执行,如此周而复始,灯就在不断地亮、灭了 在标号 DELAY标志的这一行到RET这一行中的所有程序,这是一段延时程序,大概延时零点几秒,至于 具体的时间,以后我们再学习如何计算。程序的最后一行是END,这不是一条指令,它只是告诉我们程序到此 结束,它被称为"伪指令"。 单片机内部结构分析:为了知道延时程序是如何工作的,我们必需首先了解延时程序中出现的一些符号,就从 RⅠ开始,RI被称之为工作寄存器。什么是工作寄存器呢?让我们从现实生活中来找找答案。如果出一道数学题: 123+567,让你回答结果是多少,你会马上答出是690,再看下面一道题:123+567+562,要让你要上回答,就不 这么容易了吧?我们会怎样做呢?如果有张纸,就容易了,我们先算出123+567=690,把690写在纸上,然后再 算690+562得到结果是1552。这其中1552是我们想要的结果,而690并非我们所要的结果,但是为了得到最终 结果,我们又不得不先算出690,并记下来,这其实是一个中间结果,计算机中做运算和这个类似,为了要得到 最终结果,往往要做很多步的中间结果,这些中间结果要有个地方放才行,把它们放哪呢?放在前面提到过的 ROM中可以吗?显然不行,因为计算机要将结果写进去,而ROM是不可以写的,所以在单片机中另有一个区 域称为RAM区(RAM是随机存取存储器的英文缩写),它可以将数据写进去。特别地,在MCS-51单片机中 将RAM中分出一块区域,称为工作寄存器区 单片机教程第五课:延时程序分楣 上一次课中,我们已经知道,程序中的符号R7、R6是代表了一个个的RAM单元,是用来放一些数据的,下面 我们再来看一下其它符号的含义。 831 DELAY: MOV R7, #250 (6) DI: MOV R6, #250 (7) D2:DNZR6,D2:(8) DJNZ R7, DI ret MOⅤ:这是一条指令,意思是传递数据。说到传递,我们都很清楚,传东西要从一个人的手上传到另一个人的 手上,也就是说要有一个接受者,一个传递者和一样东西。从指令MOVR7,#250中来分析,R7是一个接受者 250是被传递的数,传递者在这条指令中被省略了(注意:并不是每一条传递指令都会省的,事实上大部份数据 传递指令都会有传递者)。它的意义也很明显:将数据250送到R7中去,因此执行完这条指令后,R7单元中的 值就应当是250。在250前面有个#号,这又是什么意思呢?这个#就是用来说明250就是一个被传递的东西本身 而不是传递者。那么MOVR6,#250是什么意思,应当不用分析了吧 DJNZ:这是另一条指令,我们来看一下这条指令后面跟着的两个东西,一个是R6,一个是D2,R6我们当然已 知是什么了,查一下D2是什么。D2在本行的前面,我们已学过,这称之为标号。标号的用途是什么呢?就是 给本行起一个名字。DJNZ指令的执行过程是这样的,它将其后面的第一个参数中的值减1,然后看一下,这个 值是否等于0,如果等于0,就往下执行,如果不等于0,就转移,转到什么地方去呢?可能大家已猜到了,转 到第二个参数所指定的地方去(请大家用自已的话讲一下这条语句是怎样执行的)。本条指令的最终执行结果就 是,在原地转圈250次 执行完了 DINZ R6,D2之后(也就是R6的值等于0之后),就会去执行下面一行,也就是 DINZ R7,D1,请大 7
平凡的单片机教程 自学单片机第 7 页 共 60 页 7 在执行指令的过程中遇到 RET 指令,则程序就返回到 LCALL 指令的下面的一条指令继续执行,从第六行开始 的指令中,可以看到确实有 RET 指令。在执行第二条指令后,将转去执行第6条指令,而在执行完6,7,8, 9条指令后将遇到第10条令:RET,执行该条指令后,程序将回来执行第三条指令,即将 P10 清零,使灯亮, 然后又是第四条指令,执行第四条指令就是转去执行第 6,7,8,9,10 条指令,然后回来执行第 5 条指令,第 5 条指令就是让程序回到第 1 条开始执行,如此周而复始,灯就在不断地亮、灭了。 在标号 DELAY 标志的这一行到 RET 这一行中的所有程序,这是一段延时程序,大概延时零点几秒,至于 具体的时间,以后我们再学习如何计算。 程序的最后一行是 END,这不是一条指令,它只是告诉我们程序到此 结束,它被称为"伪指令"。 单片机内部结构分析:为了知道延时程序是如何工作的,我们必需首先了解延时程序中出现的一些符号, 就从 R1 开始,R1 被称之为工作寄存器。什么是工作寄存器呢?让我们从现实生活中来找找答案。如果出一道数学题: 123+567,让你回答结果是多少,你会马上答出是 690,再看下面一道题:123+567+562,要让你要上回答,就不 这么容易了吧?我们会怎样做呢?如果有张纸,就容易了,我们先算出 123+567=690,把 690 写在纸上,然后再 算 690+562 得到结果是 1552。这其中 1552 是我们想要的结果,而 690 并非我们所要的结果,但是为了得到最终 结果,我们又不得不先算出 690,并记下来,这其实是一个中间结果,计算机中做运算和这个类似,为了要得到 最终结果,往往要做很多步的中间结果,这些中间结果要有个地方放才行,把它们放哪呢?放在前面提到过的 ROM 中可以吗?显然不行,因为计算机要将结果写进去,而 ROM 是不可以写的,所以在单片机中另有一个区 域称为 RAM 区(RAM 是随机存取存储器的英文缩写),它可以将数据写进去。 特别地,在 MCS-51 单片机中, 将 RAM 中分出一块区域,称为工作寄存器区 单片机教程第五课:延时程序分析 上一次课中,我们已经知道,程序中的符号 R7、R6 是代表了一个个的 RAM 单元,是用来放一些数据的,下面 我们再来看一下其它符号的含义。 DELAY: MOV R7,#250 ;(6) D1: MOV R6,#250 ;(7) D2: DJNZ R6,D2 ;(8) DJNZ R7,D1 ;(9) RET ;(10) MOV:这是一条指令,意思是传递数据。说到传递,我们都很清楚,传东西要从一个人的手上传到另一个人的 手上,也就是说要有一个接受者,一个传递者和一样东西。从指令 MOV R7,#250 中来分析,R7 是一个接受者, 250 是被传递的数,传递者在这条指令中被省略了(注意:并不是每一条传递指令都会省的,事实上大部份数据 传递指令都会有传递者)。它的意义也很明显:将数据 250 送到 R7 中去,因此执行完这条指令后,R7 单元中的 值就应当是 250。在 250 前面有个#号,这又是什么意思呢?这个#就是用来说明 250 就是一个被传递的东西本身, 而不是传递者。那么 MOV R6,#250 是什么意思,应当不用分析了吧。 DJNZ:这是另一条指令,我们来看一下这条指令后面跟着的两个东西,一个是 R6,一个是 D2,R6 我们当然已 知是什么了,查一下 D2 是什么。D2 在本行的前面,我们已学过,这称之为标号。标号的用途是什么呢?就是 给本行起一个名字。DJNZ 指令的执行过程是这样的,它将其后面的第一个参数中的值减 1,然后看一下,这个 值是否等于 0,如果等于 0,就往下执行,如果不等于 0,就转移,转到什么地方去呢?可能大家已猜到了,转 到第二个参数所指定的地方去(请大家用自已的话讲一下这条语句是怎样执行的)。本条指令的最终执行结果就 是,在原地转圈 250 次。 执行完了 DJNZ R6,D2 之后(也就是 R6 的值等于 0 之后),就会去执行下面一行,也就是 DJNZ R7,D1,请大
平凡的单片机教程 自学单片机第8页共60页 家自行分析一下这句话执行的结果。(转去执行MOVR6,#250,同时R7中的值减1),最终DNZR6,D2这句 话将被执行250*250=62500次,执行这么多次同一条指令干吗?就是为了延时 个问题:如果在R6中放入0,会有什么样的结果 时序分析 前面我们介绍了延时程序,但这还不完善,因为,我们只知道 DINZ R6,D2这句话会被执行62500次,但是执 行这么多次需要多长时间呢?是否满足我们的要求呢?我们还不知道,所以下面要来解决这个问题。 先提一个问题:我们学校里什么是最重要的。(铃声)校长可以出差,老师可以休息,但学校一日无铃声必定大 乱。整个学校就是在铃声的统一指挥下,步调一致,统一协调地工作着。这个铃是按一定的时间安排来响的,我 们可以称之为“时序&#�时间的顺序”。一个由人组成的单位尚且要有一定的时序,计算机当然更要有严格 的时序。事实上,计算机更象一个大钟,什么时候分针动,什么时候秒针动,什么时候时针动,都有严格的规定 点也不能乱。计算机要完成的事更复杂,所以它的时序也更复杂。 我们已知,计算机工作时,是一条一条地从ROM中取指令,然后一步一步地执行,我们规定:计算机访问一次 存储器的时间,称之为一个机器周期。这是一个时间基准,好象我们人用“秒”作为我们的时间基准一样,为什 么不干脆用“秒”,多好,很习惯,学下去我们就会知道用“秒”反而不习惯 个机器周期包括12个时钟周期。下面让我们算一下一个机器周期是多长时间吧。设一个单片机工作于12M晶 振,它的时钟周期是1/12(微秒)。它的一个机器周期是12*(/12)也就是1微秒。(请计算一个工作于6M晶 振的单片机,它的机器周期是多少) MCS-51单片机的所有指令中,有一些完成得比较快,只要一个机器周期就行了,有一些完成得比较慢,得要2 个机器周期,还有两条指令要4个机器周期才行。这也不难再解,不是吗?我让你扫地的执行要完成总得比要你 完成擦黑板的指令时间要长。为了恒量指令执行时间的长短,又引入一个新的概念:指令周期。所谓指令周期就 是指执行一条指令的时间。 INTEL对每一条指令都给出了它的指令周期数,这些数据,大部份不需要我们去记 忆,但是有一些指令是需要记住的,如DNZ指令是双周期指令 下面让我们来计算刚才的延时。首先必须要知道晶振的频率,我们设所用晶振为12M,则一个机器周期就是 微秒。而DJNZ指令是双周期指令,所以执行一次要2个微秒。一共执行62500次,正好125000微秒,也就是 125毫秒 练习:设计一个延时100毫秒的延时程序 要点分析:1、一个单元中的数是否可以超过255。2、如何分配两个数。 三、复位电路 任何单片机在工作之前都要有个复位的过程,复位是什么意思呢?它就象是我们上课之前打的预备铃。预备铃一 响,大家就自动地从操场、其它地方进入教室了,在这一段时间里,是没有老师干预的,对单片机来说,是程序 还没有开始执行,是在做准备工作。显然,准备工作不需要太长的时间,复位只需要5ms的时间就可以了。如 何进行复位呢?只要在单片机的RST引脚上加上高电平,就可以了,按上面所说,时间不少于5msa为了达到 这个要求,可以用很多种方法,这里提供一种供参考,见图1。实际上,我们在上一次实验的图中已见到过了 这种复位电路的工作原理是:通电时,电容两端相当于是短路,于是RST引脚上为高电平,然后电源通过电阻 对电容充电,RST端电压慢慢下降,降到一定程序,即为低电平,单片机开始正常工作 单片机教程第六课:单片机的内外部结构分析(四)」 上两次我们做过两个实验,都是让P10这个引脚使灯亮,我们可以设想:既然P10可以让灯亮,那么其它的引 脚可不可以呢?看一下图1,它是8031单片机引脚的说明,在P10旁边有P1.1,P1.2.P1.7,它们是否都可以 让灯亮呢?除了以P1开头的外,还有以P0,P2,P3开头的,数一下,一共是32个引脚,前面我们以学过7个 引脚,加上这32个这39个了。它们都以P字开头,只是后面的数字不一样,它们是否有什么联系呢?它们能不 能都让灯亮呢?在我们的实验板上,除了P10之外,还有P11�,�,P17都与LED相连,下面让我们来做 个实验,程序如下 MAIN: MOV Pl, #OFFH LCALL DELAY 8
平凡的单片机教程 自学单片机第 8 页 共 60 页 8 家自行分析一下这句话执行的结果。(转去执行 MOV R6,#250,同时 R7 中的值减 1),最终 DJNZ R6,D2 这句 话将被执行 250*250=62500 次,执行这么多次同一条指令干吗?就是为了延时。 一个问题:如果在 R6 中放入 0,会有什么样的结果。 二、时序分析: 前面我们介绍了延时程序,但这还不完善,因为,我们只知道 DJNZ R6,D2 这句话会被执行 62500 次,但是执 行这么多次需要多长时间呢?是否满足我们的要求呢?我们还不知道,所以下面要来解决这个问题。 先提一个问题:我们学校里什么是最重要的。(铃声)校长可以出差,老师可以休息,但学校一日无铃声必定大 乱。整个学校就是在铃声的统一指挥下,步调一致,统一协调地工作着。这个铃是按一定的时间安排来响的,我 们可以称之为“时序��时间的顺序”。一个由人组成的单位尚且要有一定的时序,计算机当然更要有严格 的时序。事实上,计算机更象一个大钟,什么时候分针动,什么时候秒针动,什么时候时针动,都有严格的规定, 一点也不能乱。计算机要完成的事更复杂,所以它的时序也更复杂。 我们已知,计算机工作时,是一条一条地从 ROM 中取指令,然后一步一步地执行,我们规定:计算机访问一次 存储器的时间,称之为一个机器周期。这是一个时间基准,好象我们人用“秒”作为我们的时间基准一样,为什 么不干脆用“秒”,多好,很习惯,学下去我们就会知道用“秒”反而不习惯。 一个机器周期包括 12 个时钟周期。下面让我们算一下一个机器周期是多长时间吧。设一个单片机工作于 12M 晶 振,它的时钟周期是 1/12(微秒)。它的一个机器周期是 12*(1/12)也就是 1 微秒。(请计算一个工作于 6M 晶 振的单片机,它的机器周期是多少)。 MCS-51 单片机的所有指令中,有一些完成得比较快,只要一个机器周期就行了,有一些完成得比较慢,得要 2 个机器周期,还有两条指令要 4 个机器周期才行。这也不难再解,不是吗?我让你扫地的执行要完成总得比要你 完成擦黑板的指令时间要长。为了恒量指令执行时间的长短,又引入一个新的概念:指令周期。所谓指令周期就 是指执行一条指令的时间。INTEL 对每一条指令都给出了它的指令周期数,这些数据,大部份不需要我们去记 忆,但是有一些指令是需要记住的,如 DJNZ 指令是双周期指令。 下面让我们来计算刚才的延时。首先必须要知道晶振的频率,我们设所用晶振为 12M,则一个机器周期就是 1 微秒。而 DJNZ 指令是双周期指令,所以执行一次要 2 个微秒。一共执行 62500 次,正好 125000 微秒,也就是 125 毫秒。 练习:设计一个延时 100 毫秒的延时程序。 要点分析:1、一个单元中的数是否可以超过 255。2、如何分配两个数。 三、复位电路 任何单片机在工作之前都要有个复位的过程,复位是什么意思呢?它就象是我们上课之前打的预备铃。预备铃一 响,大家就自动地从操场、其它地方进入教室了,在这一段时间里,是没有老师干预的,对单片机来说,是程序 还没有开始执行,是在做准备工作。显然,准备工作不需要太长的时间,复位只需要 5ms 的时间就可以了。如 何进行复位呢?只要在单片机的 RST 引脚上加上高电平,就可以了,按上面所说,时间不少于 5ms。为了达到 这个要求,可以用很多种方法,这里提供一种供参考,见图 1。实际上,我们在上一次实验的图中已见到过了。 这种复位电路的工作原理是:通电时,电容两端相当于是短路,于是 RST 引脚上为高电平,然后电源通过电阻 对电容充电,RST 端电压慢慢下降,降到一定程序,即为低电平,单片机开始正常工作。 单片机教程第六课:单片机的内外部结构分析(四) 上两次我们做过两个实验,都是让 P1.0 这个引脚使灯亮,我们可以设想:既然 P1.0 可以让灯亮,那么其它的引 脚可不可以呢?看一下图 1,它是 8031 单片机引脚的说明,在 P1.0 旁边有 P1.1,P1.2….P1.7,它们是否都可以 让灯亮呢?除了以 P1 开头的外,还有以 P0,P2,P3 开头的,数一下,一共是 32 个引脚,前面我们以学过 7 个 引脚,加上这 32 个这 39 个了。它们都以 P 字开头,只是后面的数字不一样,它们是否有什么联系呢?它们能不 能都让灯亮呢?在我们的实验板上,除了 P10 之外,还有 P11��P17 都与 LED 相连,下面让我们来做一 个实验,程序如下: MAIN: MOV P1,#0FFH LCALL DELAY
平凡的单片机教程 自学单片机第9页共60页 MOV PI, #OOH LCALL DELAY LJ MP MAIN DELAY: MOV R7, #250 DI: MOV R6, #250 D2: DJNZ R6, D2 DJNZ R7, DI RE END 将这段程序转为机器码,用编程器写入芯片中,结果如何?通电以后我们可以看到8只LED全部在闪动。因此, P10�,�P17是全部可以点亮灯的。事实上,凡以P开头的这32个引脚都是可以点亮灯的,也就是说:这 32个引脚都可以作为输出使用,如果不用来点亮LED,可以用来控制继电器,可以用来控制其它的执行机构 程序分析:这段程序和前面做过的程序比较,只有两处不一样:第一句:原来是 SETB P1.0,现在改为MOVP1, #0OFFH,第三句:原来是CLRP1.0,现在改为MOVP1.0,#00H。从中可以看出,P1是P10��,P17的全 体的代表,一个Pl就表示了所有的这八个管脚了。当然用的指令也不一样了,是用MOV指令。为什么用这条 指令?看图2,我们把Pl作为一个整体,就把它当作是一个存储器的单元,对一个单元送进一个数可以用MOV 指令 第四个实验 除了可以作为输出外,这32个引脚还可以做什么呢?下面再来做一个实验,程序如下 MAIN: MOV P3, #OFFH LOOP: MOVA, P3 MOV PI, A LJMP LOOP 先看一下实验的结果:所有灯全部不亮,然后我按下一个按钮,第()个灯亮了,再按下另一个按钮,第()个 灯亮了,松开按钮灯就灭了。从这个实验现象结合电路来分析一下程序 从硬件电路的连线可以看出,有四个按钮被接入到P3口的P32,P33,P34,P35。第一条指令的用途我们可以猜 到:使P3口全部为高电平。第二条指令是MOVA,P3,其中MOV已经见,是送数的意思,这条指令的意思 就是将P3口的数送到A中去,我们可以把A当成是一个中间单元(看图3),第三句话是将A中的数又送到P 口去,第四句话是循环,就是不断地重复这个过程,这我们已见过。当我们按下第一个按钮时,第(3)只灯亮 了,所以P12口应当输出是低电平,为什么P12口会输出低电平呢?我们看一下有什么被送到了P1口,只有从 P3口进来的数送到A,又被送到了P1口,所以,肯定是P3口进来的数使得P12位输出电平的。P3口的P32位 的按钮被按下,使得P32位的电平为低,通过程序,又使P12口输出低电平,所以P3口起来了一个输入的作用 验证:按第二、三、四个按钮,同时按下2个、3个、4个按钮都可以得到同样的结论,所以P3口确实起到了输 入作用,这样,我们可以看到,以P字开头的管脚,不仅可以用作输出,还可以用作输入,其它的管脚是否可以 呢?是的,都可以。这32个引脚就称之为并行口,下面我们就对并行口的结构作一个分析,看一下它是怎样实 现输入和输出的。 并行口结构分析 1、输出结构 先看P1口的一位的结构示意图(只画出了输出部份):从图中可以看出,开关的打开和合上代表了引脚输出的高 和低,如果开关合上了,则引脚输出就是低,如果开关打开了,则输出高电平,这个开关是由一根线来控制的, 这根数据总线是出自于CPU,让我们回想一下,数据总线是一根大家公用的线,很多的器件和它连在一起,在 不同的时候,不同的器件当然需要不同的信号,如某一时刻我们让这个引脚输出高电平,并要求保持若干时间, 在这段时间里,计算机当然在忙个不停,在与其它器件进行联络,这根控制线上的电平未必能保持原来的值不变, 输出就会发生变化了。怎么解决这个问题呢?我们在存储器一节中学过,存储器中是可以存放电荷的,我们不妨 也加一个小的存储器的单元,并在它的前面加一个开关,要让这一位输出时,就把开关打开,信号就进入存储器 的单元,然后马上关闭开关,这样这一位的状态就被保存下来,直到下一次命令让它把开关再打开为止。这样就
平凡的单片机教程 自学单片机第 9 页 共 60 页 9 MOV P1,#00H LCALL DELAY LJMP MAIN DELAY:MOV R7,#250 D1: MOV R6,#250 D2: DJNZ R6,D2 DJNZ R7,D1 RET END 将这段程序转为机器码,用编程器写入芯片中,结果如何?通电以后我们可以看到 8 只 LED 全部在闪动。因此, P10��P17 是全部可以点亮灯的。事实上,凡以 P 开头的这 32 个引脚都是可以点亮灯的,也就是说:这 32 个引脚都可以作为输出使用,如果不用来点亮 LED,可以用来控制继电器,可以用来控制其它的执行机构。 程序分析:这段程序和前面做过的程序比较,只有两处不一样:第一句:原来是 SETB P1.0,现在改为 MOV P1, #0FFH,第三句:原来是 CLR P1.0,现在改为 MOV P1.0,#00H。从中可以看出,P1 是 P1.0��P1.7 的全 体的代表,一个 P1 就表示了所有的这八个管脚了。当然用的指令也不一样了,是用 MOV 指令。为什么用这条 指令?看图 2,我们把 P1 作为一个整体,就把它当作是一个存储器的单元,对一个单元送进一个数可以用 MOV 指令。 二、第四个实验 除了可以作为输出外,这 32 个引脚还可以做什么呢?下面再来做一个实验,程序如下: MAIN: MOV P3,#0FFH LOOP: MOV A,P3 MOV P1,A LJMP LOOP 先看一下实验的结果:所有灯全部不亮,然后我按下一个按钮,第()个灯亮了,再按下另一个按钮,第()个 灯亮了,松开按钮灯就灭了。从这个实验现象结合电路来分析一下程序。 从硬件电路的连线可以看出,有四个按钮被接入到 P3 口的 P32,P33,P34,P35。第一条指令的用途我们可以猜 到:使 P3 口全部为高电平。第二条指令是 MOV A,P3,其中 MOV 已经见,是送数的意思,这条指令的意思 就是将 P3 口的数送到 A 中去,我们可以把 A 当成是一个中间单元(看图 3),第三句话是将 A 中的数又送到 P1 口去,第四句话是循环,就是不断地重复这个过程,这我们已见过。当我们按下第一个按钮时,第(3)只灯亮 了,所以 P12 口应当输出是低电平,为什么 P12 口会输出低电平呢?我们看一下有什么被送到了 P1 口,只有从 P3 口进来的数送到 A,又被送到了 P1 口,所以,肯定是 P3 口进来的数使得 P12 位输出电平的。P3 口的 P32 位 的按钮被按下,使得 P32 位的电平为低,通过程序,又使 P12 口输出低电平,所以 P3 口起来了一个输入的作用。 验证:按第二、三、四个按钮,同时按下 2 个、3 个、4 个按钮都可以得到同样的结论,所以 P3 口确实起到了输 入作用,这样,我们可以看到,以 P 字开头的管脚,不仅可以用作输出,还可以用作输入,其它的管脚是否可以 呢?是的,都可以。这 32 个引脚就称之为并行口,下面我们就对并行口的结构作一个分析,看一下它是怎样实 现输入和输出的。 并行口结构分析: 1、输出结构 先看 P1 口的一位的结构示意图(只画出了输出部份):从图中可以看出,开关的打开和合上代表了引脚输出的高 和低,如果开关合上了,则引脚输出就是低,如果开关打开了,则输出高电平,这个开关是由一根线来控制的, 这根数据总线是出自于 CPU,让我们回想一下,数据总线是一根大家公用的线,很多的器件和它连在一起,在 不同的时候,不同的器件当然需要不同的信号,如某一时刻我们让这个引脚输出高电平,并要求保持若干时间, 在这段时间里,计算机当然在忙个不停,在与其它器件进行联络,这根控制线上的电平未必能保持原来的值不变, 输出就会发生变化了。怎么解决这个问题呢?我们在存储器一节中学过,存储器中是可以存放电荷的,我们不妨 也加一个小的存储器的单元,并在它的前面加一个开关,要让这一位输出时,就把开关打开,信号就进入存储器 的单元,然后马上关闭开关,这样这一位的状态就被保存下来,直到下一次命令让它把开关再打开为止。这样就
平凡的单片机教程 自学单片机第10页共60页 能使这一位的状态与别的器件无关了,这么一个小单元,我们给它一个很形象的名字,称之为“锁存器”。 2、输入结构 这是并行口的一位的输出结构示意图,再看,除了输出之外,还有两根线,一根从外部引脚接入,另一根从锁存 器的输出接出,分别标明读引脚和读锁存器。这两根线是用于从外部接收信号的,为什么要两根呢?原来,在 51单片机中输入有两种方式,分别称为‘读引脚’和‘读锁存器’,第一种方式是将引脚作为输入,那是真正地 从外部引脚读进输入的值,第二种方式是该引脚处于输出状态时,有时需要改变这一位的状态,则并不需要真正 地读引脚状态,而只是读入锁存器的状态,然后作某种变换后再输出 请注意输入结构图,如果将这一根引线作为输入口使用,我们并不能保证在任何时刻都能得到正确的结果(为什 么?)参考图2输入示意图。接在外部的开关如果打开,则应当是输入1,而如果闭合开关,则输入0,但是 如果单片机内部的开关是闭合的,那么不管外部的开关是开还是闭,单片机接受到的数据都是0。可见,要让这 端口作为输入使用,要先做一个‘准备工作’,就是先让内部的开关断开,也就是让端口输出‘1’才行。正因 为要先做这么一个准备工作,所以我们称之为“准双向IO口”。 以上是P1口的一位的结构,P1口其它各位的结构与之相同,而其它三个口:P0、P2、P3则除入作为输入输出 口之外还有其它用途,所以结构要稍复杂一些,但其用于输入、输出的结构是相同的。看图()。对我们来说, 这些附加的功能不必由我们来控制,所以我们就不去关心它了 单片机教程第七课:单片机内部结构分析(五) 通过前面的学习,我们已知单片机的内部有ROM、有RAM、有并行IO口,那么,除了这些东西之外,单片机 内部究竟还有些什么,这些个零碎的东西怎么连在一起的,让我们来对单片机内部作一个完整的分析吧! 看图(1)(本图太大,请大家找本书看吧,一般讲单片机的书,随便哪本都有)。从图中我们可以看出,在51 单片机内部有一个CPU用来运算、控制,有四个并行LO口,分别是P0、P1、P2、P3,有ROM,用来存放程 序,有RAM,用来存放中间结果,此外还有定时计数器,串行ⅣO口,中断系统,以及一个内部的时钟电路。 在一个51单片机的内部包含了这么多的东西 对上面的图进行进一步的分析,我们已知,对并行IO口的读写只要将数据送入到相应LO口的锁存器就可以了 那么对于定时/计数器,串行IO口等怎么用呢?在单片机中有一些独立的存储单元是用来控制这些器件的,被 称之为特殊功能寄存器(SFR)。事实上,我们已接触过P1这个特殊功能寄存器了,还有哪些呢?看表1 符号地址功能介绍 B FOHB寄存器 ACC EOH累加器 PSW|DOH程序状态字 BH中断优先级控制寄存器 BOHP3口锁存器 A8H中断允许控制寄存器 AOHP2口锁存器 SBUF99H串行口锁存器 SCON98H串行口控制寄存器
平凡的单片机教程 自学单片机第 10 页 共 60 页 10 能使这一位的状态与别的器件无关了,这么一个小单元,我们给它一个很形象的名字,称之为“锁存器”。 2、输入结构 这是并行口的一位的输出结构示意图,再看,除了输出之外,还有两根线,一根从外部引脚接入,另一根从锁存 器的输出接出,分别标明读引脚和读锁存器。这两根线是用于从外部接收信号的,为什么要两根呢?原来,在 51 单片机中输入有两种方式,分别称为‘读引脚’和‘读锁存器’,第一种方式是将引脚作为输入,那是真正地 从外部引脚读进输入的值,第二种方式是该引脚处于输出状态时,有时需要改变这一位的状态,则并不需要真正 地读引脚状态,而只是读入锁存器的状态,然后作某种变换后再输出。 请注意输入结构图,如果将这一根引线作为输入口使用,我们并不能保证在任何时刻都能得到正确的结果(为什 么?)参考图 2 输入示意图。接在外部的开关如果打开,则应当是输入 1,而如果闭合开关,则输入 0,但是, 如果单片机内部的开关是闭合的,那么不管外部的开关是开还是闭,单片机接受到的数据都是 0。可见,要让这 一端口作为输入使用,要先做一个‘准备工作’,就是先让内部的开关断开,也就是让端口输出‘1’才行。正因 为要先做这么一个准备工作,所以我们称之为“准双向 I/O 口”。 以上是 P1 口的一位的结构,P1 口其它各位的结构与之相同,而其它三个口:P0、P2、P3 则除入作为输入输出 口之外还有其它用途,所以结构要稍复杂一些,但其用于输入、输出的结构是相同的。看图()。对我们来说, 这些附加的功能不必由我们来控制,所以我们就不去关心它了。 单片机教程第七课:单片机内部结构分析(五) 通过前面的学习,我们已知单片机的内部有 ROM、有 RAM、有并行 I/O 口,那么,除了这些东西之外,单片机 内部究竟还有些什么,这些个零碎的东西怎么连在一起的,让我们来对单片机内部作一个完整的分析吧! 看图(1)(本图太大,请大家找本书看吧,一般讲单片机的书,随便哪本都有)。从图中我们可以看出,在 51 单片机内部有一个 CPU 用来运算、控制,有四个并行 I/O 口,分别是 P0、P1、P2、P3,有 ROM,用来存放程 序,有 RAM,用来存放中间结果,此外还有定时/计数器,串行 I/O 口,中断系统,以及一个内部的时钟电路。 在一个 51 单片机的内部包含了这么多的东西。 对上面的图进行进一步的分析,我们已知,对并行 I/O 口的读写只要将数据送入到相应 I/O 口的锁存器就可以了, 那么对于定时/计数器,串行 I/O 口等怎么用呢?在单片机中有一些独立的存储单元是用来控制这些器件的,被 称之为特殊功能寄存器(SFR)。事实上,我们已接触过 P1 这个特殊功能寄存器了,还有哪些呢?看表 1 符号 地址 功能介绍 B F0H B 寄存器 ACC E0H 累加器 PSW D0H 程序状态字 IP B8H 中断优先级控制寄存器 P3 B0H P3 口锁存器 IE A8H 中断允许控制寄存器 P2 A0H P2 口锁存器 SBUF 99H 串行口锁存器 SCON 98H 串行口控制寄存器