⑴ 单片机C语言的延时程序源码分析,希望能帮我加注释,告诉我每句语句的含义谢谢!
H_DATA BIT P3.2 将p3.2引脚命名为H_DATA,以后用H_DATA就能代表P3.2
H_CLK BIT P3.4 同上,将P3.4命名为H_CLK
?PR?DELAY30US SEGMENT CODE 函数DELAY30US声明
PUBLIC DELAY30US
RSEG ?PR?DELAY30US
; abc XDATA 0A00H
;35.8US
DELAY30US: 函数体
PUSH 05H ;2因为函数用到R5,所以将进入函数之前的R5压入堆栈,返回前提出
MOV r5,#50 ;25 为R5赋值
DE30S1:
DJNZ r5,DE30S1 ;2*14=28 对R5减一,判断不等于零跳到DE30S1;等于零退出
POP 05h ;2把进入函数前的R5恢复
RET 函数返回
;******************************************************************
?PR?DELAY10US SEGMENT CODE 声明DELAY10US函数
PUBLIC DELAY10US
RSEG ?PR?DELAY10US
;16.3US
DELAY10US: DELAY10US函轿段数体
PUSH 05H ;2因为函数用到R5,所以将进入函数之前的R5压入堆栈,返回前提出
MOV r5, #20 ;10为R5赋值
DE10S1:
DJNZ r5, DE10S1 ;5*2=10对R5减一,判断不等于零跳到DE10S1;等于零退出
POP 05H ;2把进入函数前的R5恢复
RET 函数返回
?PR?CLSSIGNAL SEGMENT CODE 声贺雹明函数CLSSIGNAL
PUBLIC CLSSIGNAL
RSEG ?PR?CLSSIGNAL
CLSSIGNAL:
;WHEN SYSTEM SEND INFORMATION TO PINPAD, SEND STOP BIT AT END, THEN NEXT A
;SEND OPERATION. SO WAITTING STOP BIT FINISHED.
CLSL1:
PUSH 05H 因为函数用到R5,所以将进入函数之前的R5压入堆栈,返回前提出
CLSL1_U:
MOV R5, #6EH 对R5赋值
CLSL2: JNB H_DATA, CLSL1_U 判断p3.2不为零跳转,继续闭拍誉赋初值
JNB H_CLK, CLSL1_U 判断p3.4不为零,继续赋初值
DJNZ R5, CLSL2 如果两个输入都为零对r5减一,不为零跳到clsl2
POP 05H
RET
END
⑵ 请帮忙在51系列单片机系统中,编写一个延时1ms的子程序。谢谢。。
1、首先,在电脑中打开keil软件,创建好工程,然后添加c文件,如下图所示。
⑶ 51单片机,晶振为6M请帮忙写一个10ms的延时程序,能有详细解释的。因为我还不知道这个延时的时间是怎么算
延时有很多种方法,有一种是让单片机去做无聊的循环,
还有一种是用定时器。
我本身也是菜鸟所以只能粗略的讲一下。
第一种的算法是
晶振的周期T1=1/f; 这里f=6MHz 所以T1=1/6 us;(微秒)
单片机花12个T1去执行一个指令,
所以一个机器周期等于12个晶振周期,
T2=12*T1=2us
10ms=1000 0us
所以你要得到10ms的延时就要想办法让机器去做5000条“无聊的指令”
所以
DEL: MOV R5,#05H
F1: MOV R6,#05H
F2: MOV R7,#32H
F3: DJNZ R7,F3
DJNZ R6,F2
DJNZ R5,F1
RET
这种方法是用于对时间要求不高的地方,我说的是其思想,程序中可能有错的地方
用定时器的方法我不太会就不误人了 (补充一下就是这个是用汇编写的,你在主程序中用ACALL DEL调用就延时了。
⑷ 单片机延时时间程序怎么编程
举一个例子来说明吧.比如你要编一个延时50毫秒的子程序,那么步骤如下:
1、查看一下你的硬件环境,比如晶振大小,CPU型号,不用CPU指令的机器周期是不一样的。
2、计算延时需要的机器周期。比如采用12M晶振,CPU采用通用8051,那么一个机器周期为1US,50毫秒为50*1000=50000US,需要的机器周期=50000/1=50000。
3、试编程,如下:
程序代码 指令时间 总共时间
DELAY50MS: ;2 2
MOV R7,#A ;1 1
DELAY1:
MOV R6,#B ;1 1*A
DJNZ R6,$ ;2 2*B*A
DJNZ R7,DELAY1 ;2 2*A
RET ;2 2
所以总时间=2+1+A+2*A*B+2*A+2=5+3A+2AB
4、凑数求A、B
根据2、3得到如下式子:
50000=5+3A+2AB
可以有很多种结果,不过最好是以A尽可能小,B尽可能大为原则,当然不能大于255.
我现在凑出A=110,B=225;那么总延时时间=5+3*110+2*110*225=49835。还差165US
5、补齐不够时间
再加一个小循环就OK了,呵呵如下:
MOV R6,#C
DJNZ R6,$
会算了吧,2*C+1=165;所以C=82。
现在完整的延时程序出来了,如下:
DELAY50MS: ;2 2
MOV R7,#110 ;1 1
DELAY1:
MOV R6,#225 ;1 1*110
DJNZ R6,$ ;2 2*225*110
DJNZ R7,DELAY1 ;2 2*110
MOV R6,#82 ;1 1
DJNZ R6,$ ;2 2*82
RET ;2 2
很圆满:总的时间50000微妙,也就是50毫秒。这种方式编程,在该硬件环境下可以保证最大误差为1微妙。