最近开始疯狂STC。第一个程序让我彻底放弃了 KEIL uv2 。正式用上了KEIL uv3。然后就是发现明明DEBUG出的时间是一秒 跑到板子上明显更短。认定STC和普通51有区别
上网找到 杜洋 大侠的文章
http://hi.baidu.com/doyoungnet/blog/item/73e9e81e6fa7bafc1bd57695.html
他给了个比较实用的方法
但是我觉得不好。精度不够
我想应该反汇编的方法来确定。那么就需要知道 delay中的每一句命令的执行时间
汇报
源程序:
LED EQU P1.0
ORG 0000H
LJMP START
ORG 30H
CLR LED
setb p1.1
START:
CLR LED
setb p1.1
LCALL DELAY
SETB LED
clr p1.1
LCALL DELAY
LJMP START
DELAY: MOV R5,#50
D0: MOV R7,#250
D1: MOV R6,#250
D2: DJNZ R6,D2
DJNZ R7,D1
DJNZ R5,D0
RET
END
DELAY子程序:
DELAY: MOV R5,#50
D0: MOV R7,#250
D1: MOV R6,#250
D2: DJNZ R6,D2
DJNZ R7,D1
DJNZ R5,D0
RET
运算过程
查STC手册知道如下命令的执行速度
MOV R5,#50 ;为普通单片机的6倍速度
D0: MOV R7,#250 ;为普通单片机的6倍速度
D1: MOV R6,#250 ;为普通单片机的6倍速度
D2: DJNZ R6,D2 ;为普通单片机的6倍速度
DJNZ R7,D1 ;为普通单片机的6倍速度
DJNZ R5,D0 ;为普通单片机的6倍速度
RET ;为普通单片机的6倍速度
CLR LED ;为普通单片机的3倍速度
SETB P1.1 ;为普通单片机的3倍速度
现在可以手工算。
当然我推进你一种更好的方法 :KEIL UV3的DEBUG一样可以
1.设置晶振频率为实际板子上的频率
2.在 CLR LED 和 SETB P1.1 每条命令前加2个NOP
(NOP为普通单片机的12倍速度)
3,设置断点 DEBUG时间 调整R5,R6,R7中的初值 令DEBUG的时间为实际目的时间的6倍
(这里涉及一些技巧,初中的不等式知识很有用,慢慢体会吧)
4.删除所有的刻意加上的NOP,得到的就是我们想要的程序源代码
发布我写的:
STC的延时程序(5.996310/6=0.999385@18.441828HZ)
工作情况(TIME=5.996310/6=0.999385s @18.441828HZ晶振)
2009.5.31 0:53齐天小圣作品
tengjingshu_112148725 2009-5-31 08:51