找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

单片机学习中常见的问题和误区

[复制链接]
孤鸿 发表于 2012-2-9 00:17:27 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
1引言
        单片机www.zxhmcu.com是电气信息类专业的-fq重要专业基础课,在电子信息技术高速发展,应用日趋广泛和深入的今天,单片机开发 http://www.zxhmcu.com/topic-xiangmu.html技术已在仪器仪表、过程控制、数据采集、信号处理,家用电器、机电一体化等领域得到广泛的应用。学好单片机对学生掌握先进的专业技术知识、获得实用的职业技能、增强就业竞争力都具有十分重要的意义。然而,在学习过程中由于缺乏实践经验,有些难点教材中介绍不清,因此在单片机学习www.zxhmcu.com过程中遇到许多问题,对一些知识把握不准,也不可避免地形成一些误解。根据本人在教学及实践中的探讨和摸索,总结出这些在学习过程中常见的问题和误区并给予分析和纠正。
2.单片机学习中的常见问题和误区
2.1特殊功能寄存器的直接寻址方式
        大家都知道在MCS一51系列单片机内部有一个256B的片内数据存储器的地址空间,数据存储器用于存放中间运算结果、数据暂存和缓冲、标志位等,其中低128B(既00H~7FH)的地址为片内RAM,对其访问可采用直接寻址和间接寻址的方式。高128B地址区域(即80H~FFH)为专用寄存器区,只能采用直接寻址方式对其寻址。图1表示的80C51的内部数据存储器图。那么对高128B的区域若进行间接寻址会怎么样呢?这是很多学习者在学习的过程中会产生的疑问。很多人也都去编程序测试过,如
MOV R0.@90H
MOV @R0,#55H
        程序执行结果发现,55H这个值传给了90H内部的存储单元中,而没有赋给P1口(90H),按图1表示的80C51的内部数据存储器原理,应该是P1口所在的单元就是90H单元,这两个单元应该是一中中断源也有自然优先级,自然优先级从高到低的中断源的优先顺序是:外部中断0,定时器TO,外部中断1,定时器T1,串行口中断。外部中断0级别最高,串行口中断级别最低。很多书上都是这样的:“一个正在执行的低优先级中断服务程序可以被高优先级的中断源所中断”。那么这句话里面是否包括一个正在执行的同级的低优先级中断服务程序也可以被同级的高优先级的中断源所中断呢?
经过测试才知道,中断的原则应该是:一个正在执行的低优先级中断服务程序可以被高优先级的中断源所中断,而同级的(不论是在同组中的自然优先级有多高)或低优先级的中断源不能中断正在执行的同级(不论是在同组中的自然优先级有多低)或高级的中断服务程序,同组中只有在几个中断源同时向CPU申请中断时,CPU才根据自然优先级的高低先后响应中断。
2 2循环移位指令
        在许多教材中,介绍到循环左移和循环右移指令时,往往有这样一句话:“左移相当于乘2操作,右移相当于除以2操作”。那么这句话是否绝对正确呢?设A=00000001,则执行RLA后,结果A=O0000010,的确实现了乘2操作。但如果A=10000000呢?执行RL A后,结果A=0o0¨00¨0O1,可见不能实现乘2操作。那么原因是什么呢?仔细观察会发现,表面原因在于A中内容最高位是1不是O,而本质原因在于当A=10000000时,A中内容乘2后为256,而A中能存放的最大数是255。大家可以再多举一些例子,就会得到一个规律:要想用循环左移实现乘2操作,A中内容是最高位至少要有一个O。而且,A中内容最左端有几个O,则它就可以实现几次乘2的操作,例如A=00110000,则执行RLA一次A=01100000,再执行一次RLA后,A=11000000,实现两次乘2的操作,相当于乘4操作,再执行就不行了。因而部分教材中不加限制的说RL A可以实现A中内容乘2操作显然是不妥的,必须加上一定的条件才行。对于右移同样可以分析出类似的结论, 设A=10000000,则执行RR A后,A=01000000,可见也的确实现了除以2操作。但同样,如果A=00000001呢,则执行RR A后,A=IO000000,当然不是除以2后的结果,因为它除以2以后根本就不是个整数。所以,说循环右移相当于除以2操作也必须加有条件的,大家可以举些例子分析一下就会得到相应的规律:要想用循环右移实现除以2的操作,A中内容的最低位至少要有一个O。事实上,A中内容最右端有几个O,则它就可以实现几次除2的操作。
        对于带进位的循环左(右)移,道理相同,因为即使考虑了进位cv,甚至即使cv=O再移位,也会出现同样的问题,因为A中只能存’放8位。如A=10000000, 且Cy=0, 那么执行RL A以后,A=00000000、Cy=1,可见A中内容为O了,显然A中内容不是乘2以后的结果。仔细分析会发现,解决上述问题的方法是在结果中将cy中的内容考虑进去,也就是说,将cy的A中内容合并在一起共9位才是真正的结果。总之,不加条件的说”左移相当于乘2操作,右移相当于除以2操作”是值得讨论的,在实际使用中必须注意。
