晶振6MHZ和12MHZ的51单片机延时程序的编写

来源:百度知道 编辑:UC知道 时间:2024/09/24 12:06:35
各位高手好
我用12MHZ的晶振做1S的延时程序这样些不吗?
MOV R7,#50
D3 MOV R6,#50
D2 MOV R5,#200
D1 DJNZ R5,D1
DJNZ R6,D2
DJNZ R7,D3
RET
计算是:50*50*200*2=1000000=1S
如果用6MHZ的做1S的又怎么写呀
谢谢!

这个程序你写的太不规范了。
改你的程序.

DELAY MOV R7,#50 ;2 2代表机器周期
D3: MOV R6,#50 ;2
D2: MOV R5,#200 ;2
D1: DJNZ R5,D1 ;2
DJNZ R6,D2 ;2
DJNZ R7,D3 ;2
RET ;2

其实这个程序来做延迟程序是有误差的,而且很大。
实际延迟时间 t=2us+((2us*200+2us)*60)*50+2us= ...
自己算吧 反正比1S延迟要高,仔细看看计算式子的顺序。以基本2重循环思路来解决3重循环。如果要求不高的话,用它来做1S延迟也可以。

下面来给你写一个通过定时,计数器来做延迟子程序。(精确度很高)
有关知识看定时计数器单元的介绍。
DELAY: MOV TMOD,#01H ;选择工作方式1 定时器0
MOV TH0,#**
MOV TLO,#**
SETB TR0
LOOP1: JNB TF0,LOOP
CLR TF0
SJMP MAIN
** 的初始值计算方法 1000 000US=(65535-X)/T
T=12*1/FOSC
FOSC 即为晶振频率 用X的值除以256,商给TH0,余数给TL0
这样,如果需要延迟子程序直接调用。精确度极高。
希望对你有用。不懂继续问

R7的50改成25 ,楼上MOV是双字节单周期指令,如果要精确算的话:
DELAY:
MOV R7,#50
D3: MOV R6,#50
D2: MOV R5,#200
D1: DJNZ R5,D1
DJNZ R6,D2
DJNZ R7,D3
RET