51单片机汇编教程下载程序时用汇编好还是用C好?

51单片机汇编和C语言到底有什么不同?
汇编和C语言对51进行编程有什么不同么?会不会有写只能用汇编才能实现呢?本人学习了C语言对51的编程,要学汇编怎样开始呢?完全不知道汇编是个什么鬼,看了几本书表示什么也不懂!
汇编写点小程序还行,c更好理解,更好调试
已有帐号?
无法登录?
社交帐号登录[求助]我刚学单片机,是先学汇编好还是先学C语言好啊? - 初学园地 -
51单片机学习论坛
- Powered by Discuz!
[求助]我刚学单片机,是先学汇编好还是先学C语言好啊?
单片机小学生
[求助]我刚学单片机,是先学汇编好还是先学C语言好啊?
如题,是先学汇编好还是先学C语言好啊?& .[em09][em09][em09]
单片机高中生
汇编,再转C。因为汇编在底层,你好了解单片机各个引脚功能,这样以后学其他单片机也会触类旁通
单片机小学生
先学习汇编。
单片机小学生
我是业余的!单片机纯属爱好,用不到编大的程序,就学51汇编了,C的我曾经试过,感觉生成代码量太大,不能装入2051里面(可能我水平太差,不会优化代码吧!)汇编编起来代码量小多了,如果用到数学运算就找些汇编库子程序调用,也还可以应付小制作的。如果是想成为专业人士,还是要学好C的,他们的设计一般会遇到大系统,而且不一定是一种类型的单片机,C与硬件无关,不同硬件编译就行了,汇编语言与硬件密切相关,不好程序移植的。
单片机高中生
其实我也很迷惑,以前学汇编感觉很难,最近看了下C的,感觉要容易些
单片机高中生
汇编肯定要懂的不过c写程序要快,主要是因为不同类型单片机之间c可以很容易的移植用新学的单片机开发产品的周期要短一些
单片机初中生
单片机初中生
个人感觉也是先学汇编
单片机高中生
先汇编,再C
我的淘宝店:/(出售51学习板带无线模块,代做课程设计)
提供源程序(内有详细中文注释),电路图,在线提供技术支持51单片机下载程序时用汇编好还是用C好?_百度知道
51单片机下载程序时用汇编好还是用C好?
发展的方向是哪方面的也具体说下、
我有更好的答案
不仅限于单片机,但汇编也要懂发展方向自然是c好,毕竟汇编是机器语言,只不过c的运用比较广泛而已
你要是觉得这两种语言学了其中一种就等于不能学另一种那就错了。应该两种都学。汇编可以对硬件有更细致入微的控制。c的开发效率高,可读性好。学习 c和汇编混合编程吧,先学好这两门语言,入门以后就可以看看文库上的“ c和汇编混合编程”。这种方法兼顾了两种语言的优点,既可以有较快的开发效率,又有较快的运行效率。不过嘛,得到多少就要付出多少,学起来也难。
各有各的优势.
其他类似问题
为您推荐:
51单片机的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Qualcomm Technologies产品市场高级总监张云表示,无论骁龙200系列还是800系列,Qu...
智能汽车会刊
如今,物联网浪潮已然席卷至汽车电子产业,发动机控制系统、底盘...
目前国内已经多有多家主机厂正在开发搭载48V系统的混合动力车辆,预计最早从...
第三届·无线通信技术研讨会
2015o第二届中国IoT大会
ETFo智能硬件开发技术培训会
ETFo第三届&消费电子电池管理系统技术论坛
ETFo智能安防技术论坛
成都&智能工业创新应用论坛
移入鼠标可放大二维码
使用Keil C进行51单片机延时程序编写的几点心得
来源:本站整理
作者:佚名日 14:46
[导读] 应用单片机的时候,经常会遇到需要短时间延时的情况。需要的延时时间很短,一般都是几十到几百微妙(us)。有时候还需要很高的精度,比如用单片机驱动 DS18B20的时候,误差容许的范围在十几us以内,不然很容易出错。
  应用单片机的时候,经常会遇到需要短时间延时的情况。需要的延时时间很短,一般都是几十到几百微妙(us)。有时候还需要很高的精度,比如用单片机驱动 DS18B20的时候,误差容许的范围在十几us以内,不然很容易出错。这种情况下,用计时器往往有点小题大做。而在极端的情况下,计时器甚至已经全部派上了别的用途。这时就需要我们另想别的办法了。
  以前用汇编语言写单片机程序的时候,这个问题还是相对容易解决的。比如用的是12MHz晶振的51,打算延时20us,只要用下面的代码,就可以满足一般的需要:
  mov   r0, #09h
  loop:  djnz  r0, loop
  51 单片机的指令周期是晶振频率的1/12,也就是1us一个周期。mov r0, #09h需要2个极其周期,djnz也需要2个极其周期。那么存在r0里的数就是(20-2)/2。用这种方法,可以非常方便的实现256us以下时间的延时。如果需要更长时间,可以使用两层嵌套。而且精度可以达到2us,一般来说,这已经足够了。
  现在,应用更广泛的毫无疑问是Keil的C编译器。相对汇编来说,C固然有很多优点,比如程序易维护,便于理解,适合大的项目。但缺点(我觉得这是C的唯一一个缺点了)就是实时性没有保证,无法预测代码执行的指令周期。因而在实时性要求高的场合,还需要汇编和C的联合应用。但是是不是这样一个延时程序,也需要用汇编来实现呢?为了找到这个答案,我做了一个实验。
  用C语言实现延时程序,首先想到的就是C常用的循环语句。下面这段代码是我经常在网上看到的:
  void delay2(unsigned char i)
  for(; i != 0; i--);
  到底这段代码能达到多高的精度呢?为了直接衡量这段代码的效果,我把 Keil C 根据这段代码产生的汇编代码找了出来:
  ; FUNCTION _delay2 (BEGIN)
  ; SOURCE LINE # 18
  ;---- Variable &i& assigned to Register &R7& ----
  ; SOURCE LINE # 19
  ; SOURCE LINE # 20
  0000     ?C0007:
  0000 EF        MOV   A,R7
         JZ   ?C0010
  0003 1F        DEC   R7
  0004 80FA       SJMP  ?C0007
  ; SOURCE LINE # 21
  0006     ?C0010:
  0006 22        RET
  ; FUNCTION _delay2 (END)
  真是不看不知道~~~一看才知道这个延时程序是多么的不准点~~~光看主要的那四条语句,就需要6个机器周期。也就是说,它的精度顶多也就是6us而已,这还没算上一条 lcall 和一条 ret。如果我们把调用函数时赋的i值根延时长度列一个表的话,就是:
  i  delay time/us
  0  6
  1  12
  2  18
  因为函数的调用需要2个时钟周期的lcall,所以delay time比从函数代码的执行时间多2。顺便提一下,有的朋友写的是这样的代码:
  void delay2(unsigned char i)
  for(a = a != 0; a--);
  可能有人认为这会生成更长的汇编代码来,但是事实证明:
  ; FUNCTION _delay2 (BEGIN)
  ; SOURCE LINE # 18
  ;---- Variable &i& assigned to Register &R7& ----
  ; SOURCE LINE # 19
  ; SOURCE LINE # 21
  ;---- Variable &a& assigned to Register &R7& ----
  0000     ?C0007:
  0000 EF        MOV   A,R7
         JZ   ?C0010
  0003 1F        DEC   R7
  0004 80FA       SJMP  ?C0007
  ; SOURCE LINE # 22
  0006     ?C0010:
  0006 22        RET
  ; FUNCTION _delay2 (END)
  其生成的代码是一样的。不过这的确不是什么好的习惯。因为这里实在没有必要再引入多余的变量。我们继续讨论正题。有的朋友为了得当更长的延时,甚至用了这样的代码:
  void delay2(unsigned long i)
  for(; i != 0; i--);
  这段代码产生的汇编代码是什么样子的?其实不用想也知道它是如何恐怖的$#^%&%$.。..。.让我们看一看:
  ; FUNCTION _delay2 (BEGIN)
  ; SOURCE LINE # 18
      R   MOV   i+03H,R7
      R   MOV   i+02H,R6
      R   MOV   i+01H,R5
      R   MOV   i,R4
  ; SOURCE LINE # 19
  ; SOURCE LINE # 20
  0008     ?C0007:
  0008 E4        CLR   A
  0009 FF        MOV   R7,A
  000A FE        MOV   R6,A
  000B FD        MOV   R5,A
  000C FC        MOV   R4,A
  000D AB00    R   MOV   R3,i+03H
  000F AA00    R   MOV   R2,i+02H
      R   MOV   R1,i+01H
      R   MOV   R0,i
  0015 C3        CLR   C
     E   LCALL  ?C?ULCMP
  A       JZ   ?C0010
  001B E500    R   MOV   A,i+03H
  001D 24FF       ADD   A,#0FFH
  001F F500    R   MOV   i+03H,A
      R   MOV   A,i+02H
  0023 34FF       ADDC  A,#0FFH
      R   MOV   i+02H,A
      R   MOV   A,i+01H
  0029 34FF       ADDC  A,#0FFH
  002B F500    R   MOV   i+01H,A
  002D E500    R   MOV   A,i
  002F 34FF       ADDC  A,#0FFH
      R   MOV   i,A
         SJMP  ?C0007
  ; SOURCE LINE # 21
  0035     ?C0010:
  0035 22        RET
  ; FUNCTION _delay2 (END)
  呵呵,这倒是的确可以延迟很长时间~~~但是毫无精度可言了。
  那么,用C到底能不能实现精确的延时呢?我把代码稍微改了一下:
  void delay1(unsigned char i)
  while(i--);
  因为根据经验,越简洁的C代码往往也能得出越简洁的机器代码。那这样结果如何呢?把它生成的汇编代码拿出来看一看就知道了。满怀希望的我按下了&Build target&键,结果打击是巨大的:
  ; FUNCTION _delay1 (BEGIN)
  ; SOURCE LINE # 13
  ;---- Variable &i& assigned to Register &R7& ----
  ; SOURCE LINE # 14
  0000     ?C0004:
  ; SOURCE LINE # 15
  0000 AE07       MOV   R6,AR7
  0002 1F        DEC   R7
  0003 EE        MOV   A,R6
  0004 70FA       JNZ   ?C0004
  ; SOURCE LINE # 16
  0006     ?C0006:
  0006 22        RET
  ; FUNCTION _delay1 (END)
  虽说生成的代码跟用for语句是不大一样,不过我可以毫无疑问的说,这两种方法的效率是一样的。似乎到此为止了,因为我实在想不出来源程序还有什么简化的余地。看来我就要得出来这个结论了:&如果需要us级的延时精度,需要时用汇编语言。&但是真的是这样吗?我还是不甘心。因为我不相信大名鼎鼎的 Keil C 编译器居然连 djnz 都不会用???因为实际上程序体里只需要一句 loop: djnz r7, loop。近乎绝望之际(往往人在这种情况下确可以爆发出来,哦呵呵呵~~~),我随手改了一下:
  void delay1(unsigned char i)
  while(--i);
  心不在焉的编译,看源码:
  ; FUNCTION _delay1 (BEGIN)
  ; SOURCE LINE # 13
  ;---- Variable &i& assigned to Register &R7& ----
  ; SOURCE LINE # 14
  0000     ?C0004:
  ; SOURCE LINE # 15
  0000 DFFE       DJNZ  R7,?C0004
  ; SOURCE LINE # 16
  0002     ?C0006:
  0002 22        RET
  ; FUNCTION _delay1 (END)
  天~~~奇迹出现了。..。..我想这个程序应该已经可以满足一般情况下的需要了。如果列个表格的话:
  i  delay time/us
  1  5
  2  7
  3  9
  计算延时时间时,已经算上了调用函数的lcall语句所花的2个时钟周期的时间。
  终于,结果已经明了了。只要合理的运用,C还是可以达到意想不到的效果。很多朋友抱怨C效率比汇编差了很多,其实如果对Keil C的编译原理有一个较深入的理解,是可以通过恰当的语法运用,让生成的C代码达到最优化。即使这看起来不大可能,但还是有一些简单的原则可循的:1.尽量使用unsigned 型的数据结构。2.尽量使用char型,实在不够用再用int,然后才是long。3.如果有可能,不要用浮点型。4.使用简洁的代码,因为按照经验,简洁的C代码往往可以生成简洁的目标代码(虽说不是在所有的情况下都成立)。
