关于单片机编程AT89C51的编程问题

单片机基础问答
单片机基础问答
栏目导航&&
汇集了最常用的,比如,等等,相信您看完本栏目的内容,会对产生一个感性的认识,从而激发您的学习兴趣。
36个单片机新手入门问题:
单片机开发与测试中的若干问题:
holtek单片机常见问题汇总:
8051单片机设计教程与实例---指令基础教程1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.
21.22.23.24.25.26.27.28.29.30.31.32.33.   
8051单片机设计教程与实例---实战程序设计
单片机相关资料(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12)(14)(15)(16)(17)(19)(20)(21)(22)
<scr<scr<scrAT89C51单片机的基本结构_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
AT89C51单片机的基本结构
&&单片机,AT89C51
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢先锋游戏知道信息频道欢迎您
编程:AT89C51单片机内部自带A/D转换吗?
[南浔] [ 20:26:31] (<span id="tgd) (<span id="tfd) &&
最佳答案这个型号的不带。stc的带,但是只有8位。精度要求搞的话,建议外接ad芯片。其他答案一般的51都不带,带的很多都是xxxxxad,最后有ad两个字母
昵称: 验证码:
评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述
编程相关知识
编程其他问题最爱巴萨 - 向加泰罗尼亚致敬
(AT89C51)单片机C程序延时精度研究
在单片机应用中,经常会遇到需要短时间延时的情况,一般都是几十到几百μs,并且需要很高的精度(比如用单片机驱动DS18B20时,误差容许的范围在十几μs以内,不然很容易出错);而某些情况下延时时间较长,用计时器往往有点小题大做。另外在特殊情况下,计时器甚至已经全部用于其他方面的定时处理,此时就只能使用软件定时了[1]。
C语言程序延时
  Keil C51的编程语言常用的有2种: 一种是汇编语言;另一种是C 语言。用汇编语言写单片机程序时,精确时间延时是相对容易解决的。比如,用的是晶振频率为12 MHz的AT89C51,打算延时20 μs,51单片机的指令周期是晶振频率的1/12,即一个机器周期为1 μs;“MOV R0,#X”需要2个机器周期,DJNZ也需要2个机器周期,单循环延时时间t=2X+3(X为装入寄存器R0的时间常数)[2]。这样,存入R0里的数初始化为8即可,其精度可以达到1 μs。用这种方法,可以非常方便地实现512 μs以下时间的延时。如果需要更长时间,可以使用两层或更多层的嵌套,当然其精度误差会随着嵌套层的增加而成倍增加。
  虽然汇编语言的机器代码生成效率很高,但可读性却并不强,复杂一点的程序就更难读懂;而C语言在大多数情况下,其机器代码生成效率和汇编语言相当,但可读性和可移植性却远远超过汇编语言,且C 语言还可以嵌入汇编程序来解决高时效性的代码编写问题。就开发周期而言,中大型软件的编写使用C 语言的开发周期通常要比汇编语言短很多,因此研究C语言程序的精确延时性能具有重要的意义[3]。
  C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。
单层循环延时精度分析
  下面是进行μs级延时的while程序代码。
  延时函数:
  void delay1(unsigned char i) {    while(i );}  主函数:  void main() {    while(1) {      delay1(i);    }  }
  使用Keil C51的反汇编功能,延时函数的汇编代码如下:
  C:0x00E6AE07MOVR6,0x07  C:0x00E81FDECR7  C:0x00E9EEMOVA,R6  C:0x00EA70FAJNZC:00E6  C:0x00EC22RET
500)this.width=500" border=0&
断点设置位置图
  通过对i赋值为10,在主程序中图1所示的位置设置断点。经过测试,第1次执行到断点处的时间为457 μs,再次执行到该处的时间为531 μs,第3次执行到断点处的时间为605 μs,10次while循环的时间为74 μs,整个测试结果如图2所示。
500)this.width=500" border=0&
使用i--方式测试仿真结果图
  通过对汇编代码分析,时间延迟t=7X+4(其中X为i的取值)。测试表明,for循环方式虽然生成的代码与用while语句不大一样,但是这两种方法的效率几乎相同。C语言中的自减方式有两种,前面都使用的是i--的方式,能不能使用--i方式来获得不同的效果呢?将前面的主函数保持不变,delay1函数修改为下面的方式:
  void delay1(unsigned char i) {    while(--i);}
  同样进行反汇编,得到如下结果:
  C:0x00E3DFFEDJNZR7,  C:00E3C:0x00E522RET
  比较发现,--i的汇编代码效率明显高于i--方式。由于只有1条语句DJNZ,执行只需要2个时钟周期, 1个时钟周期按1 μs计算,其延时精度为2 μs;另外,RET需要2个时钟周期,能够达到汇编语言代码的效率。按前面的测试条件进行测试,第1次执行到断点处的时间为437 μs,再次执行到该处的时间为465 μs,第3次执行到断点处的时间为493 μs,10次while循环的时间为28 μs,整个测试结果如图3所示。
