51单片机原理入门教程.docx
- 文档编号:22905866
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:69
- 大小:259.92KB
51单片机原理入门教程.docx
《51单片机原理入门教程.docx》由会员分享,可在线阅读,更多相关《51单片机原理入门教程.docx(69页珍藏版)》请在冰豆网上搜索。
51单片机原理入门教程
51單片機教程
第一課單片機
第二課半導體存儲器
第三課
第四課
第五課
第六課
第七課單片機內部結構分析
第八課尋址方式與指令系統
第九課數據偉遞類指令
第十課單片機指令
第十一課單片機指令算術運算類指令
第十二課邏輯運算類指令
第十三課邏輯與指令
第十四課條件轉移指令
第十五課位及位操作指令
第十六課定時器與計數器
第十七課定時計數器方式控制字
第十八課中斷系統
第十九課定時中斷
第二十課定時計數器
第二十一課串行接口
第二十二課串行口應用編程實例
第二十三課常用接口電路及其編程
第二十四課動態掃描顯示接口
第二十五課鍵盤接口與
第二十六課矩陣式鍵盤接口技術及編程
构成:
CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入/输出设备(如:
串行口、并行输出口等)。
在单片机中,这些部份全被做到一块芯片中,所以称为单片(单芯片)机,有些单片机还集成了A/D,D/A等。
一般用40脚封装,功能多一些单片机也有引脚比较多的,如68引脚,功能少的只有10多个或20多个引脚,甚至8只引脚。
MCS51单片机和8051、8031、89C51等的关系
MCS51是指由美国INTEL公司生产的一系列单片机的总称,包括8031,8051,8751,8032,8052,8752等,8051是最早最典型的产品,该系列其它单片机都是在其基础上进行功能增减、改变而来,所以习惯用8051来称呼MCS51系列单片机。
89C51由美国ATMEL公司开发生产。
以下用89C51来完成实验。
基本概念
半导体存储器的分类
按功能分为只读存储器ROM(READONLYMEMORY)和随机存取存储器RAM(READRANDOMMEMORY)
PROM,可编程存储器
EPROM,紫外线擦除的可编程只读存储器。
擦除次数有限——几百次吧。
FLASH,闪速存储器,和EPROM类似,电学方法可以擦除,寿命长(几万到几十万次不等)。
这里写不是指在正常工作条件下。
不管是PROM、EPROM还是FLASHROM的写都有特殊条件,一般用编程器来做,工作位置不能改写。
一、单片机的外部结构
89C51的芯片连线。
1、电源:
5V电源,正极接40引脚,负极(地)接20引脚。
2、振蒎电路:
单片机是时序电路,必须提供脉冲信号才能正常工作,单片机内部已集成了振荡器,使用晶体振荡器,接18、19脚。
按图1接上晶振,电容。
3、复位引脚:
复位电路
任何单片机在工作之前都要复位,只要在单片机的RST引脚上加上高电平,时间不少于5ms即可。
4、EA引脚:
EA引脚接到正电源端。
至此,一个单片机就接好,通上电,单片机就开始工作了。
指令保存在单片机的只读存储器ROM中。
LOOP:
SETBP1.0 ;(1)灯灭。
LOOP为标号
LCALLDELAY ;(2)调用子程序指令延时
CLRP1.0 ;(3)灯亮
LCALLDELAY ;(4)
AJMPLOOP ;(5)转移指令
DELAY:
MOVR7,#250 ;(6)
D1:
MOVR6,#250 ;(7)
D2:
DJNZR6,D2 ;(8)
DJNZR7,D1 ;(9)
RET ;(10)
END ;(11)
LCALL为调用子程序指令。
执行过程中遇到RET指令,就返回到LCALL指令下面的一条指令继续执行。
标号DELAY到RET是延时程序,程序最后一行是END,这不是一条指令,程序到此结束,称为“伪指令”。
符号Rn代表一个RAM单元,从指令MOVR7,#250中来分析,R7是接受者,250是被传递的数,传递者被省略了(大部份数据传递指令都会有传递者)。
#说明250就是被传递者,而不是传递者。
DJNZ指令将其后参数中的值减1.如果不等于0就转移。
DJNZR7,D1(转去执行MOVR6,#250,同时R7中的值减1),最终DJNZR6,D2被执行250*250次。
问题:
如果在R6中放入0,会有什么样的结果。
0减1后变为FF,程序将不断循环至零。
二、时序分析:
计算机工作时,从ROM中取指令,然后执行,计算机访问一次存储器的时间,称之为一个机器周期,它包括12个时钟周期。
设单片机工作于12M晶振,时钟周期是1/12(微秒)。
它的一个机器周期是1微秒。
MCS-51单片机的指令中,有些只要一个机器周期,有一些要2个,4个机器周期。
如DJNZ指令是双周期指令。
计算刚才的延时就是125毫秒。
练习:
设计一个延时100毫秒的延时程序。
二、单片机内部结构分析:
Rn为工作寄存器。
MOVP1,#0FFH,要送的数(源)是0FFH,送达的地方(目的地)是P1寄存器。
在数据传递类指令中,均将目的地写在指令后面,将源写在最后。
在单片机中另有一个区域RAM区(随机存取存储器),它可以将数据写进去。
特别地,在MCS-51单片机中,将RAM中分出一块区域,称为工作寄存器区。
亮灭时间不同的程式;
MAIN:
SETBP1.0 ;(1)
MOV30H,#255
LCALLDELAY;
CLRP1.0 ;(3)
MOV30H,#200
LCALLDELAY ;(4)
AJMPMAIN;(5)
DELAY:
MOVR7,30H(6)
D1:
MOVR6,#250;(7)
D2:
DJNZR6,D2;(8)
DJNZR7,D1;(9)
RET ;(10)
END ;(11)
P0,P1,P2,P3(80H-B0H)这32个引脚称为并行口。
并行口结构分析:
输出结构信号进入存储器的单元,这一位的状态就被保存下来,直到下一次命令让它把开关再打开为止。
称为“锁存器”。
输入结构第一种方式是将引脚作为输入,读进输入的值.第二种方式是该引脚处于输出状态时,读入锁存器的状态,然后作某种变换后再输出。
接在外部的开关如果打开,则输入1,如果闭合,则输入0,但是如果单片机内部的开关是闭合的,那么不管外部的开关是开是闭,单片机接受到的数据都是0。
可见,要作为输入使用,要先让内部的开关断开,就是端口输出‘1’。
因为要先做这么一个准备工作,所以称之为“准双向I/O口”。
其它三个口:
P0、P2、P3除作为输入输出口之外还有其它用途,结构稍复杂一些,但用于输入、输出的结构是相同的。
第七課單片機內部分析五
51单片机内部有一个CPU用来运算、控制,四个并行I/O口:
P0、P1、P2、P3,有ROM存放程序,有RAM存放中间结果,此外还有定时/计数器,串行I/O口,中断系统,以及一个内部的时钟电路。
单片机中有一些独立存储单元是用来控制这些器件的,称为特殊功能寄存器(SFR)。
1、ACC:
累加器,通常用A表示。
它是一个寄存器,所有运算类指令都离不开它。
2、B:
寄存器。
在做乘、除法时放乘数或除数,不做乘除法时,随你怎么用。
3、PSW:
程序状态字。
里面放了CPU工作时的状态,如下表。
(1)CY:
加(ADD,ADDC)减进位标志。
8051中的运算器是8位运算器,当超过255,CY被硬件置1。
(2)AC:
半进位标志。
例:
57H+3AH(01010111+00111010)
(3)F0:
用户标志位,由编程人员决定什么时候用,什么时候不用。
(4)RS1、RS0:
工作寄存器组选择位。
为00时Rn为00H—07H,为01时为08H—0FH,为10时为10H—17H,为11时为18H—1FH。
(5)0V:
乘法溢出标志位。
除法中除数为0。
(6)P:
奇偶校验位:
用来表示ALU运算结果中1的个数的奇偶性。
4、DPTR(DPH、DPL):
数据指针,用来访问外部数据存储器中的任一单元,如果不用也可以作为通用寄存器来用。
5、P0、P1、P2、P3:
四个并行输入/输出口的寄存器,对应管脚的输出。
6、SP:
堆栈指针。
在RAM中构造一个区域用来存放数据,规则是“先进后出,后进先出”,称为“堆栈”。
知道第一个数据所在地址单元,如27H,那么第二、三个就在28H、29H了。
单片机中能存放数据的区域有限,堆栈分配的权利给用户(编程者),所以51单片机中堆栈的位置是可变的。
这种变化体现在SP中值的变化,在51机中,开始指针所指的位置是数据存放的前一个位置,如一开始指针指向27H单元,那么第一个数据的位置是28H单元。
第八課寻址方式与指令系统
一、概述
1、指令的格式
机器码格式,也说是数字的形式。
助记符格式,如MOVP1,#0FFH。
2、汇编
手工汇编和机器汇编。
手工汇编就是查表。
用计算机软件来替代手工查表,这就是机器汇编。
二、寻址
MOV一共有28条指令(单片机共111条指令)。
把寻找操作数所在单元的地址称之为寻址。
直接使用数所在单元的地址称为直接寻址。
从工作寄存器中寻找数据,则称之为寄存器寻址。
例:
如果选择工作寄存器组0,则R0就是00H单元,MOVA,00H和MOVA,R0结果都是将00H中的内容送到A中,但执行过程不同,第一条指令需要2个周期,而第二条只要1个周期,第一条指令变成目标码要两个字节(E5H00H),而第二条只要一个字节(E8h)。
MOVR7,#20;
MOVR0,#30H
LOOP:
MOVA,@R0
INCR0
DJNZR7,LOOP
第五句,R7值减1,不等于0则转到标号LOOP处执行MOVA,@R0,相当于MOVA,31H。
到R7值等于0,从30H单元开始将20个数据送入A中。
MOVA,@R0称为间址寻址。
在间址寻址中,只能用Ri存放。
二、指令
1.数据传递类指令
1)以累加器为目的操作数的指令
MOVA,Rn将Rn值送入A,Rn中的值保持不变。
以下类同
MOVA,direct
MOVA,@Ri
MOVA,#data
2)以寄存器Rn为目的操作的指令
MOVRn,A
MOVRn,direct
MOVRn,#data
2、数据传递类指令
(3)以直接地址为目的操作数的指令
MOVdirect,A
MOVdirect,Rn
MOVdirect1,direct2
MOVdirect,@Ri
MOVdirect,#data
(4)以间接地址为目的操作数的指令
MOV@Ri,A
MOV@Ri,direct
MOV@Ri,#data
不传送间接地址数和寄存器数给(@)Rn。
(5)十六位数的传递指令
MOVDPTR,#data16
8051是8位机,这是唯一一条16位立即数传递指令。
其中高8位送入DPH,低8位送入DPL。
例:
MOVDPH,#35H,MOVDPL,#12H相当于执行MOVDPTR,#3512H。
2、累加器A与片外RAM之间的数据传递类指令
MOVXA,@Ri
MOVX@Ri,A
MOVXA,@DPTR
MOVX@DPTR,A
说明:
在51中,与外部存储器RAM打交道的是A累加器。
内部RAM间可以直接进行数据的传递,而外部则不行.在后两条指令中,地址被直接放在DPTR中。
而前两条指令,只提供低8位地址。
因为有时扩展的外部RAM的数量少于或等于256个,提供8位地址就够了。
1.使用时首先将地址送入DPTR或Rn中,然后再用读写命令。
例:
将外部RAM中100H单元中的内容送入外部RAM中200H单元中。
MOVDPTR,#0100H
MOVXA,@DPTR
MOVDPTR,#0200H
MOVX@DPTR,A
程序存储器向累加器A传送指令
MOVCA,@A+DPTR
本指令是将ROM中的数送入A中。
本指令也称为查表指令,常用来查一个已做好在ROM中的表格。
此条指令引出一个新的寻址方法:
变址寻址。
在ROM的一个地址单元中找出数据,将A和DPTR中的数相加,就是要查找的地址。
结果放在A中,因此,本指令执行前后,A中的值不一定相同。
例:
有一个数在R0中,用查表方法确定它的平方值(取值0-5)
MOVDPTR,#TABLE
MOVA,R0
MOVCA,@A+DPTR
TABLE:
DB0,1,4,9,16,25
设R0为2,DPTR则为TABLE,则ROM单元的地址就是TABLE+2,也就是到这个单元中去取数,取到的是4。
可以看到:
标号的真实含义就是地址数值。
它代表了,0,1,4,9,16,25这几个数据在ROM中存放的起点位置。
而LCALLDELAY指令中DELAY则代表了以DELAY为标号的那段程序在ROM中存放的起始地址。
CPU正是通过这个地址找到这段程序的。
可以通过以下的例子再来看一看标号的含义:
MOVDPTR,#100H
MOVA,R0
MOVCA,@A+DPTR
ORG0100H.
DB0,1,4,9,16,25
如果R0值为2,则最终地址为100H+2为102H,到102H单元中找到的是4。
PUSHdirect
POPdirect
第一条称为推入,将direct中的内容送入堆栈中,第二条指令称为弹出,将堆栈中的内容送回到direct中。
推入指令首先将SP中的值加1,然后将direct中的值送进以SP中的值为地址的RAM单元中。
例:
MOVSP,#5FH;
MOVA,#100
MOVB,#20
PUSHACC;SP值加1,为60H,(60H)=(A)=#100.
PUSHB(61H)=(B)=#20
POP指令的执行是,首先将SP中的值作为地址,并将此地址中的数送到POP指令后面的direct中,然后SP减1。
接上面程序:
POPB
POPACC
将SP中的值(61H)作为地址,取61H单元中的数值(20),送到B中,所以执行完后B中的值是20,然后SP减1,SP的值变为60H,然后执行POPACC,将SP中的值(60H)作为地址.从该地址中取数(现在是100),并送到ACC中。
这些指令会把A中的值,B中的值改掉,所以在程序的结束,如果要把A和B中的值恢复原值,那么这些指令就有意义了。
如果不用堆栈,比如在PUSHACC指令处用MOV60H,A,在PUSHB处用指令MOV61H,B,然后用MOVA,60H,MOVB,61H来替代两条POP指令,从结果上看一样,但过程不一样,PUSH和POP指令都是单字节,单周期指令,而MOV指令则是双字节,双周期指令。
堆栈的作用不止于此,需要保存数据时,通常用堆栈的方法来实现。
例:
写出以下程序的运行结果
MOV30H,#12
MOV31H,#23
PUSH30H
PUSH31H
POP30H
POP31H
结果是30H中的值变为23,而31H中的值变为12。
两者进行了数据交换。
使用堆栈时,入栈的顺序和出栈的顺序必须相反,才能保证数据被送回原位。
作业:
在MCS51下执行上面的例程,注意观察内存窗口和堆栈的变化。
第十一課單片機指令四
1.不带进位位的加法指令
ADDA,#DATA;
ADDA,direct;
ADDA,Rn;
ADDA,@Ri;
用途:
将A中的值与其后面的值相加,最终结果回到A中
例:
MOVA,#30H
ADDA,#10H
则执行完本条指令后,A中的值为40H。
2.带进位位的加法指令
1.ADDCA,direct
2.ADDCA,@Ri
3.ADDCA,#data
用途:
将A中的值和其后面的值相加,并且加上进位位C中的值。
例:
1067H+10A0H,先做67H+A0H=107H,107H超过了0FFH,最终保存在A中的是7,而1则到了PSW中的CY位了,CY就相当于是100H。
然后再做10H+10H+CY,结果是21H,所以最终的结果是2107H。
带借位的减法指令
SUBBA,Rn
SUBBA,direct
SUBBA,@Ri
SUBBA,#data
说明:
没有不带借位的减法指令,如果需要做不带位的减法指令(在做第一次相减时),只要将CY清零即可。
乘法指令
MULAB将A和B中的两个8位无符号数相乘,结果用1个16位数来表达,其中高8位放在B中,低8位放在A中。
乘积大于FFFFH(65535)时,OV置1(溢出),否则OV为0,而CY总是0。
例:
(A)=4EH,(B)=5DH,执行指令MULAB后,乘积是1C56H,所以在B是1CH,而A是56H。
除法指令
DIVAB将A中的8位无符号数除以B中的8位无符号数(A/B)。
商放在A中,余数放在B中。
CY和OV都是0。
如果B中的值是0,那么OV=1。
加1指令
1.INCA
2.INCRn
3.INCdirect
4.INC@Ri
5.INCDPTR
将目标中的值加1。
从结果上看INCA和ADDA,#1差不多,但INCA是单字节单周期指令,而ADDA,#1是双字节双周期指令,而且INCA不会影响PSW位,如(A)=0FFH,INCA后(A)=00H,CY不变。
如果是ADDA,#1,则CY是1。
因此加1指令并不适合做加法,它主要是用来做计数、地址增加等用途。
另外,加法类指令都是以A为核心的;运算结果必须放在A中,而加1类指令的对象则广泛得多,可以是寄存器、内存地址、间址寻址的地址等等。
减1指令
DECA
DECRn
DECdirect
DEC@Ri
与加1指令类似,就不多说了。
综合练习:
MOVA,#12H
MOVR0,#24H
MOV21H,#56H
ADDA,#12H
MOVDPTR,#4316H
ADDA,DPH
ADDA,R0
CLRC
SUBBA,DPL
SUBBA,#25H
INCA
SETBC
ADDCA,21H
INCR0
SUBBA,R0
MOV24H,#16H
CLRC
ADDA,@R0
第十二課邏輯運算指令
三、逻辑运算类指令:
1.对累加器A的逻辑操作:
CLRA;将A中的值清0,单周期单字节指令,与MOVA,#00H效果相同。
CPLA;将A中的值按位取反
2.将A中的值逻辑左移
RLA;将A中的值进行逻辑循环左移
RLCA;将A中的值加上进位位进行逻辑循环左移
RRA;将A中的值进行逻辑循环右移
RRCA;将A中的值加上进位位进行逻辑循环右移
SWAPA;将A中的值高、低4位交换。
RLA是将(A)中的值的第7位送到第0位,第0位送1位,依次类推。
例:
A中的值为68H,执行RLA。
68H化为二进制为01101000,按上图进行移动。
01101000化为11010000,即D0H。
RLCA,是将(A)中的值带上进位位(C)进行移位。
例:
A中的值为68H,C中的值为1,则执行RLCA
101101000后,结果是011010001,也就是C进位位的值变成了0,而(A)则变成了D1H。
SWAPA,例:
(A)=39H,则执行SWAPA之后,A中的值就是93H。
如果是这样的:
(A)=39,执行SWAPA之后,是71H,即113。
练习,已知(A)=39H,执行下列指令后写出每步的结果
CPLA
RLA
CLRC
RRCA
SETBC
RLCA;SWAPA
实验五:
ORG0000H
LJMPSTART
ORG30H
START:
MOVSP,#5FH
MOVA,#80H
LOOP:
MOVP1,A
RLA
LCALLDELAY
LJMPLOOP
delay:
MOVSP,#5FH,初始化堆栈,在本程序中有无此句无关紧要。
MOVP1,A。
P1口的值是80H,也就是10000000B,P1.7接的LED不亮,而其它的LED亮,RLA,RLA是将A中的值进行左移,是01H,也就是00000001B,这样,接在P1.0上的LED不亮,而其它的都亮,调用延时程序,然后又转到LOOP处(LJMPLOOP)。
依次循环,就形成了“暗点流动”现象。
1.如何实现亮点流动?
2.如何改变流动的方向?
答案:
1、将A中的初始值改为7FH即可。
2、将RLA改为RRA即可。
第十三課邏輯與指令
ANLA,Rn;A与Rn中的值按位'与',结果送入A中
ANLA,direct;A与direct中的值按位'与',结果送入A中
ANLA,@Ri;A与间址寻址单元@Ri中的值按位'与',结果送入A中
ANLA,#data;A与立即数data按位‘与’,结果送入A中
ANLdirect,A;direct中值与A中的值按位'与',结果送入direct中
ANLdirect,#data;direct中的值与立即数data按位‘与’,结果送入direct中。
或指令:
ORLA,Rn;A和Rn中的值按位‘或’,结果送入A中
ORLA,direct;A和direct中的值按位‘或’,结果送入A中
ORLA,#data;A和立即数data按位‘或’,结果送入A中
ORLA,@Ri;A和与间址寻址单元@Ri中的值按位‘或’,结果送入A中
ORLdirect,A;direct中值和A中的值按位‘或’,结果送入direct中
ORLdirect,#data;direct中的值和立即数data按位'或',结果送入direct中。
异或指令:
XRLA,Rn;A和Rn中的值按位‘异或’,结果送入A中
XRLA,direct;A和direct中的值按位‘异或’,结果送入A中
XRLA,@Ri;A和间址寻址单元@Ri中的值按位'异或',结果送入A中
XRLA,#data;A和立即数data按位'异或',结果送入A中
XRLdirect,A;direct中值和A中的值按位‘异或’,结果送入direct中
XRLdirect,#data;direct中的值和立即数data按位'异或',结果送入direct中。
四、控制转移类指令
1.无条件转移类指令
短转移类指令AJMPaddr11
长转移类指令LJMPaddr16
相对转移指令SJMPrel
他们的区别在于跳转范围不一样。
LJMP能跳64K。
AJMP最多跳2K,而SJMP最多跳256。
原则上,所有用SJMP或AJMP的地方都可以用LJMP来替代。
AJMP是双字节指令,占用存储器(ROM)的两个单元。
LJMP是三字节指令,即占用存储器(ROM)的三个单元。
间接转移指令JMP@A+DPTR
1.这条指令的用途也是跳转,转到什么地方去不由标号简单地决定。
MOVDPTR,#TAB;将TAB所代表的地址送入DPTR
MOVA,R0;从R0中取数(详见下面说明)
MOVB,#2
MULA,B;A
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 原理 入门教程