2.3关于相对寻址方式的例子
        一般单片机教材上,叙述到寻址方式中的相对寻址方式时,往往喜欢举出这样一类例子,如:1000H:SJMP 30H 然后分析说Pc转移的目的地址是l000H+2+30H=lo32H,以此来说明相对寻址的寻址特点。而在实际中,将SJMP 30H指令放人汇编程序中,且该指令的存放地址为1000H,在汇编环境下编译调试时,结果并不像教材中分析的那样,程序跳到1032H去执行,而是调试出错!经过分析发现,如果要得到教材中的结果,必须有一个条件:那就是30H就是rel,这好像也正好符号指令格式:SJMP rel。但实际上,在汇编环境中,是不直接写出相对偏移量的,而是写出目的地
址,相对偏移量由编译时自动计算出。所以,如果在汇编语言中写出SJMP 30H,则此处的30H实际上就被认为是地址,这样在执行本条指令时,只要跳转范围在一128~+127之内,即可直接跳转到相应的地址30H去执行,具体的偏移量是多少是反映在机器语言中的。当然由于SJMP这条指令的特点,如果跳转范围超过允许,则调试时会出错,如上例所示。例如有这么一段程序:
0RG 0030H
0030H:MOV A,#10H ;机器码74 l0
0RG 0036H
0036H:SJMP 30H ;机器码8O F8
END ’
        在执行到SJMP 30H时,会直接跳转到此为0030H去执行,对照右边的机器语言可以发现,正好符合:PC目的地址=PC当前值+rel-0038+(一8)=0030H,其中F8为”一8”的补码形式。在实际单片机开发中,我们所编写的程序不是机器语言形式,而是汇编语言或其它如C语言一类的语言,然后通过软件编译成目标机器语言,再写入到单片机的ROM中。所以,虽然教材中这样举例也许是为了方便讲解相对寻址这个概令,但对于学生以后实际的编程开发,必然带来不良的误导!需要指出的是,在日常的编程中,我们一般不直接写地址,而是写成标号的形式,如:SJMPLOOP,此时的标号LOOP实际上就相当于地址,在执行到这条指令时,程序会跳转到LOOP标号的位置去执行程序。在控制转移类指令中,凡是指令中带有“rel”的均属于以上所讨论的范围。
3.结束语
在单片机的学习中往往会由于对一些概念理解不清楚,或由于缺乏实践经验,学习者会产生种种疑问和困惑,甚至形成了一些错误的认识。这些问题主要集中在单片机内的存储器、片内外数据传送、中断优先级和相对寻址方式方面,本文对这些问题进行归纳总结,使学习者对单片机教程http://www.zxhmcu.com/topic-jiaocheng.html的一些问题有了全面的认识。通过对容易模糊不清的概念和知识进行辨别、解析,使学习者澄清以往错误的认识,更好地学习和掌握单片机知识。

本文来源:上海周兴华单片机培训中心网站,文章地址:http://www.zxhmcu.com/article-237-1.html
a2570422711 发表于 2012-2-13 10:17:09 | 显示全部楼层
   在执行到SJMP 30H时,会直接跳转到此为0030H去执行,对照右边的机器语言可以发现,正好符合:PC目的地址=PC当前值+rel-0038+(一8)=0030H,其中F8为”一8”的补码形式。在实际单片机开发中,我们所编写的程序不是机器语言形式,而是汇编语言或其它
- 本文内容摘录自:MCU资讯论坛(http://www.mcuzx.net/) 详细文章请参考:http://www.mcuzx.net/forum.php?mod=viewthread&tid=1646&
最爱为什么 发表于 2012-2-15 20:32:55 | 显示全部楼层
辛苦了{:e163:}{:e163:}{:e163:}
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-23 10:57 , Processed in 0.055438 second(s), 12 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表