singleywy的笔记 https://passport2.21ic.com/?632881 [收藏] [复制] [RSS]

日志

【原创】51定时器修正C语言代码(非汇编)

已有 1032 次阅读2010-11-5 09:32 |系统分类:单片机| 51, 定时器, C语言, 修正

为了得到与汇编一样高效的定时器修正代码,经过多次反编译修改后得到如下的代码


即:


 “ACC=((65536+8-SYS_CLK)%256);
 TR0=0;
 TL0+=ACC;
 ACC=0;
 CY=ACC & 0x80;
 ACC =((65536+8-SYS_CLK)/256)+ACC;
 TH0+=ACC;
 TR0=1;” 


其中SYS_CLK为所定时的时间,这里默认的时钟为12MHZ,


本人在keil中,(我当时默认设置了5000)反编译之后得到的汇编的代码为:


 MOV   A,#080H
 CLR   TR0
 ADD   A,TL0
 MOV   TL0,A;TL0修正
 CLR   A;清空ACC


 RLC   A;保存CY到ACC中,即为TLO修正时的进位
 ADD   A,#0ECH
 ADD   A,TH0
 MOV   TH0,A;TH0修正
 SETB  TR0


看一下与Intel蓝本中汇编比较一下:


; // MOV A,#((65536-SYS_CLK+7) MOD 256)
; // CLR TR0
; // ADD A,TL0
; // MOV TL0,A
; // MOV A,TH0
; // ADDC A,#((65536-SYS_CLK+7 )/256)
; // MOV TH0,A
; //  SETB TR0


大家可以看到结果了吧,相比之下只有1条指令的差距


相对来说效率是很高,您可能会发觉这条语句:“ACC =((65536+8-SYS_CLK)/256)+ACC;”


为什么不用“ACC+ =((65536+8-SYS_CLK)/256)”
我原本以为这两句是一样的,可是编译器可不这样想,认为是两种不同的操作,这条指令编译后会将


ACC中的值清零,再与修正值相加,这样就得不到前面TL0修正时的进位CY了


呵呵,如果大家觉得不错就拿去用吧,省着用汇编修正了


路过

鸡蛋

鲜花

握手

雷人

发表评论 评论 (1 个评论)

回复 qnmdsb2008 2010-11-9 12:10
8错