Keil C相关文章
Keil C相关下载
51单片机相关文章
51单片机相关下载
IoT将会在未来10年内创造出500亿个联网设备,如何确保这些巨量联网设备的安全性和连接性,正是今天业界面临的2大主要挑战,本文重点将讨论基于ARM的...
一直以来,智能手机上实现4K视频、欣赏AR和VR都是不可能的任务,因为不可能在有限的移动设备功耗预算内,足够长时间地运行高清内容。但是,ARM新推出...
创新实用技术专题
Copyright &
.All Rights Reserved当前位置: >
> 51单片机C语言及汇编语言实用程序设计 (李萍) 中文PDF扫描版 29.6MB
51单片机C语言及汇编语言实用程序设计 (李萍) 中文PDF扫描版 29.6MB
汇编语言实用程序设计
书籍大小:29.6MB
软件语言:简体中文
书籍类型:
书籍授权:免费软件
更新时间:
书籍类别:其它相关
购买链接:&&
应用平台:
网友评分:
内容介绍热点排行下载地址相关内容
内容包括326个种和品种,以“怎么办”的形式,深入浅出、简明扼要地直接进行了回答,力求做到全面性、科学性、新疑性和实用性相结合,对花卉生产者也有参考指导作主板维修从入门到精通(全彩典藏)》由资深主板维修培训师精心编写,以最新主板为基础,全面、系统、深入地讲解了主板元器件的识别和检测、主板各种单元电路的结构原理、单《浪潮之巅》 近一百多年来,总有一些公司很幸运地、有意识或无意识地站在技术革命的浪尖之上。在长达十年甚至几十年的时间里,它们代表着科技的浪潮,直到下一波浪潮的来网络存储是一个涉及计算机硬件以及网络协议技术、操作系统以及专业软件等各方面综合知识的领域。目前国内阐述网络存储的书籍少之又少,大部分是国外作品,对存储系统底层细本书主要介绍计算机单机系统的组成原理及内部工作机制,包括计算机各大部件的工作原理、逻辑实现、设计方法及其互连构成计算机整机的技术本草纲目是一部具有世界性影响的博物学著作,作者李时珍,这是它的电子版本,以《本草纲目金陵版》为基础,按药物的“正名”、“释名”、“气味”、“主治”、“附方”分为《计算机组成与体系结构:性能设计(原书第8版)》以intel x86和arm两个处理器系列为例,结合当代计算机系统性能设计问题,介绍了计算机体系结构的主流技术和最新技术哈利波特1-7中文版全集全新高清PDF版,新奇魔法世界,值得珍藏一生的经典lua中文教程,原名:programming in lua
版权声明..............i
第一篇语言.......1
第0章序言.......1
0.1 序言..........1
0.2 Lua的使计算机组成原理(第2版)概念清楚,通俗易懂,书中举例力求与当代计算机技术相结合,可作为高等学校计算机专业教材,也可作为其他科技人员的参考书。
51单片机C语言及汇编语言实用程序设计 (李萍) 中文PDF扫描版 29.6MB
CopyRight &
JB51.Net , All Rights Reserved

我要回帖

更多关于 单片机汇编教程 的文章

 

随机推荐