500)this.width=500" border=0&
使用--i方式测试仿真结果图
  调整i的取值,i取8时延时时间为24 μs,i取9时延时时间为26 μs。通过分析得出,10次循环为28 μs是由于外层循环造成的,其精度可以达到2 μs。在设计时应该考虑参数传递和RET语句执行所需要的时间周期。实验分析发现,for语句使用--i方式,同样能够达到与汇编代码相同的精度。i取不同值时延时仿真结果如图4所示。
500)this.width=500" border=0&
i取不同值时延时仿真结果图
多重嵌套下的C程序延时
  在某些情况下,延时较长,仅使用单层循环方式是不能完成的。此时,只能使用多层循环方式,那么多重循环条件下,C程序的精度如何呢?下面是一个使用for语句实现1 s延时的函数。
  延时函数
  void delay1s(void) {    for(k=100;k&0;k--) //定时1 s    for(i=20;i&0;i--)    for(j=248;j&0;j--);  }
  主函数调用延时函数代码段:
  while(1)
{    delay1s();    scond+=1;  }
  为了直接衡量这段代码的效果,利用Keil C找出这段代码产生的汇编代码:
  C:0x00B37002JNZ  C:00B7C:0x00B5150CDEC0x0C  C:0x00B7E50DMOVA,0x0D  C:0x00B9450CORLA,0x0C  C:0x00BB70DEJNZC:009B  C:0x00BDE50BMOVA,0x0B  C:0x00BF150BDEC0x0B  C:0x00C17002JNZC:00C5  C:0x00C3150ADEC0x0A  C:0x00C5E50BMOVA,0x0B  C:0x00C7450AORLA,0x0A  C:0x00C970CAJNZC:0095  C:0x00CB22RET
  分析汇编代码,其他汇编代码使用的不是DJNZ跳转方式,而是DEC和JNZ语句来实现循环判断。1条JNZ指令要花费2个时钟周期,3条指令就需要6个机器周期,MOV指令和DEC指令各需要1小时钟周期,1个时钟周期按1 μs算,其精度最多达到8 μs,最后加上一条LCALL和一条RET语句,所以整个延时精度较差[4]。
  利用Keil C的测试工具,在一处设置一个断点。第1次执行到中断处的时间为0.000 513 s,第2次执行到中断处的时间为1.000 922 s,时间延迟为1.000 409 s,测试结果如图5所示。对于上面的3种循环嵌套,循环次数为100×20×248=496 000,每次循环的时间约为2 μs。
500)this.width=500" border=0&
三重嵌套循环1 s实现时间测试结果
  为获取与汇编语言延时的差距,同样进行1 s的延时,程序代码段如下:
    LCALL DELY1S    INC Second  DELY1S:MOV R5,#100  D2:MOV R6,#20  D1:MOV R7,#248    DJNZ R7,$    DJNZ R6,D1    DJNZ R5,D2    RET
  通过Keil C51测试,其实际延迟时间为0.997 943 s。虽然C语言实现延时方式的汇编代码复杂度增加,但是与汇编语言实现的方式性能差距并不大。
  汇编语言在实时性方面具有较大的优越性,虽然使用Keil C51可以在C语言程序中嵌入汇编代码,但是复杂度明显提高。实验证明,只要合理地运用C语言,在延时编程方面就可以达到与汇编语言相近的精度。为了获得精确的时间延迟,可通过Keil C工具的仿真功能,调整延迟量,从而得到较理想的结果。
  参考文献
  [1] InfiniteSpace Studio/isjfk. 51单片机KeilC延时程序的简单研究[EB/OL].
.  [2] 沈舷. 延时程序延时时间的精确计算.电工技术与自动化[J]. ):152-153,157.  [3] 蹇兴亮.单片机定时中断的精确定时编程方法种种[J].单片机与嵌入式系统应用,2004(8).  [4] 聂毅.单片机定时器中断时间误差的分析及补偿[J].微计算机信息,):37-38.
  方飞(硕士),主要研究方向为嵌入式系统应用。
作者:内江师范学院 方飞 薛世华
来源:[http://www.jdzj.com]机电之家·机电行业电子商务平台!
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!&#xe621; 上传我的文档
&#xe602; 下载
&#xe60c; 收藏
粉丝量:934
所有文档全都可以在线免费浏览,需要的朋友请看好了是否是自己需要的文档再下载。部分文献资料来源于网络,仅供个人参考试阅,版权归原作者,若有侵权,敬请及时告知,本人会随时删除侵权文档。
&#xe602; 下载此文档
毕业论文—AT89C51单片机毕业设计论文
下载积分:999
内容提示:毕业论文—AT89C51单片机毕业设计论文
文档格式:DOC|
浏览次数:133|
上传日期: 09:31:45|
文档星级:&#xe60b;&#xe60b;&#xe60b;&#xe60b;&#xe60b;
全文阅读已结束,如果下载本文需要使用
&#xe71b; 999 积分
&#xe602;下载此文档
该用户还上传了这些文档
毕业论文—AT89C51单片机毕业设计论文
关注微信公众号}

我要回帖

更多关于 单片机编程软件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信