一般情况下正常显示,东西-南北交替放行,各方向通行时间为30秒。有救护车或警车到达时,两个方向交通信号灯全为红色,以便让急救车或警车通过,设通行时间为10秒,之后交通恢复正常。用单次脉冲模拟急救车或警车申请外部中断。我的程序在第一次执行完中断之后会返回0000H处,不知道为什么,求指点 ORG 0000H AJMP MAIN ORG 0003H LJMP RED_INT ORG 0100HMAIN: SETB IT0 SETB EA SETB EX0 MOV A,#00HDELAY30: ;先亮27秒绿灯,再亮3秒黄灯 MOV R5,A MOV R3,#3 ;红绿灯十位 MOV R4,#0 ;红绿灯个位LP22: MOV DPTR,#LIGHT MOV A,R5 MOVC A,@A+DPTR MOV P1,ALP20: MOV DPTR,#TAB MOV A,R4 MOVC A,@A+DPTR MOV P0,A MOV A,R3 MOVC A,@A+DPTR MOV P2,A LCALL DELAY1 DEC R4 CJNE R4,#0FFH,LP21 MOV R4,#9 DEC R3 CJNE R3,#0FFH,LP20 INC R5 MOV A,R5 CJNE A,#4,DELAY30 MOV A,#00H LJMP DELAY30LP21: CJNE R4,#3,LP20 CJNE R3,#0,LP20 INC R5 LJMP LP22DELAY1: ;1S延时子程序 MOV R0,#10 MOV TMOD,#01HLP10: MOV TH0,#03CH MOV TL0,#0B0H SETB TR0LP12: JBC TF0,LP11 AJMP LP12LP11: DJNZ R0,LP10 CLR TR0 RETRED_INT: ;中断子程序 MOV SP,#60H PUSH PSW PUSH ACC PUSH 03H PUSH 04H PUSH 05H PUSH DPL PUSH DPH MOV 06H,P0 PUSH 06H MOV 06H,P1 PUSH 06H MOV 06H,P2 PUSH 06H CLR IE0 MOV A,#09H MOV P1,A MOV R3,#1 MOV R4,#0LPI1: MOV DPTR,#TAB MOV A,R4 MOVC A,@A+DPTR MOV P0,A MOV A,R3 MOVC A,@A+DPTR MOV P2,A LCALL DELAY1 DEC R4 CJNE R4,#0FFH,LPI1 MOV R4,#9 DEC R3 CJNE R3,#0FFH,LPI1 POP 06H MOV P2,06H POP 06H MOV P1,06H POP 06H MOV P0,06H POP DPH POP DPL POP 05H POP 04H POP 03H POP ACC POP PSW RETI TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH LIGHT: DB 11H,21H,0AH,0CH ;南北绿东西红,南北黄东西红,东西绿南北红,东西黄南北红END
谢谢 我按您的说法把SP放在主程序中之后,仿真时中断结束之后就卡在那不动了,LED显示不正常是为什么
追答http://blog.163.com/asm_c/blog/static/24820311320135257560639/
参考。
急求:单片机MS-51,用汇编语言编写程序的问题. 高手的高分,谢谢,
用B方法即可。但是乘以 3.53,还应该研究一下。实际上,不是255对应900,而是256对应900。那么:900 \/ 256 = 3.515 把0.015忽略,由此产生的误差,小于百分之一。那么,全部使用整数的运算,有:(0~255) * 35 = (0~8925)显示的时候,只是显示前3位,即可。--- 用8位的AD转换器,精度就...
51单片机的编程问题?
51单片机一个显著优点就是指令执行时间固定,因此可以适应时序要求严格的场合。例如符合ISO7816协议的cpu卡的读写,对时序要求比较严格。其实就是用io脚做出来的同步半双工串口。支持cpu卡的程序一般比较庞大,需要用c51来组织,但是由于c编译的不确定性,必须把底层程序封装成汇编语言模块嵌入到工程中。这就...
51单片机汇编语言中DEC指令问题:如果30H中为#00H,执行DEC 30H后,30H...
30H中为#00H,执行DEC 30H后,30H地址单元中是什么?--- 0000 0000减一后是1111 1111,也就是0FFH,也就是255。DEC 30H 指令不影响标志位,所以Cy、OV、Ac和P,都不变。只有运算功能的指令、比较指令影响标志位,INC\/DEC 指令是不影响标志位的。呵呵 ...
在51单片机的汇编语言中的双周期指令说第二个周期读入操作码并丢弃...
第一个问题:双周期指令,第二周期读的是操作数,只有在第一周期读操作码的,而有几条指令是单字节的,也需要两个周期,这不是浪费时间,是因一个周期是不能完成的,这不是你想像的那样。第二个问题:要做计时,不管是倒计时还是正常计时,用延迟函数来做,这种方法计时是不准确的,只有用定时器才...
51单片机编程题,用汇编语言怎么做?
ET0=1; TR0=1;} void timer0() interrupt 1 { TH0 = (65536-500)\/256; \/\/定时器装初值500, 1mS 中断一次 TL0 = (65536-500)%256;CP=~CP; \/\/改变脉冲信号的输出状态 } void main(){ Timer0_init();CP=0;while(1) { } } 汇编语言,才看到,算了,你别人的回答吧 ...
单片机汇编语言的几个疑问
我个人当初几乎都是这样找出的问题 大的汇编程序的调试确实比较麻烦,首先要求你对软件流程很清晰,对单片机的运行模式也要很了解。至于你现在的程序如果有问题,我建议还是采用仿真设断点的方式来找问题,尤其是如果搞单片机的时间不长的话,这样其实可能更快些。希望所说能对你有所帮助。
在51单片机中,用汇编语言,RLC A,为什么左移两位以后,不是两个灯点亮...
用RLC A左移,其中包括了进位位Cy了,A左移两位以后不一定变成11111100,因为原来Cy的状态未知,所以,不是亮两个LED,当然需要是LED的负极接在I\/O脚上,是0有效才能是输出0使LED亮。要保证变成11111100,需要这么写:CLR C RLC A CLR C RLC A 如果是循环左移的话,就写一对;MOV...
用汇编语言编写51单片机程序时候,读引脚要先写MOV P1,#0FFH,才能读引脚...
MOV P1,#0FFH 这就是锁存了,P1的8个脚全为高电平了。也就是置高了,置低也是这么写,只是立即数要有0,例如 MOV P1,#0FH,这是就是高四位置低电平,低四位置高电平。读引脚是:MOV A,P1,这是读8位 也可以只读一位 没有那么多的麻烦,别听网上或书上乱讲一通,就是两条MOV指令搞定了...
51单片机,C语言语句 P1^7=0,在汇编语言中,能否如此位操作,改怎么写这条...
C语言语句 P1^7=0,在汇编语言中是,CLR P1.7。C语言语句 P1^7=1,在汇编语言中是,SETB P1.7。CLR、SETB,就是:清零、置位。
在51单片机中,使用汇编语言,如何将十六进制数转换成十进制。
MOV R2, A, ;先清零 MOV R3, A,MOV R4, A,MOV R5, #16 ;共转换十六位数 LOOP:CLR C MOV A, R0 ;从待转换数的高端移出一位到Cy RLC A MOV R0, A MOV A, R1 RLC A MOV R1, A MOV A, R4 ;送到BCD码的低端 ADDC A, R4 ...