单片机精解.docx
《单片机精解.docx》由会员分享,可在线阅读,更多相关《单片机精解.docx(16页珍藏版)》请在冰豆网上搜索。
单片机精解
1.把编译后的指令下载到单片机后,这条指令一定在单片机内一个叫程序存储器的地方,英文名称ROM.ReadOnlyMemory叫只读存储器
2.存储器的工作原理(存放的是电平的高或低的状态)
每个单元上有根线与译码器相连,要把数据放进哪个单元就通过译码器给哪个单元发一个信号,由译码器通过这根线把相应的开关打开.
3与D7-D0相连的还有一个控制器,写入/读出控制线,当向存储器写入数据时必须先把这个开关切换到写入端,而要读出数据时就得先把开关切换到读出端,片选端则是为了区分不同的存储器设置的.
4.用来传递数据的8根线并不是专用的而是很多器件大家共用的称之为数据总线.16根地址线51单片机共有16根地址线称之为地址总线
3.ROM是只读存储器,所谓只读只可以从里面读出数据而不能写进去,它类似于书本发到我们手里之后,我们只能读里面的内容不可以随意更改书本上的内容,ROM是用来存放程序的地方,下载到单片机的指令就放在这个地方,困惑:
既然ROM是只读存储器那么指令又是如何进入其中的呢,其实所谓的只读只是针对工作情况下而言,制造这块芯片的时候只要让存储器满足一定的条件就能把数据预先写进去。
4.FlashROM是一种快速存储式只读存储器,这种程序存储器的特点是既可以电擦写而且掉电后程序还能保存编程寿命可以达到一千次左右。
5随机存取存储器也叫内存,缩写为RAM(RandomAccessMemory),它是一种既可以随时改写也可以随时读出里面数据的存储器类似于上课用的黑板可以随时写东西上去也可以随时擦掉重写.
6为程序段起的一个名称专业术语叫标号。
程序的最后一条是END它不是指令它只是告诉编译软件整个程序到此结束了,它叫伪指令。
为了得到最终结果而暂时记下来的中间结果,单片机中做运算把中间结果放在ROM只读存储器中不行!
因为ROM是用来放程序的它只能写进去不能读出来,再次提醒一下这只是相对而已,所以只能放在单片机的另一个区域—RAM中即随机存取存储器中R7就是RAM区域中划出的一部分。
7单片机执行指令的过程就是顺序地从ROM程序存储器中取出指令一条一条的顺序执行,然后进行一系列的微操作控制来完成各种指定的动作,它在协调内部的各种动作时必须要有一定的顺序,换句话说就是这一系列微操作控制信号在时间上要有一个严格的先后次序,这种次序就是单片机的时序。
8计算机每访问一次存储器的时间我们把它称为一个机器周期,它是一个时间基准就象生活中使用的秒一样,计算机中一个机器周期包括12个振荡周期,
9P开头的管脚都可以用作输入输出口,在89C51中这32个为并行口,它们实际上就是特殊功能存储器SFR,P0P1P2P3它们都是双向通道即既可以作为输出口也可以作为输入口,作输出时数据可以锁存,作输入时数据可以缓冲
10I/O口作为输入口时有两种工作方式:
即读端口,读引脚。
读端口时实际上并不从外部读入数据,而是把端口锁存器的内容读入到内部总线,经过某种运算或变换后再写回到端口锁存器。
读引脚时也就是把端口作为外部输入线时,首先要通过外部指令把端口锁存器置1,然后再实行读引脚操作,否则就可能读入出错。
看上面的图如果不对端口置1,端口锁存器原来的状态有可能为0,Q端为0,Q^为1加到场效应管栅极的信号为1,该场效应管就导通对地呈现低阻抗。
此时即使引脚上输入的信号为1,也会因端口的低阻抗而使信号变低,使得外加的1信号读入后不一定是1。
若先执行置1操作则可以使场效应管截止,引脚信号直接加到三态缓冲器中实现正确的读入.由于在输入操作时还必须附加一个准备动作,所以这类I/O口被称为准双向口89C51的P0P1P2P3口作为输入时都是准双向口。
11P0口从图中可以看到P0口的内部有一个2选1的选择器,它受内部信号的控制,如果在图中的位置则处在I/O口工作方式此时相当于一个准双向口输入时,须先将口置1每根口线可以独立定义为输入或输出,但是须在口线上加上拉电阻。
如果将开关往另一个方向则就是另一个功能—作为地址/数据复用总线用,此时不能逐位定义为输入/输出。
它有两种用法当作数据总线用时输入8位数据,而当作地址总线用时则输出低8位地址,再强调一点当P0口作为地址/数据复用总线用之后,就再也不能作I/O口使用。
12P1口只能作为I/O口使用,但它的内部有一个上拉电阻,所以连接外围负载时不需要外接上拉电阻,这一点P1P2P3都一样务必请大家记住。
13P2口作为I/O口线用时与P0口一样当内部开关向另一个方向时,即作地址输出时可以输出程序存储器或外部数据存储器的高8位地址,并与P0口输出的低地址一起构成16位的地址线,(注意和数据总线的区别,数据总线是8位的,51单片机是8位数据总线16位地址总线,16位的地址可以寻址64K的程序存储器或外部数据存储器)
14P3口作为I/O口线用时同其他的端口相同也是准双向口,不同的是P3口的每一位都有另一种功能也叫第二功能各位的功能如下
第二功能
注释
P3..0
RXD
串行口输入
P3.1
TXD
串行口输出
P3.2
INTO
外部中断0
P3.3
INT1
外部中断1
P3.4
T0
计数器0计数输入
P3.5
T1
计数器1计数输入
P3.6
WR
外部RAM写入选通信号
P3.7
RD
外部RAM读出选通信号
15单片机的一个I/O口只能灌入20mA的电流不足以驱动一些功率开关,稍大一点的机械继电器。
应该采用必要的扩展电路如何来实现单片机与机械继电器的接口,通常采用下面的接法如图,为了防止前向通道信号的干扰常采用一些光电隔离器件:
光电耦合器4N25PC814等,当单片机的P1.0脚输出为低电平时光藕受电导通Q1饱和开,通继电器吸合负载电路接通。
为了防止电压间的互相干扰继电器的工作电压VDD与单片机的工作电压VCC不要使用同一个电源接地端,也不要连在一起,即所谓的模拟地与数字地分开,驱动管的电流要大于继电器的工作电流。
固态继电器是一种无触点的电子继电器它的输入端只要很小的控制电流,可以与单片机的I/O口直接连接.
16十六进制格式表示一个立即数时,如果高位的数字为A-F时高位前面要加上个0.
单片机有两种存储器即只读存储器ROM和随机存储器RAM,它们都被规定了各自的地址,称做寻址空间.
1789C51的内部有4K的FLASHROM空间其寻址范围为000H-FFFH15162*15161*15160=0-4095这4K的ROM空间就是用来存放为单片机编写的,程序用的单片机执行指令时就是一条一条顺序地从ROM中寻找指令进行执行.
1889C51内部共有128个字节的RAM空间其寻址范围为00H-7FH(一个字节对应一个寄存器,128个字节需要128个寄存器,需要128个地址)
它被分成三个区域第一个区域00H-1FH安排了4组工作寄存器,每组用8个字节共32个字节,分别为R0-R7。
当然在同一时刻只能用其中的一组工作寄存器,怎么来控制它就要用到程序状态字PWS中的RS0RS1两位.第二个区域20H-2FH共16个字节除了可以作为一般的RAM单元读写外,还可以对每个字节的每一位(即每一个抽屉中的每一个小盒子进行操作)并且对这些位都规定了固定的位地址,从20H单元的第0位开始到2FH单元的第7位结束共128位,第三个区域就是一般的RAM单元地址为30H-7FH共80个字节。
89C51单片机的内部还有一个部分从80H-FFH是专门用于特殊功能寄存器SFR的89C51共用21个特殊功能寄存器
19几个常用的特殊功能寄存器
1.累加器ACC
通常用A表示,单片机在做运算时它的中间结果需要放在某个地方,这个地方就是累加器,它的名字很特殊功能也很特殊,几乎所有的运算类指令都离不开它
2.寄存器B
B寄存器在做乘法时用来存放一个乘数,在做除法时用来存放一个除数,不做乘除法时随你怎么用
3.程序状态字PSW
里面放了CPU工作时的很多状态,知道它就可以了解CPU当前的工作状态,它有点象平时看书用的目录.它是一个8位的寄存器用到了其中的7位,
4DPTR(DPHDPL)数据指针
数据指针是一个16位的寄存器,用它来访问外部RAM也可以访问外部ROM中的表格
5SP堆栈指针
可以在内部RAM中构造出,注意是构造这样一个区域,这个区域存放数据:
先进后出后进先出,符合堆栈中的原则.为什么要有这样一个区域呢!
存储器本身不也同样可以存放数据吗!
是的,知道了存储器地址确实可以读出它里面的内容,但如果我们要读出的是一批数据,每一个数据都要给出一个地址,就会很麻烦为了简化操作就可以利用堆栈的存放方法来读取数据.
MCS-51单片机中,指针开始所指的位置并非就是数据存放的实际位置而是数据存放的前一个位置,例如一开始堆栈指针是指向27H单元的,那么第一个数据的存放位置就在28H单元中,而不是27H单元中这一点请注意!
6电源控制寄存器PCON
单片机在以电池供电的系统中有时为了节电,单片机就有多种的工作方式其中一种就是低功耗方式,PCON寄存器就是用来控制单片机进入低功耗方式的.
20复位方式
为什么要复位
单片机执行程序时总是从地址0000H开始的所以在进入系统时必须对CPU进行复位也叫初始化,另外由于程序运行中的错误或操作失误使系统处于死锁状态时,为了摆脱这种状态也需要进行复位.
单片机复位的方法:
只要在RST引脚9脚上加一个持续时间为24个振荡周期即两个机器周期的高电平..
复位操作有上电自动复位按键复位和外部脉冲复位3种方法
21编程和加密方式
单片机的编程与加密是由专门的设备来完成的这种设备,称为编程器或烧录器类似的产品有很多功能也不尽相同.
22寻找操作数所在单元地址的过程称之为寻址
MOVA00H和MOVAR0不就没什么区别了吗?
为什么要加以区分呢?
的确这两条指令执行的结果是完全相同的都是将00H单元中的内容送到A中去,但是执行的过程不同执行第1条指令需要2个周期而执行第2条则只需要1个周期,第1条指令变成最终的目标码要两个字节E5H00H而第2条则只要一个字节E8h.
不就差了一个周期吗为什么怎么斤斤计较如果是12M晶振的话也就1个微秒
23为寄存器间址寻址注意☺在寄存器间址寻址中只能用R0或R1来存放等待寻找的数据当然还可以用DPTR或PC访问外部存储器的数据只不过在这里我们讨论的是寄存器间接寻址所以这两个就不在讨论范围之内
除了以上几种寻址方法外单片机还有变址寻址相对寻址和位寻址共七种寻址方式.
24寻址
25
1以累加器为目的操作数的指令
2以寄存器Rn为目的操作数的指令
3以直接地址为目的操作数的指令
5十六位数的传递指令
MOVDPTR#data16
26DB—定义字节伪指令
DW—定义字伪指令
DS—保留空间伪指令
27
将SP+1即变为61H然后将B中的值送入到61H单元中即执行完本条指令后61H单元中的值变为20
28ADDADDCSUBBMULABDIVABINCDECDAACLRACPLA
RLRLCRRRRCSWAPANLORLXRL异或
29控制转移类指令共有17条分为无条件转移指令条件转移指令和返回及调用指令三大类
30无条件绝对转移指令AJMPaddr11
无条件长转移指令LJMPaddr16
无条件相对转移指令SJMPrel
add11add16rel其中add11和add16表示外部ROM的16位和11位地址前面我们已经讲过单片机的外部ROM可以扩展到64Kadd16就表示64K程序存储器的任何地址换句话说LJMP指令可以跳转到程序的任何地方而add11则表示下一条指令的2K页面也就是说SJMP指令只能跳转到程序的2K范围之内rel表示8位的偏移量其范围是下一条指令第一字节的前128到后127个字节(即-128-+127).
31无条件间接转移指令JMP@A+DPTR
条件转移类指令就是在满足一定的条件后进行相对转移
累加器为0转移指令JZrel
累加器非0转移指令JNZrel
比较转移指令
ACJNEA#data,rel
BCJNEA,direct,rel
CCJNERn,#data,rel
DCJNE@Ri,#data,rel
循环转移指令
ADJNZRn,rel
BDJNZdirect,rel
32调用指令
长调用指令LCALLaddr16
短调用指令ACALLaddr11
上面两条指令都是在主程序中调用子程序,作为初学者我们可以不必加以区分也就是说可以用LCALL指令代替ACALL
33返回指令
A子程序返回RET
B中断返回RETI
判CY条件转移指令
AJCrel
BJNCrel
34判位变量转移指令
AJBbit,rel
BJNBbit,rel
指令说明第1条指令是如果指定的bit位中的值是1则转移否则就顺序执行转移到什么地方
判位变量转移并将该位清零JBCbitrel,指令说明这条指令同JBbitrel的区别在于判1转移的同时清除该位