原创 Keil使用小记/C51精确延时

2007-7-9 20:45 4027 9 7 分类: MCU/ 嵌入式
用Keil写C51程序是最好不过的了,与伟福相比,其编辑能力就强大多了。C51和A51,要扬长避短,发挥C的长处,就得将C模块化好。刚刚开始的时候就只是熟悉C51的语法规则了,熟悉了这个然后再追求程序的可读性和可移植性。
下面是的我使用Keil C51的一点心得。
1、程序可读性的提高
要提高程序的可读性,就得养成一良好的编程习惯了,例如变量用小写,常量用大写,函数第一个字母用大写等等。这样成习惯以后,自己看代码就会一目了然。另外还要灵活的在KEIL中使用TAB键对对齐文本,而不要敲空格代替(优势,试了就知道了)。
2、程序的可移植性的提高
程序的可移值性是C51的优势所在,要做到移植方便,就得熟悉C51的编译过程有一定的了解,合理组织文件。可以将一个功能模块(如显示驱动,端口读写)放在一个C文件中,作为一个函数调用,然后在主程序中申明该函数,就可以随便调用了。
移值的时候也只要把当前的C文件加入到新的项目中,同样的方法调用它就可以。
另外模块化程序要善用C里面的“#IFDEF”、“#ENDIF”、“#DEFINE”等专为模块设计提供的功能。例如设计一个外面带的晶振的驱动模块,在不同的晶振频率下,该项模块的设置位可能不同。如果就直接在程序中写设置位,晶振改变,这些设置位也要逐一修改,这个程序也就不通用了,也就是可移值性不好。要解决这个问题怎么办 ,“#IFDEF”、“#ENDIF”可以帮你解决问题。这两个命令的功能就不具体说了,书上面讲得很清楚。知道这些功能你就知道该怎样使用它们进行模块化设计了。
3、Keil C51的debug技巧
A51的程序执行时间可能通过指令周期计算出来,而C51的却无从下手,很多程序员为了得到精确的执行时间而研读反汇编代码,何等的悲哀。巧妙的使用Keil中的debug功能,问题就迎刃而解了。
下面举例说明:
241_112_af66cf68231dfe2b.jpg
该程序为一个延时程序,在12M的晶振下,调用一次的时间为16uS ,执行一次循环的时间为9uS(延时范围(25us~589.831ms))。这样来,假设有语句Delay(N);那么该语句的精确延时的计算公式就是(9*N+16)uS了.这个公式可以理解吧!
如何得到程序的调用时间和执行一次循环的时间了。接着看下面:
点击看大图
在主程序MAIN()函数下添加上面两条语句,当前的SEC栏为执行到DELAY(1);语句所花的时间。T(0-)
点击看大图

上面的SEC栏为执行完DELAY(1)所花的时间,这样就可以得到DEALY(1)这条语句的执行时间为595-570=25uS.
点击看大图
上面的SEC栏为执行完DELAY(2)所花的时间,这样就可以得到DEALY(2)这条语句的执行时间为629-595=34uS.
结果不就出来了嘛,T[DELAY(2)]-T[DELAY(1)]不就是执行一次循环的时间嘛,而T[DELAY(1)]减去执行一次循环的时间就是调用一次要花的时间了。精确到1个机器周期,够了吧.
PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1086505 2010-9-15 15:20

顶一下,李凯,从你的最后一张图片来看半导体工艺的特点和趋势,所有的半导体工艺可以使用的电压幅度都会随着速度或频率的增加而降低,电压幅度降低,则要求使用更多的增益电路来实现设计,从图中可以看到磷化铟工艺的可用电压幅度远远高出锗硅,更加适用于微波频段的电路设计,目前泰克的16GHz(包括20GHz DSP增强型)示波器用的是IBM 7HP工艺,其截止频率(三极管切换频率)是110GHz,8月初泰克宣布的下一代示波器,会适用IBM 8HP工艺,其其截止频率(三极管切换频率)是200GHz左右,意味着泰克的下一代示波器可以做到30GHz带宽左右,对比安捷伦的下一代50GHz带宽,虽有差距,但多个公司间的竞争,一定会加速示波器的技术发展。

用户1566505 2009-12-18 11:12

学习了.谢谢!
相关推荐阅读
用户1410124 2010-08-09 12:09
通过自定义HID设备实现PC与STM32之间灵活的双向通信
本文记录利用STM32的USB设备以HID方式实现与PC的自定义包大小通信的上下位机开发过程.关键字: USB, HID, HID读写,Report Descriptor要解决的问题 : 假定某一串行...
用户1410124 2010-01-25 20:35
在stm32上采用ENC28J60+uip1.0实现udp通信的笔记
在stm32上采用ENC28J60+uip1.0实现udp通信的笔记一、移植中要做的修改(相当简单):1、修改tapdev.c 中的tapdev_init(),tapdev_read(),tapdev...
用户1410124 2010-01-13 15:40
VC++项目开发全程实录[视频教程全集]
快速链接  http://www.songxiaolong.com/go/43629.html ...
用户1410124 2009-12-19 10:07
VC论坛
VC论坛:     1.编程先锋         http://wlbookwl.myrice.com   (后起之秀,实力可畏,吐血推荐!)         2.Visual   C++-MFC开发...
用户1410124 2009-12-19 09:54
堆和栈的区别
一、预备知识—程序的内存分配    一个由C/C++编译的程序占用的内存分为以下几个部分    1、栈区(stack)—   由编译器自动分配释放   ,存放函数的参数值,局部变量的值等。其    操...
用户1410124 2009-05-31 15:32
uC/GUI跑起来了
uC/GUI跑起来了,拿出来晒晒^_^ mdk里弄的,lpc2138上跑的,proteus里仿的,12864LCD显示的,纯虚拟环境,实在是方便啊,没上OS,下一个脚印当然就是OS++啦。 ...
EE直播间
更多
我要评论
1
9
关闭 站长推荐上一条 /3 下一条