单片机新结

也算是用过一段时间的单片机,但是当初也就是熟悉了一些模块的使用,对于单片机的工作原理并不是很了解。

所以最后也难以深入学习,充其量就是熟悉了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来写出逼近精确的延时代码的。

 

转载于:https://www.cnblogs.com/chenwu128/archive/2012/01/06/2315165.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值