上图是我的电路图
下面是我根据2种不同的语言和2种不同的延时写的4个程序 但我仿真的时候不知道问啥时间总不对(现还没解决)
一种 循环汇编延时
Code:
- ORG 0100H ; 预留空间
- MAIN:
- LOOP:MOV P0,#0xf3h ;这两句的作用 让东位铺灯亮 南北红的亮
- ACALL DTIME
- MOV R0,#5 ;这几句的作用? 让东西黄灯,南北红的
- LOOP1:
- MOV P0,#0F5H
- ACALL DTIME1
- MOV P0,#0F7H
- ACALL DTIME1
- DJNZ R0,LOOP1
- MOV P0,#0DEH ;南北绿灯,东西红灯
- ACALL DTIME
- MOV R0,#5
- LOOP2: MOV P0,#0EEH ;南北黄灯闪,东西红灯
- ACALL DTIME1
- MOV P0,#0FEH
- ACALL DTIME1
- DJNZ R0,LOOP2
- JMP LOOP
- DTIME: ;延时
- MOV R5,#60
- x: MOV R7,#200
- DEL1: MOV R6,#248
- NOP
- DEL2: DJNZ R6,DEL2
- DJNZ R7,DEL1
- DJNZ R5,X
- RET;
- DTIME1:MOV r5,#5
- x1: MOV R7,#200 ;延时
- DEL3: MOV R6,#248
- NOP
- DEL4: DJNZ R6,DEL4
- DJNZ R7,DEL3
- djnz r5,x1
- RET;
- END
二种: 中断实现延时汇编
Code:
- ORG 0100H ; 预留空间
- START:
- LOOP:MOV P0,#11110011B ;这两句的作用? 让东位铺灯亮 南北红的亮
- ACALL DTIME
- MOV R0,#5 ;这几句的作用? 让东西黄灯,南北红的
- LOOP1:
- MOV P0,#0F5H
- ACALL DTIME1
- MOV P0,#0F7H
- ACALL DTIME1
- DJNZ R0,LOOP1
- MOV P0,#0DEH ;南北绿灯,东西红灯
- ACALL DTIME
- MOV R0,#5
- LOOP2: MOV P0,#0EEH ;南北黄灯闪,东西红灯
- ACALL DTIME1
- MOV P0,#0FEH
- ACALL DTIME1
- DJNZ R0,LOOP2
- JMP LOOP
- DTIME1: ;延时
- MOV TMOD,#01H
- MOV TH0,#3CH
- MOV TL0,#0B0H
- MOV R6,#50
- SETB TR0
- WM:JBC TF0,NEXT1
- AJMP WM
- NEXT1:DJNZ R6,NEXT2
- RET
- NEXT2:MOV TH0,#3CH
- MOV TL0,#0B0H
- AJMP WM
- RET;
- DTIME: MOV TMOD,#01H
- MOV TH0,#3CH
- MOV TL0,#0B0H
- MOV R6,#100
- MOV R7,#6
- SETB TR0
- LM:JBC TF0,NEXT
- AJMP LM
- NEXT:DJNZ R6,NEXT4
- DJNZ R7,NEXT3
- AJMP JS
- NEXT3:MOV R6,#100
- NEXT4:MOV TH0,#3CH
- MOV TL0,#0B0H
- AJMP LM
- JS:RET
- END
三种: keil c 循环实现延时
Code:
- #include <AT89X51.h>
- char c,x;
- bit f;
- char sum=0;
- xhd();
- dtime(unsigned int i)
- {unsigned char j;
- while(i--)
- {for(j=120;j>0;j--);}
- }
- main()
- {TMOD=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- P0=0xff;
- xhd();
- }
- xhd()
- {while(1)
- {
- P0=0xF3;
- dtime(600);
- for(x=0;x<3;x++)
- {
- P0=0xF5;
- dtime(150);
- P0=0xf7;
- dtime(150);
- }
- P0=0xde;
- dtime(600);
- for(x=0;x<3;x++)
- {
- P0=0xee;
- dtime(150);
- P0=0xfe;
- dtime(150);
- }
- }
- }
4 : keil c 中断实现延时
Code:
- #include <AT89X51.h>
- char c,x,r;
- bit f;
- char sum=0;
- xhd();
- main()
- {TMOD=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- P0=0xff;
- xhd();
- }
- void t()interrupt 1 using 1
- {TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- c++;
- if(c==r)
- { c=0;
- f=1;
- }
- }
- xhd()
- {while(1)
- {
- r=20;P0=0xF3;
- while(sum<10)
- {while(!f);
- f=0;
- sum++;
- }
- sum=0;
- for(x=0;x<3;x++)
- {
- r=8;P0=0xF5;
- while(sum<1)
- {while(!f);
- f=0;
- sum++;
- }
- sum=0;
- P0=0xf7;
- r=8;
- while(sum<1)
- {while(!f);
- f=0;
- sum++;
- }
- sum=0;
- }
- r=20;P0=0xde;
- while(sum<10)
- {while(!f);
- f=0;
- sum++;
- }
- sum=0;
- for(x=0;x<3;x++)
- {
- r=8;P0=0xee;
- while(sum<1)
- {while(!f);
- f=0;
- sum++;
- }
- sum=0;
- r=8;P0=0xf3;
- while(sum<1)
- {while(!f);
- f=0;
- sum++;
- }
- sum=0;
- }
- }
- }