51单片机的延时程序该如何学习写呢? |
| 单片机论坛是国内大型的mcu电子技术与单片机社区http://www.51hei.com/bbs/ |
51单片机的延时程序该如何学习写呢? 作者:z158360 时间:2008-7-6 19:28:49
第 1 楼
我是个初学者,我想问问哪位高手,51单片机的延时程序该如何学习写呢?是否于单片机所谓的时钟周期,机器周期,状态周期,指令周期有关呢.呵呵,我问问老师,他给我的答复很明确,只要死记住几个常用的就行了,真的是那样吗?~~~谢谢您了 作者:ziranerran012 时间:2008-7-6 21:38:22
第 2 楼
我也是你个初学者,顶你 一下!!你用的是汇编还是C呀,要是汇编的话我感觉还简单点,C我是搞不太懂了!! 作者:z158360 时间:2008-7-7 20:26:19
第 3 楼
呵呵,是汇编,我觉得应该先从汇编学起,呵呵,多多交流! 作者:jkren08 时间:2008-7-7 20:42:19
第 4 楼
延时一共有两种方式子程序延时和中断延时 作者:z158360 时间:2008-7-7 21:44:28
第 5 楼
DELAY: MOV R7,#250 D2: DJNZ R6,D2 DJNZ R7,D1 RET 作者:wxz0504274 时间:2008-7-10 16:32:06
第 6 楼
延时时间 t=(2x+3)y*机器周期Tcy DELAY: MOV R7,#y D2: DJNZ R6,D2 (延迟程序从这里开始,上面只是赋个初值) DJNZ R7,D1 RET 作者:a13758777532 时间:2008-7-12 17:01:06
第 7 楼
想知道吗?我会详细的告诉你,让你成为高手,我的QQ492227911; 你好! 作者:z158360 时间:2008-7-12 22:02:36
第 8 楼
我加您了,绝缘体就是我,313717435, 呵呵,请你多关照!有问题我可就不客气了哦~~~~ 谢谢您! 作者:z158360 时间:2008-7-12 22:03:19
第 9 楼
谢谢您了! 以后多交流! 谢了 作者:z158360 时间:2008-7-12 22:06:53
第 10 楼
谢您了,以后请多关照! 作者:客人 时间:2008-7-13 16:59:48
第 11 楼
我觉得单片机延时很简单 作者:a13758777532 时间:2008-7-14 14:05:22
第 12 楼
没问题 作者:客人 时间:2008-7-14 22:31:25
第 13 楼
其实最简单的延时就是nop,可以执行一个周期,而且他还可以预防飞车,对程序的设计有好处! 作者:a13758777532 时间:2008-7-15 13:00:30
第 14 楼
void delay(void) 作者:J_xiaozhu 时间:2008-8-22 18:34:24
第 15 楼
#define uint unsigned int void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } 延时z(ms) 注意z的范围 作者:xiaoyi 时间:2008-8-25 23:53:58
第 16 楼
不知你要的是汇编,还是C语言,我感觉C语言好用一些,又好移值,在学好汇编的基础后,尽量学C语言,很多的较大的程序我都是用C语言编写的,下面给你一个常用的C语言延时程序给你: void delay(unsigned int z) 这是一个在12Mhz晶振下的1MS延时程序。 作者:客人 时间:2008-8-27 12:12:49
第 17 楼
单片机延时程序 2008-06-10 13:50:46 来源:来于网络,服务大家 作者:未知 【大 中 小】 点击: 9 次 下面几个是单片机的延时程序(包括asm和C程序,都是我在学单片机的过程中用到的),在单片机延时程序中应考虑所使用的晶振的频率,在51系列的单片机中我们常用的是11.0592MHz和12.0000MHz的晶振,而在AVR单片机上常用的有8.000MHz和4.000MH的晶振所以在网上查找程序时如果涉及到精确延时则应该注意晶振的频率是多大。 软件延时:(asm) 晶振12MHZ,延时1秒 程序如下: DELAY:MOV 72H,#100 LOOP3:MOV 71H,#100 LOOP1:MOV 70H,#47 LOOP0:DJNZ 70H,LOOP0 NOP DJNZ 71H,LOOP1 MOV 70H,#46 LOOP2:DJNZ 70H,LOOP2 NOP DJNZ 72H,LOOP3 MOV 70H,#48 LOOP4:DJNZ 70H,LOOP4 定时器延时: 晶振12MHZ,延时1s,定时器0工作方式为方式1 DELAY1:MOV R7,#0AH ;; 晶振12MHZ,延时0.5秒 AJMP DELAY DELAY2:MOV R7,#14H ;; 晶振12MHZ,延时1秒 DELAY:CLR EX0 MOV TMOD,#01H ;设置定时器的工作方式为方式1 MOV TL0,#0B0H ;给定时器设置计数初始值 MOV TH0,#3CH SETB TR0 ;开启定时器 HERE:JBC TF0,NEXT1 SJMP HERE NEXT1:MOV TL0,#0B0H MOV TH0,#3CH DJNZ R7,HERE CLR TR0 ;定时器要软件清零 SETB EX0 RET C语言延时程序: 10ms延时子程序(12MHZ) void delay10ms(void) { unsigned char i,j,k; for(i=5;i>0;i--) for(j=4;j>0;j--) for(k=248;k>0;k--); } 1s延时子程序(12MHZ) void delay1s(void) { unsigned char h,i,j,k; for(h=5;h>0;h--) for(i=4;i>0;i--) for(j=116;j>0;j--) for(k=214;k>0;k--); } 200ms延时子程序(12MHZ) void delay200ms(void) { unsigned char i,j,k; for(i=5;i>0;i--) for(j=132;j>0;j--) for(k=150;k>0;k--); } 500ms延时子程序程序: (12MHZ) void delay500ms(void) { unsigned char i,j,k; for(i=15;i>0;i--) for(j=202;j>0;j--) for(k=81;k>0;k--); } 下面是用了8.0000MHZ的晶振的几个延时程序(用定时0的工作模式1): (1)延时0.9MS void delay_0_9ms(void) { TMOD=0x01; /*定时器0工作在模式1下(16位计数器)*/ TH0=0xfd; TL0=0xa8; TR0=1; /*启动定时器*/ while(TF0==0); TR0=0; } (2)延时1MS void delay_1ms(void) { TMOD=0x01; /*定时器0工作在模式1下(16位计数器)*/ TH0=0xfd; TL0=0x65; TR0=1; /*启动定时器*/ while(TF0==0); TR0=0; } (3)延时4.5ms void delay_4_5ms(void) { TMOD=0x01; /*定时器0工作在模式1下(16位计数器)*/ TH0=0xf4; TL0=0x48; TR0=1; /*启动定时器*/ while(TF0==0); TR0=0; } 在用定时器做延时程序时如果懒得计算定时器计数的初始值可以在网上找一个专门用来做延时的小软件,我在用着感觉很实用,如果找不到的话可以留言,留下自己的邮箱我给发过去;如果上面的延时中有错误敬请指正。 作者:客人 时间:2008-8-29 10:15:36
第 18 楼
php0092@sina.com.cn 我需要定时器延时的小软件 另外请教一下:用软件延时时,程序里面的那几个数字是怎么计算出来的啊? 谢谢 作者:marlin 时间:2008-10-14 10:42:42
第 19 楼
以下是引用客人(210.27.*.*)在2008-8-29 10:15:36的发言:
php0092@sina.com.cn 我需要定时器延时的小软件 另外请教一下:用软件延时时,程序里面的那几个数字是怎么计算出来的啊? 谢谢 853048860@qq.com 作者:hp 时间:2008-10-19 19:11:36
第 20 楼
用汇编 精确廷时计算公式: 延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+5 ------------------------------------------------------------------------------------------------------ 各种延时程序集合(汇编) ;延时5秒左右 DELAY5S USH 04H PUSH 05H PUSH 06H MOV R4,#50 DELAY5S_0:MOV R5,#200 DELAY5S_1:MOV R6,#245 DJNZ R6,$ DJNZ R5,DELAY5S_1 DJNZ R4,DELAY5S_0 POP 06H POP 05H POP 04H RET ;513微秒延时程序 DELAY: MOV R2,#0FEH DELAY1: DJNZ R2,DELAY1 RET ;10毫秒延时程序 DL10MS: MOV R3,#14H DL10MS1:CALL DELAY DJNZ R3,DL10MS1 RET ;0.1s延时程序12mhz DELAY: MOV R6,#250 DL1: MOV R7,#200 DL2: DJNZ R6,DL2 DJNZ R7,DL1 RET ;延时1046549微秒(12mhz) ;具体的计算公式是: ;((((r7*2+1)+2)*r6+1)+2)*r5+1+4 = ((r7*2+3)*r6+3) *r5+5 DEL : MOV R5,#08H DEL1: MOV R6,#0FFH DEL2: MOV R7,#0FFH DJNZ R7,$ DJNZ R6,DEL2 DJNZ R5,DEL1 RET ;1秒延时子程序是以12MHz晶振 Delay1S:mov r1,#50 del0: mov r2,#91 del1: mov r3,#100 djnz r3,$ djnz r2,del1 djnz r1,del0 Ret ;1秒延时子程序是以12MHz晶振为例算指令周期耗时 KK: MOV R5,#10 ;1指令周期1 K1: MOV R6,#0FFH ;1指令周期10 K2: MOV R7,#80H ;1指令周期256*10=2560 K3: NOP ;1指令周期 128*256*10=327680 DJNZ R7,K3 ;2指令周期 2*128*256*10=655360 DJNZ R6,K2 ;2指令周期 2*256*10=5120 DJNZ R5,K1 ;2指令周期2*10=20 RET ;2指令周期21+10+2560+327680+655360+5120+20+2=990753 ;约等于1秒1秒=1000000微秒 ;这个算下来也只有0.998抄 T_0: MOV R7,#10; D1: MOV R6,#200; D2: MOV R5,#248; DJNZ R5,$ DJNZ R6,D2; DJNZ R7,D1; RET ;这样算下来应该是1.000011秒 T_0: MOV R7,#10; D1: MOV R6,#200; D2: NOP MOV R5,#248; DJNZ R5,$ DJNZ R6,D2; DJNZ R7,D1; RET DELAY_2S: ;10MS(11.0592mhz) MOV R3,#200 JMP DELAY10MS DELAY_100MS: ;100MS(11.0592mhz) MOV R3,#10 JMP DELAY10MS DELAY_10MS: MOV R3,#1 DELAY10MS: ;去抖动10MS (11.0592mhz) MOV R4,#20 DELAY10MSA: MOV R5,#247 DJNZ R5,$ DJNZ R4,DELAY10MSA DJNZ R3,DELAY10MS RET DELAY_500MS: ;500500MS MOV R2,#208 JMP DELAY_MS DELAY_175MS: ;175MS MOV R2,#73 JMP DELAY_MS delaY_120MS: ;120MS MOV R2,#50 JMP DELAY_MS delay_60ms: ;60ms MOV R2,#25 JMP DELAY_MS delay_30ms: ;30ms MOV R2,#12 JMP DELAY_MS DELAY_5MS: ;5MS MOV R2,#2 ;=================================== DELAY_MS: CALL DELAY2400 DJNZ R2,DELAY_MS RET ;=================================== DELAY2400: ;10x244+4=2447 /1.024=2390 MOV R0,#244 ;1 DELAY24001: MUL AB ;4 MUL AB ;4 DJNZ R0,DELAY24001 ;2 RET DELAY: ;延时子程序(1秒) MOV R0,#0AH DELAY1: MOV R1,#00H DELAY2: MOV R2,#0B2H DJNZ R2,$ DJNZ R1,DELAY2 DJNZ R0,DELAY1 RET MOV R2,#10 ;延时1秒 LCALL DELAY MOV R2,#50 ;延时5秒 LCALL DELAY DELAY: ;延时子程序 PUSH R2 PUSH R1 PUSH R0 DELAY1: MOV R1,#00H DELAY2: MOV R0,#0B2H DJNZ R0,$ DJNZ R1,DELAY2 ;延时 100 mS DJNZ R2,DELAY1 POP R0 POP R1 POP R2 RET 作者:whli 时间:2008-10-26 12:51:11
第 21 楼
不错,有收获。 作者:yysmcu 时间:2008-10-26 13:08:17
第 22 楼
不过是熟能生巧罢了 作者:ksf1006 时间:2008-11-2 9:27:27
第 23 楼
我建议定时器中断延时 作者:ksf1006 时间:2008-11-2 9:28:36
第 24 楼
我的QQ是262251919 多交流一下 啊 可以相互提高啊 作者:reader001 时间:2008-11-11 20:12:35
第 25 楼
软件和硬件都可以实现的 |
|
查看完整版本:[51单片机的延时程序该如何学习写呢?] |
| 所属版面:51单片机 本帖第1页 |
| 共有回复:24 共有页数:1 每页帖数:50 |
|
欢迎光临单片机论坛 网址:http://www.51hei.com/bbs/ |