单片机新结
也算是用过一段时间的单片机,但是当初也就是熟悉了一些模块的使用,对于单片机的工作原理并不是很了解。
所以最后也难以深入学习,充其量就是熟悉了C51的编程,要想了解一个MCU的工作原理,了解汇编是很有必要的。
而在编程过程中,最重要的就是时序!无论是进行存储器的读写,还是进行通信,只有时序匹配了,才可以写出
高效的少bug的代码。而这些恰恰是需要掌握最基础的东西才能达到的。于是重新学了下MCS51,有了一些新的理解。
指令的属性:指令长度和执行时间。
指令长度就是存储在ROM中所占的ROM空间,编译器把程序汇编后,会给出这个程序的大小,这个值就是存储
这个程序要占用的ROM空间(当然是以二进制的形式存储的)。 而与ROM关系密切的寄存器就是PC,
PC虽然是用来指向ROM地址的。虽然它的作用是用来指向下一条指令,但是它的值并不总是加一指向下条指令的,
PC的增量是与指令长度有关的。首先看下3字节指令MOV 30H,#20H 在ROM中存储的。
显然,这条指令占3字节的空间,而执行下条指令时PC为PC+3。
要注意的是,最小指令周期是等于一个机器周期的,而不是一个时钟周期,单周期指令NOP执行时间为一个机器周期。
当然,每条指令的周期是确定的。读指令操作和ALE信号有关,在ALE有效时才执行一次读指令操作。
ALE(address locked enable)信号在不是用来所存外部RAM地址时,它的周期是振荡时钟的6分频。
(如果是单指令双周期指令,那么4次取值操作只有第一次是有效的)
寄存器(指针)SP、DPTR和PC
PC的作用就是ROM的地址计数器。
SP总是指向堆栈(应该是栈吧,堆和栈是两个不同概念的RAM)的栈顶的,而堆栈在内部RAM中,所以SP是RAM的地址计数器。
DPTR可以指向外部RAM(写操作),也可以指向ROM(查表指令)。
在写单片机控制单个模块的代码时,并不困难。难的是如何把多个模块架构在一起,可以协同工作,而无模块当机现象。
其实,当做一个单片机控制系统时,写代码就要从操作系统的层次来设计程序的框架,即裸奔时的程序框架。
另外,经常用到延时程序。但是,C代码是很难做到精确延时的,因为对于不同的延时代码写法,编译器的反汇编代码总会不同。
这时就要牺牲定时器或者嵌入汇编来做到精确延时。但是对于不懂汇编又不想牺牲资源的来说,
还是可以用C51来写出逼近精确的延时代码的。