利用KEIL C51单片机编写程序的步骤,在单片机的P3.7口产生一个占空比可调的方波脉冲信号

Keil C51(51单片机编程软件)是编程工具频道丅深受用户喜爱的软件太平洋下载中心提供Keil C51(51单片机编程软件)官方下载。Keil C51如果注册不了请注册多几次总会有一次成功的,建议把电脑时間改到2010年一定会注册成功。已在windows xp和windows 7平台下测试成功注册不成功,一般有以下原因:
1、没有正确按照慧净的方法注册
2、系统安装了多個K软件,要把K软件目录里的文件全部删除掉再看教程重新安装
3、第一次启动软件时一定要以管理员启动
注册不了,不是软件有问题请查一查电脑系统。
注册机很多安全杀毒软件当它是木马病毒,会自动杀掉如果你需要注册使用K软件的,请把杀毒软件关掉解压注册機,装好K软件后再打开杀毒软件

请直接复制目录下的Uv4.exe到安装目录代替E文的Uv4.exe
另外提醒大家不要崇拜汉化版软件,还是E文的干净没有BUG!

解压臸keil安装目录(如:X:KeilUV4)下覆盖原始文件。

  应用单片机的时候经常会遇到需要短时间延时的情况。需要的延时时间很短一般都是几十到几百微妙(us)。有时候还需要很高的精度比如用单片机驱动 DS18B20的时候,误差容许的范围在十几us以内不然很容易出错。这种情况下用计时器往往有点小题大做。而在极端的情况下计时器甚至已经全部派仩了别的用途。这时就需要我们另想别的办法了

  以前用汇编语言写单片机程序的时候,这个问题还是相对容易解决的比如用的是12MHz晶振的51,打算延时20us只要用下面的代码,就可以满足一般的需要:

  51 单片机的指令周期是晶振频率的1/12也就是1us一个周期。mov r0 #09h需要2个极其周期,djnz也需要2个极其周期那么存在r0里的数就是(20-2)/2。用这种方法可以非常方便的实现256us以下时间的延时。如果需要更长时间可以使用兩层嵌套。而且精度可以达到2us一般来说,这已经足够了

  现在,应用更广泛的毫无疑问是Keil的C编译器相对汇编来说,C固然有很多优點比如程序易维护,便于理解适合大的项目。但缺点(我觉得这是C的唯一一个缺点了)就是实时性没有保证无法预测代码执行的指囹周期。因而在实时性要求高的场合还需要汇编和C的联合应用。但是是不是这样一个延时程序也需要用汇编来实现呢?为了找到这个答案我做了一个实验。

  用C语言实现延时程序首先想到的就是C常用的循环语句。下面这段代码是我经常在网上看到的:

  到底这段代码能达到多高的精度呢为了直接衡量这段代码的效果,我把 Keil C 根据这段代码产生的汇编代码找了出来:

         JZ   C0010

  真是不看不知道~~~一看才知道这个延时程序是多么的不准点~~~光看主要的那四条语句,就需要6个机器周期也就是说,它的精度顶多也就昰6us而已这还没算上一条 lcall 和一条 ret。如果我们把调用函数时赋的i值根延时长度列一个表的话就是:

  因为函数的调用需要2个时钟周期的lcall,所以delay time比从函数代码的执行时间多2顺便提一下,有的朋友写的是这样的代码:

  可能有人认为这会生成更长的汇编代码来但是事实證明:

         JZ   ?C0010

  其生成的代码是一样的不过这的确不是什么好的习惯。因为这里实在没有必要再引入多余的变量我们继续讨论正题。有的朋友为了得当更长的延时甚至用了这样的代码:

  这段代码产生的汇编代码是什么样子的?其实不用想吔知道它是如何恐怖的$#^%&%$...。.让我们看一看:

      R   MOV   iR4

      R   MOV   R0,i

  A       JZ   C0010

      R   MOV   i,A

         SJMP  C0007

  呵呵,这倒是的确可以延迟很长时间~~~但是毫无精度可言了

  那么,用C到底能不能实现精确嘚延时呢我把代码稍微改了一下:

  因为根据经验,越简洁的C代码往往也能得出越简洁的机器代码那这样结果如何呢?把它生成的彙编代码拿出来看一看就知道了满怀希望的我按下了“Build target”键,结果打击是巨大的:

  虽说生成的代码跟用for语句是不大一样不过我可鉯毫无疑问的说,这两种方法的效率是一样的似乎到此为止了,因为我实在想不出来源程序还有什么简化的余地看来我就要得出来这個结论了:“如果需要us级的延时精度,需要时用汇编语言”但是真的是这样吗?我还是不甘心因为我不相信大名鼎鼎的 Keil C 编译器居然连 djnz 嘟不会用??因为实际上程序体里只需要一句 loop: djnz r7 loop。近乎绝望之际(往往人在这种情况下确可以爆发出来哦呵呵呵~~~),我随手改了一丅:

  心不在焉的编译看源码:

  天~~~奇迹出现了。....我想这个程序应该已经可以满足一般情况下的需要了。如果列个表格的话:

  计算延时时间时已经算上了调用函数的lcall语句所花的2个时钟周期的时间。

  终于结果已经明了了。只要合理的运用C还是可以达到意想不到的效果。很多朋友抱怨C效率比汇编差了很多其实如果对Keil C的编译原理有一个较深入的理解,是可以通过恰当的语法运用让生成嘚C代码达到最优化。即使这看起来不大可能但还是有一些简单的原则可循的:1.尽量使用unsigned 型的数据结构。2.尽量使用char型实在不够用再用int,嘫后才是long3.如果有可能,不要用浮点型4.使用简洁的代码,因为按照经验简洁的C代码往往可以生成简洁的目标代码(虽说不是在所有的凊况下都成立)。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载文章观点仅代表作者本人,不代表电子发烧友网立場文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题请联系本站作侵删。 

我要回帖

更多关于 单片机编写程序的步骤 的文章

 

随机推荐