交通灯(汇编语言)程序
- 格式:doc
- 大小:43.50 KB
- 文档页数:6
交通灯的汇编程序在本程序中,用到了8259A、8254、8255、键盘、数码显示管和LED灯等MY8255_A EQU 0600HMY8255_B EQU 0602HMY8255_C EQU 0604HMY8255_CON EQU 0606HA8254 EQU 06C0HB8254 EQU 06C2HC8254 EQU 06C4HCON8254 EQU 06C6HSSTACK SEGMENT STACK ;堆栈段DW 16 DUP(?)SSTACK ENDSDA TA SEGMENT ;数据段DTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB 7FH,6FH,77H,7CH,39H,5EH,79H,71HFM DB 05H,03H,05H,00H,00H,00H,00H;存储主干道的绿灯时间、黄灯时间和支干道的绿灯时间DA TA ENDS CODE SEGMENTASSUME CS:CODE,DS:DA TASTART: MOV AX,DA TAMOV DS,AXCALL JIACALL SONGCHU ;计时时间的初值送到数码管缓冲区PUSH DSMOV AX, 0000HMOV DS, AXMOV AX, OFFSET MIR7 ;取中断入口地址MOV SI, 003CH ;中断矢量地址MOV [SI], AX ;填IRQ7的偏移矢量MOV AX, CS ;段地址MOV SI, 003EHMOV [SI], AX ;填IRQ7的段地址矢量MOV AX, OFFSET SIR1 ;取中断入口地址MOV SI, 00C4H ;中断矢量地址MOV [SI], AX ;填SIR1的偏移矢量MOV AX, CS ;段地址MOV SI, 00C6HMOV [SI], AX ;填SIR1的段地址矢量CLIPOP DSMOV AL, 11H ;初始化主片8259OUT 20H, AL ;ICW1 边沿触发、需定义ICW4 MOV AL, 08HOUT 21H, AL ;ICW2 中断类型号基值为08H MOV AL, 04HOUT 21H, AL ;ICW3 IR2上接有从片MOV AL, 01HOUT 21H, AL ;ICW4 普通嵌套,普通EOI结束方式MOV AL, 11H ;初始化从片8259OUT 0A0H, AL ;ICW1 边沿触发、需定义ICW4MOV AL, 30HOUT 0A1H, AL ;ICW2 中断类型号基值为30HMOV AL, 02HOUT 0A1H, AL ;ICW3 接在主片的IR2端上MOV AL, 01HOUT 0A1H, AL ;ICW4 普通嵌套,普通EOI结束方式MOV AL, 0FDHOUT 0A1H,AL ;OCW1 允许从片8259A中断MOV AL, 6BH ;OCW1 允许主片8259A的IR7,IR2端中断OUT 21H, ALMOV CL,00H ;CL清零,用于计数STI ;开中断BEGIN: MOV DX,MY8255_CON ;写8255控制字MOV AL,81H ; A口工作在方式0,输出B口工作在方式0,输出OUT DX,AL ;C口的低四位作输出口CALL DIS ;调用显示子程序CALL CLEAR ;清屏CALL CCSCAN ;键盘扫描JNZ INK1 ;有键按下,转到INK1JMP BEGININK1: CALL DISCALL DALL Y ;调用延时程序CALL DALL YCALL CLEARCALL CCSCANJNZ INK2 ;有键按下,转到INK2JMP BEGIN;======================================== ;确定按下键的位置;======================================== INK2: MOV CH,0FEHMOV CL,00HCOLUM: MOV AL,CHMOV DX,MY8255_AOUT DX,AL ;把0EFH送到A口MOV DX,MY8255_CIN AL,DX ;读C口的数据L1: TEST AL,01H ;is L1?JNZ L2 ;不在第一行转到L2 MOV AL,00H ;L1JMP KCODE、L2: TEST AL,02H ;is L2?JNZ L3 ;不在第二行转到L3 MOV AL,04H ;L2JMP KCODEL3: TEST AL,04H ;is L3?JNZ L4 ;不在第三行转到L3 MOV AL,08H ;L3JMP KCODEL4: TEST AL,08H ;is L4?JNZ NEXT ;不在第四行转到NEXTMOV AL,0CH ;L4KCODE: ADD AL,CLCALL PUT ;调用修改计数时间的程序PUSH AXKON: CALL DISCALL CLEARCALL CCSCANJNZ KONPOP AXNEXT: INC CL ; CL加1MOV AL,CHTEST AL,08H ;检测CH的第五位上的值是否为1 JZ KERR ;不是1,转到KERRROL AL,1MOV CH,ALJMP COLUMKERR: JMP BEGINKAI: MOV DX, CON8254 ;初始化8254MOV AL, 36H ;选择计数器0,方式3,送16位初值,二进制计数OUT DX, ALMOV DX, A8254 ;送8254 A端口的地址MOV AL, 0E8H ;送低8位初值OUT DX, ALMOV AL, 03H ;送高8位初值OUT DX, ALMOV DX, CON8254 ;送8254控制端口的地址MOV AL, 76H ;计数器1,方式3,送16位初值,二进制计数OUT DX, ALMOV DX, B8254 ;送8254 B端口的地址MOV AL, 0E8H ;送低8位初值OUT DX, ALMOV AL, 03H ;送高8位初值OUT DX, ALAA1: NOPJMP AA1MIR7: STI ;开中断CALL DELAY ;调用延时程序2MOV AL,80H ;改变C口的输入输出方式MOV DX,MY8255_CONOUT DX,AL ;C口输出MOV AL,00HMOV SI,3003HMOV [SI],ALMOV [SI-1],AL ;数码管缓冲区3002H,3003H单元清零A4: ADD CL,01H ;CL 计数加1MOV DI,OFFSET FMCMP CL,[DI+3] ;判断CL中的值是否小于[DI+3]单元中的值JB A0CMP CL,[DI+4] ;判断CL中的值是否小于[DI+4]单元中的值JB A1CMP CL,[DI+5] ;判断CL中的值是否小于[DI+5]单元中的值JB A2CMP CL,[DI+6] ;判断CL中的值是否小于[DI+6]单元中的值JB A3MOV CL,00HJMP A4 ;CL清零,重新计数A3: JMP A6 ;用于中间跳转A0: MOV DX,MY8255_CMOV AL,84HOUT DX,AL ;主干道绿灯亮、支干道红灯亮MOV AL,[DI] ;取主干道绿灯计时初值ADD AL,1SUB AL,CLCALL CHU ;二进制数转换成BCD码MOV SI,3005HMOV [SI],AL ;十位上的数送到3005H存储单元MOV [SI-1],AH ;个位上的数送到3004H存储单元MOV AL,[DI+7] ;取支干道红灯总计时初值ADD AL,1SUB AL,CLCALL CHU ;二进制数转换成BCD码MOV [SI-4],AL ;十位上的数送到3001H存储单元MOV [SI-5],AH ;个位上的数送到3000H存储单元PUSH CXMOV CX,97HAS0: CALL DIS ;调用数码管显示程序LOOP AS0POP CXJMP A5 ;跳到A5,中断返回A1: MOV DX,MY8255_CMOV AL,44HOUT DX,AL ;主干道黄灯亮、支干道红灯亮MOV AL,[DI+1] ;取主干道黄灯计时初值MOV CH,CLSUB CH,[DI+3]SUB AL,CHCALL CHU ;二进制数转换成BCD码MOV SI,3005HMOV [SI],AL ;十位上的数送到3005H存储单元MOV [SI-1],AH ;个位上的数送到3004H存储单元MOV AL,[DI+7] ;取支干道总红灯计时初值ADD AL,1MOV CH,CLSUB AL,CHCALL CHU ;二进制数转换成BCD码MOV [SI-4],AL ;十位上的数送到3001H存储单元MOV [SI-5],AH ;个位上的数送到3000H存储单元PUSH CX MOV CX,97HAS1: CALL DIS ;调用数码管显示程序LOOP AS1POP CXJMP A5A2: MOV DX,MY8255_CMOV AL,30H ;主干道红灯亮、支干道绿灯亮OUT DX,ALMOV AL,[DI+8] ;取主干道红灯计时初值MOV CH,CLSUB CH,[DI+4]SUB AL,CHCALL CHU ;二进制数转换成BCD码MOV SI,3005HMOV [SI],AL ;十位上的数送到3005H存储单元MOV [SI-1],AH ;个位上的数送到3004H存储单元MOV AL,[DI+2] ;取支干道绿灯计时初值MOV CH,CLSUB CH,[DI+4]SUB AL,CHCALL CHU ;二进制数转换成BCD码MOV [SI-4],AL ;十位上的数送到3001H存储单元MOV [SI-5],AH ;个位上的数送到3000H存储单元PUSH CXMOV CX,97HAS2: CALL DIS ;调用数码管显示程序LOOP AS2POP CXJMP A5A6: MOV DX,MY8255_CMOV AL,28HOUT DX,AL ;主干道红灯亮、支干道黄灯亮MOV AL,[DI+8] ;取主干道红灯计时初值MOV CH,CLSUB CH,[DI+5]SUB AL,CHSUB AL,[DI+2]CALL CHU ;二进制数转换成BCD码MOV SI,3005HMOV [SI],AL ;十位上的数送到3005H存储单元MOV [SI-1],AH ;个位上的数送到3004H存储单元MOV AL,[DI+1] ;取支干道红灯计时初值MOV CH,CLSUB CH,[DI+5]SUB AL,CHCALL CHU ;二进制数转换成BCD码MOV [SI-4],AL ;十位上的数送到3001H存储单元MOV [SI-5],AH ;个位上的数送到3000H存储单元PUSH CXMOV CX,97HAS6: CALL DIS ;调用数码管显示程序LOOP AS6POP CXA5: MOV AL, 20HOUT 20H, AL ;中断结束命令IRETSIR1: STI ;开中断MOV DX,MY8255_CON ;写8255控制字MOV AL,81HOUT DX,ALMOV DX, CON8254 ;改变8254的工作方式MOV AL, 80H ;计数器0,方式3OUT DX, ALMOV DX, A8254MOV AL, 00HOUT DX, ALMOV AL, 00HOUT DX, ALCALL DELAYMOV DX,MY8255_CMOV AL,00HOUT DX,AL ; 8255的C口清零CALL SONGCHU ;存储区的时间初值送到数码管显示BEGIN3: CALL DIS ;调用显示子程序CALL CLEAR ;清屏CALL CCSCAN ;扫描JNZ INK3 ; 不等于0,跳到INK3 JMP BEGIN3INK3: CALL DISCALL DALL YCALL DALL YCALL CLEARCALL CCSCANJNZ INK4 ;有键按下,转到INK2 JMP BEGIN3INK4:JMP INK2 ;中间跳转MOV AL, 20H ;中断结束命令OUT 0A0H, ALOUT 20H, ALIRET;========================================; 计算主支干道的红灯时间,时间求和并且存储;========================================JIA: MOV DI,OFFSET FMMOV AL,[DI]ADD AL,1MOV BYTE PTR[DI+3],AL ;存储主干道的绿灯时间ADD AL,[DI+1]MOV BYTE PTR[DI+4],AL ;存储主干道绿灯时间加黄灯时间的和ADD AL,[DI+2]MOV BYTE PTR[DI+5],AL ;存储主干道绿灯时间,黄灯时间与支干道绿灯时;间三者之和ADD AL,[DI+1]MOV BYTE PTR[DI+6],AL ;存储主干道绿灯时间,支干道绿灯时;间与两个黄灯时间之和MOV AL,[DI]ADD AL,[DI+1]MOV BYTE PTR[DI+7],AL ;存储支干道红灯时间MOV AL,[DI+1]ADD AL,[DI+2]MOV BYTE PTR[DI+8],AL ;存储主干道红灯时间RETCHU: MOV AH,00H ;把二进制数转换成BCD码MOV CH,0AH DIV CHRETCHENG: MOV CH,0AH ;把BCD码转换成二进制数MOV CL,AH MUL CHADD AL,CLRET;========================================; ;计时时间送到数码管缓冲区的程序;======================================== SONGCHU: MOV BX,OFFSET FMMOV AL,[BX] ;取主干道的绿灯时间MOV SI,3005HCALL CHU ;把二进制数转换成BCD码MOV [SI],ALMOV [SI-1],AHMOV AL,[BX+1] ;取主支干道的黄灯时间CALL CHU ;把二进制数转换成BCD码MOV [SI-2],ALMOV [SI-3],AHMOV AL,[BX+2] ;取支干道的绿灯时间CALL CHU ;把二进制数转换成BCD码MOV [SI-4],ALMOV [SI-5],AHRET;======================================== ;把修改的计数时间重新送回存储区的程序;======================================== FANHUI: MOV SI,3005HMOV BX,OFFSET FM ;取时间存储区的偏移地址MOV AL,[SI]MOV AH,[SI-1]CALL CHENG ;调用BCD码转换成二进制数的程序MOV BYTE PTR[BX],AL ;把修改的主干道绿灯时间存储MOV AL,[SI-2]MOV AH,[SI-3]CALL CHENG ;调用BCD码转换成二进制数的程序MOV BYTE PTR[BX+1],AL ;把修改的黄灯时间存储MOV AL,[SI-4]MOV AH,[SI-5]CALL CHENG ;调用BCD码转换成二进制数的程序MOV BYTE PTR[BX+2],AL ;把修改的支干道绿灯时间存储RET;========================================;键盘扫描子程序;========================================CCSCAN: MOV AL,00HMOV DX,MY8255_AOUT DX,ALMOV DX,MY8255_CIN AL,DX ;读C口的值NOT ALAND AL,0FHRET;======================================== ;清屏子程序;======================================== CLEAR: MOV DX,MY8255_BMOV AL,00HOUT DX,AL ;把00H送到B口,是数码管显示为0 RET;======================================== ;显示子程序;======================================== DIS: PUSH AXMOV SI,3000HMOV DL,0DFHMOV AL,DLAGAIN: PUSH DXMOV DX,MY8255_AOUT DX,AL ;把0DH送到A口,选中某一个显示数码管MOV AL,[SI] ;取缓冲区已存入的值MOV BX,OFFSET DTABLE ;取七段码的偏移地址AND AX,00FFHADD BX,AXMOV AL,[BX] ; 取与缓冲区的值相对应的七段码MOV DX,MY8255_BOUT DX,AL ;把七段码的值送到B口显示CALL DALL Y ;调用延时程序1INC SIPOP DXMOV AL,DLTEST AL,01HJZ OUT1 ;等于0,转到OUT1ROR AL,1MOV DL,ALJMP AGAINOUT1: POP AXRET;====== 延时子程序1 ====== ;用在数码管显示程序中DALL Y: PUSH CXMOV CX,0005HT1: MOV AX,009FHT2: DEC AXJNZ T2LOOP T1POP CXRET;====== 延时子程序2 ======DELAY: PUSH CXMOV CX, 0F00HAA0: PUSH AXPOP AXLOOP AA0POP CXRET;======================================== ;根据键盘值,修改计时时间并存储的程序;======================================== PUT: CMP AL,01H ;判断按键值是否为1?JNZ Q1CALL S1 ;是1,主干道绿灯时间加1JMP QQ1: CMP AL,02H ;判断按键值是否为2?JNZ Q2CALL S2JMP Q ;是2,主干道绿灯时间减1Q2: CMP AL,05H ;判断按键值是否为5?JNZ Q3CALL S3 ;是5,主支干道黄灯时间加1 JMP Q Q3: CMP AL,06H ;判断按键值是否为6?JNZ Q4CALL S4 ;是6,主干道绿灯时间减1JMP QQ4: CMP AL,09H ;判断按键值是否为9?JNZ Q5CALL S5 ;是9,支干道绿灯时间加1JMP QQ5: CMP AL,0AH ;判断按键值是否为10? JNZ Q6CALL S6 ;是10,支干道绿灯时间减1JMP QQ6: CMP AL,0CH ;判断按键值是否为12(确定键)?JNE QJMP KAI ;是12,跳到KAI处执行主程序Q: RET ;子程序返回;========================================; 主干道的绿灯时间加1,并存储;========================================S1: MOV SI,3005HMOV AL,[SI-1]ADD AL,1CMP AL,09HJBE SS1MOV CL,[SI]ADD CL,1MOV [SI],CLMOV AL,00HSS1: MOV [SI-1],ALCALL FANHUICALL SONGCHUCALL JIARET;======================================== ; 主干道的绿灯时间减1,并存储;======================================== S2: MOV SI,3005HMOV AL,[SI-1]CMP AL,00HJE SS2SUB AL,1CMP AL,00HJAE SS7SS2: MOV CL,[SI]MOV AL,CLSUB AL,1MOV [SI],ALMOV AL,09HSS7: MOV [SI-1],ALCALL FANHUICALL SONGCHUCALL JIARET;======================================== ; 主支干道的黄灯时间加1,并存储;======================================== S3: MOV SI,3002HMOV AL,[SI]ADD AL,1CMP AL,09HJBE SS3MOV CL,[SI+1]ADD CL,1MOV [SI+1],CLMOV AL,00HSS3: MOV [SI],ALCALL FANHUICALL SONGCHUCALL JIARET;======================================== ; 主支干道的黄灯时间减1,并存储;======================================== S4: MOV SI,3002HMOV AL,[SI]CMP AL,00HJE SS4SUB AL,1CMP AL,00HJAE SS8SS4: MOV CL,[SI+1]SUB CL,1MOV [SI+1],CLMOV AL,9SS8: MOV [SI],ALCALL FANHUICALL SONGCHUCALL JIARET;======================================== ; 支干道的绿灯时间加1,并存储;======================================== S5: MOV SI,3000HMOV AL,[SI]ADD AL,1CMP AL,09HJBE SS5MOV CL,[SI+1]ADD CL,1MOV [SI+1],CLMOV AL,00HSS5: MOV [SI],ALCALL FANHUICALL SONGCHUCALL JIARET;======================================== ;支干道的绿灯时间减1,并存储;======================================== S6: MOV SI,3000HMOV AL,[SI]CMP AL,00HJE SS9SUB AL,1CMP AL,00HJAE SS6SS9: MOV CL,[SI+1]SUB CL,1MOV [SI+1],CL MOV AL,09HSS6: MOV [SI],AL CALL FANHUI CALL SONGCHU CALL JIARETCODE ENDSEND START。
设计报告一、设计方法:1、通过老师上课讲的内容及要求来设计。
2、开始时可跟着老师走从基础使用4094实现倒计时开始一步一步实现。
3、实现基础部分后我们就可按着自己的思路结合单片机的学习从而一步一步实现整个功能。
二、设计思路:1、首先在实现整个功能之前我并不清楚自己要设计的界面应是什么样子的,我从最基本的开始先学会使用4094实现一位倒计时,然后使用4094实现两位倒计时,实现了两位倒计时之后基本上就可以实现四个路口的倒计时显示。
2、完成基本型后就要想办法如何才能实现在线修改参数,且按照新的参数执行,而且参数用什么来设置等等,通过单片机的学习我想到了用中断方式的方法来实现,且在中断里来调用子程序来设置参数,并选用了键盘来设置参数。
因为单片机里已学过键盘子程序,现在再来使用这样的键盘,虽比单片机里学过的4*4键盘复杂点,但总不会太难了。
就这样一步一步按照自己的思路完成。
3、以上实现后,我们也可多加些按键来控制暂停、复位、行人按键等等,而这些在完成以上功能后再来实现它们就会很容易了。
流程图:三、选择的芯片:AT89C51、4094、KEYPAD-PHONE、LED-GREEN、LED-RED、LED-YELLOW、TSEG-COM-AN-GRN、3WATT100R、BUTTON 四、硬件设计:五、软件设计:1、部分代码:;30H、34H、35H主干道红、绿、黄灯,33H、31H、32H支干道红、绿、黄灯,修改用外部中断ORG 0000HLJMP MAINORG 0003H ;复位中断入口地址LJMP FWORG 0013H ;修改参数中断入口地址LJMP XGORG 0030HMAIN:MOV 30H,#50MOV 31H,#30MOV 32H,#20MOV 33H,#40MOV 34H,#32MOV 35H,#08LOOP: SETB IT0 ;设置外部中断0的触发方式SETB IT1 ;设置外部中断1的触发方式SETB EX0 ;开启外部中断0SETB EX1 ;开启外部中断1SETB PX0 ;设置优先级CLR PX1SETB EA ;开启总中断STAR1:MOV 40H,30HMOV 41H,31HMOV 42H,32HMOV 43H,33HMOV 44H,34HMOV 45H,35H;主干道的红与支干道的绿ZHUHO:CLR P2.7 ;关门,减震作用MOV 46H,#0F5H ;显示LED亮与灭MOV A,40H ;显示主干道的红灯参数LCALL XSLCALL LPMOV A,41H ;显示支干道的绿灯参数LCALL XSLCALL LOPSETB P2.7 ;开门,减震作用LCALL DELAYDEC 40H ;倒计时JNB P1.7,ZHIHODJNZ 41H,ZHUHOCLR P2.7MOV A,40H ;显示主干道的红灯参数LCALL XSLCALL LPMOV A,41H ;显示支干道的绿灯参数LCALL XSLCALL LOPSETB P2.7LCALL DELAY;主干道的红与支干道的黄ZIHU:CLR P2.7MOV 46H,#0F6H ;显示LED亮与灭MOV A,42H ;显示主干道的红灯参数LCALL XSLCALL LPMOV A,42H ;显示支干道的黄灯参数LCALL XSLCALL LOPSETB P2.7LCALL DELAYJNB P1.7,ZHIHO ;倒计时DJNZ 42H,ZIHUCLR P2.7MOV A,42H ;显示主干道的红灯参数LCALL XSLCALL LPMOV A,42H ;显示支干道的黄灯参数LCALL XSLCALL LOPSETB P2.7LCALL DELAY;支干道的红与主干道的绿ZHIHO:CLR P2.7MOV 46H,#0EBH ;显示LED亮与灭MOV A,43H ;显示支干道的红灯参数LCALL XSLCALL LOPMOV A,44H ;显示主干道的绿灯参数LCALL XSLCALL LPSETB P2.7LCALL DELAYDEC 43HDJNZ 44H,ZHIHOCLR P2.7MOV A,43H ;显示支干道的红灯参数LCALL XSLCALL LOPMOV A,44H ;显示主干道的绿灯参数LCALL XSLCALL LPSETB P2.7LCALL DELAY;支干道的红与主干道的黄ZUHU:CLR P2.7MOV 46H,#0DBH ;显示LED亮与灭MOV A,45H ;显示支干道的红灯参数LCALL XSLCALL LOPMOV A,45H ;显示主干道的黄灯参数LCALL XSLCALL LPSETB P2.7LCALL DELAYDJNZ 45H,ZUHUCLR P2.7MOV A,45H ;显示支干道的红灯参数LCALL XSLCALL LOPMOV A,45H ;显示主干道的黄灯参数LCALL XSLCALL LPSETB P2.7LCALL DELAYLJMP STAR1XG:JB P3.3,EXIT ;修改参数中断服务子程序MOV A,#00H ;使数码管都显示00MOV 46H,#0FFH ;使LED都灭LCALL XSLCALL LPLCALL LOPSJMP FCZFW:CLR EA ;复位中断服务子程序MOV A,#88MOV 46H,#0FFHLCALL XSLCALL LPLCALL LOP;产生中断后对参数重新赋初值FCZ:MOV P0,#0F9HMOV P2,#0BFHLCALL LKEY1 ;设置第一个参数MOV 30H,20HMOV P0,#0A4HMOV P2,#0BFHLCALL LKEY1 ;设置第二个参数MOV 31H,20HMOV P0,#0B0HMOV P2,#0BFHLCALL LKEY1 ;设置第三个参数MOV 33H,20HMOV P0,#99HMOV P2,#0BFHLCALL LKEY1 ;设置第四个参数MOV 34H,20HMOV A,30HSUBB A,31HMOV 32H,AMOV A,33HSUBB A,34HMOV 35H,AMOV 40H,30HMOV 41H,31HMOV 42H,32HMOV 43H,33HMOV 44H,34HMOV 45H,35HMOV P0,#0FFHMOV P2,#0FFHEXIT:RETI ;中断返回DELAY:MOV R3,#10 ;延时0.5s子程序MOV TMOD,#01HMOV TH0,#3CHMOV TL0,#0B0HSETB TR0LOOP1:JBC TF0,LOOP2SJMP LOOP1LOOP2:MOV TH0,#3CHMOV TL0,#0B0HDJNZ R3,LOOP1CLR TR0RETXS:MOV DPTR,#TAB ;显示子程序MOV B,#10DIV ABMOVC A,@A+DPTRMOV R5,AMOV A,BMOVC A,@A+DPTRMOV R6,ARETTAB: DB 0C0H,0F9H,0A4H,0B0HDB 99H,92H,82H,0F8HDB 80H,90H,88H,83HDB 0C6H,0A1H,86H,8EHLP:CLR C ;4094主干道显示两位倒计时子程序MOV R0,#08HMOV A,R6LP1:CLR P3.7RLC AMOV P3.6,CSETB P3.7DJNZ R0,LP1MOV A,R5MOV R0,#08HLP2:CLR P3.7RLC AMOV P3.6,CSETB P3.7DJNZ R0,LP2RETLOP:CLR C ;4094支干道显示两位数倒计时子程序MOV R0,#08HMOV A,R6LOP1:CLR P3.5RLC AMOV P3.4,CSETB P3.5DJNZ R0,LOP1MOV A,R5MOV R0,#08HLOP2:CLR P3.5RLC AMOV P3.4,CSETB P3.5DJNZ R0,LOP2XP2:MOV R0,#08H ;四个路口红绿灯LED显示器子程序MOV A,46HLP5:CLR P3.1RLC AMOV P3.0,CSETB P3.1DJNZ R0,LP5RET;键盘扫描子程序KEY16:LCALL KS ; 读键盘JZ KEY16 ; 判是否有键按下,A=0表示无键按下,再读LCALL T10MS ; 延时LCALL KS ; 有键按下的话,再读一次,消除抖动JZ KEY16 ; 判是否有键按下,A=0表示无键按下,再读MOV R2,#0EFH ; 列扫描初值,11101111MOV R4,#00H ; 列扫描计数单元置"0"; 下面进行列扫描(0~3)、读行值(01、04、07、0FF)LK1:MOV P1,R2 ; P1.4=0, 扫描第一列JB P1.0,ONE ; 判是否第0行健按下,否判下一行MOV A,#01H ; 是,行值"01"LJMP KPONE:JB P1.1,TWO ; 判是否第1行健按下,否判下一行MOV A,#04H ;是,行值"04"LJMP KPTWO:JB P1.2,THREE ; 判是否第2行健按下,否判下一行MOV A,#07H ; 是,行值"07"LJMP KPTHREE:JB P1.3,NEXT ; 判是否第3行健按下,否则扫描下一列MOV A,#0FFH ; 是,行值"0ff"LJMP KPNEXT:INC R4 ; 列计数加1MOV A,R2 ; 行扫描完,列移位,继续JNB ACC.6,KND ; 判是否列扫描结束RL A ; 左移,扫下一列MOV R2,AAJMP LK1 ; 转下一列读键KND:AJMP KEY16KP:ADD A,R4 ; 生成键值,A=行基值+列值(0~3)PUSH ACCLK:LCALL KSJNZ LKPOP ACCSETB P1.7RETT10MS:MOV R7,#10H ;T10ms延时子程序TS1:MOV R6,#0FFHTS2:NOPNOPDJNZ R6,TS2DJNZ R7,TS1RETKS:MOV P1,#0FH ; 判有无键按下子程序MOV A,P1CPL AANL A,#0FHRETLKEY1:MOV A,#0LCALL KEY16 ; 读第一个数CJNE A,#0AH,LKEY2 ; 键值>9则重读键SJMP LKEY1LKEY2:JNC LKEY1MOV R0,A ; 保存第一个数SWAP ALCALL XSP0P2 ; 显示第一个数LKEY3:MOV A,#0LCALL KEY16 ; 读第二个数CJNE A,#0AH,LKEY4 ; 键值>9(非数字键)则重读键SJMP LKEY3SJMP LKEY3LKEY4:JNC LKEY3MOV R1,A ; 第二个数存入B中MOV A,R0 ; 取第一个数SWAP A ; 换到高位ADD A,R1 ; 第二个数(低位)与第一个数(高位)合并MOV 20H,APUSH AMOV A,R0MOV B,#10MUL ABADD A,R1MOV 20H,APOP ALCALL XSP0P2 ; 显示两个数JB P1.3,$ ;判确定键有没按下RETXSP0P2:PUSH B ;显示子程序MOV DPTR,#XSTAB ; 取数据表首地址MOV B,A ; 保存原数据ANL A,#0FH ; 截取低4位数MOVC A,@A+DPTR ; 取显示字型码MOV P0,A ; 送P0显示MOV A,B ; 取原数据ANL A,#0F0H ; 截取高4位SWAP A ; 半字节交换MOVC A,@A+DPTR ; 取显示段码MOV P2,A ; 送P2显示MOV A,BPOP BRETXSTAB: DB 0C0H,0F9H,0A4H,0B0HDB 99H,92H,82H,0F8HDB 80H,90H,88H,83HDB 0C6H,0A1H,86H,8EHEND六、时间安排:1、要完成这个项目我们只有两个周的时间,第一个周我们完成了基本的用4094实现两位数的倒计时,并实现基本的十字路口,两路显示,能够实现最基本的运行。
交通灯汇编语言课程设计【精选文档】(文档可以直接使用,也可根据实际需要修改使用,可编辑推荐下载)课程设计说明书题目交通灯系统设计系(部) 信息工程系专业电气工程及其自动化班级学生姓名学号07081232712 月7 日至12 月18 日共 2 周指导教师(签字)系主任(签字)2009年12 月 4 日课程设计任务书题目交通灯系统设计系(部) 信息工程系专业电气工程及其自动化班级学生姓名学号07081232712 月7 日至12 月18 日共 2 周指导教师(签字)系主任(签字)2009年12 月 4 日成绩评定表目录一、设计任务与要求 (1)1、设计任务与要求的分析 (1)二、软件设计 (2)1、显示原理 (2)2、计数器初值计算 (2)3、每秒钟的设定 (2)4、控制系统、时间显示模块 (3)三、硬件电路设计 (5)1、74LS164的应用 (5)2、LED显示器件工作原理 (5)四、安装与调试 (5)五、结论与心得 (7)六、参考文献 (7)附录:1、源程序2、系统原理图摘要本系统由单片机系统、键盘、LED 显示、数码管显示、交通灯演示系统组成。
系统除基本交通灯功能外,还具有倒计时、时间设置、信号灯闪烁、信号灯颜色分时亮、分时段调整信号灯的点亮时间等功能。
同时给出了软硬件设计方法,设计过程包括硬件电路设计和程序设计两大步骤,关键词:AT80C51单片机、交通灯控制系统、定时循环、数码管显示、延时。
一、设计任务与要求假设一个十字路口为东西南北走向。
开始为四个路口的红灯全部亮之后,东西路口的绿灯亮,南北路口的红灯亮,东西路口方向通车,延时一段时间后(20秒),东西路口的绿灯,闪烁若干次后(3秒),东西路口的绿灯熄灭,同时东西路口的黄灯亮,延时一段时间后(2秒),东西路口的红灯亮,南北路口的绿灯亮,南北路口方向通车,延时一段时间后(20秒),南北路口的绿灯闪烁若干次后(3秒),南北路口的绿灯熄灭,同时南北路口的黄灯亮,延时一段时间后(2秒),再切换到东西路口的绿灯亮,南北路口的红灯亮,之后重复以上过程。
ORG 0000HA_BIT EQU 20H ;用于存放南北十位数B_BIT EQU 21H ;用于存放南北十位数C_BIT EQU 22H ;用于存放东西十位数D_BIT EQU 23H ; 用于存放东西位数TEMP1 EQU 24H ;用于存放第一二南北状态要显示的时间TEMP2 EQU 25H ;用于存放第一二东西状态要显示的时间TEMP3 EQU 26H ;用于存放第三第四南北状态要显示的时间TEMP4 EQU 27H;用于存放第三第四南北状态要显示的时间LJMP MAINORG 0003H ;外部中断0入口LJMP INT0 ;跳转到外部0中断ORG 0013H ;外部中断1入口LJMP INT1 ;跳转到外部1中断INT0: MOV A,P1 ;外部0中断PUSH ACCMOV A,P2 ;中断保护PUSH ACCMOV P1,#0FFH ;清除先前状态MOV P2,#0FFHCLR P1.0CLR P1.4 ;南北通行,东西禁止通行CLR P1.6CLR P2.3JNB P3.2 ,$ ;判断是否还在中断状态POP ACCMOV P2,A ;返回中断前状态POP ACCMOV P1,ACCRETI ;中断返回INT1:MOV A,P1 ;外部1中断PUSH ACC ;中断保护MOV A,P2PUSH ACCMOV P1,#0FFH ;清除先前状态MOV P2,#0FFHCLR P1.2CLR P2.1CLR P1.3 ;东西通行,南北禁止通行CLR P1.5JNB P3.3 ,$ ;判断是否还在中断状态POP ACCMOV P2,A ;返回中断前状态POP ACCMOV P1,ARETI ;中断返回MAIN:ORG 0100H ;初始情况MOV P1,#0FFHMOV P2,#0FFH ;灭所有灯MOV TMOD,#55H ;计数方式方式1MOV IE,#85H ;开中断MOV TEMP1,#20 ;MOV TEMP2,#25MOV TEMP3,#25MOV TEMP4,#20STAR:MOV P1,#0FFHMOV P2,#0FFH ;灭所有灯MOV A,24H ;将显示时间送ACJNE A,#20,T40T ;判断时间,选初始值T20T: ;南北通行要显示的时间为20的计数器初始值CLR TF0 ;清TF0CLR TF1 ;清TF1MOV TH1 ,#0FFH ;送20秒时的初始值MOV TL1 ,#0FCH ;在些设计20秒6辆为多车MOV TH0 ,#0FFHMOV TL0 ,#0FCHLJMP TEMP20 ;跳到20秒T40T: ;南北通行要显示的时间为40的计数器初始值CLR TF0 ;清TF0CLR TF1 ;清TF1MOV TH1,#0FFH ;送40秒时的初始值MOV TL1 ,#0F8H ;在些设计40秒8辆为多车MOV TH0 ,#0FFHMOV TL0 ,#0F8HLJMP TEMP40 ;跳到40秒TEMP20: ;TEMP1=20情况SETB TR0 ;开始计数SETB TR1CLR P1.2CLR P2.1 ;南北通行,东西禁止通行CLR P1.3CLR P1.5MOV TEMP1,#20 ;南北要显示的时间,MOV TEMP2,#25 ;东西要显示的时间STLOP:ACALL DISPLAY1 ;调用显示DEC TEMP1 ;时间够一秒显示时间减1DEC TEMP2MOV A,TEMP1CJNE A,#0,NEXT ;若显示时间不为0保持现在状态LJMP STAR2 ;若显示时间为 0跳到第二状态NEXT: LJMP STLOPSTAR2: ;状态1SETB P1.2CLR P1.1 ;南北黄灯,东西禁止通行SETB P1.3CLR P1.4MOV TEMP1,#05 ;南北要显示的时间,MOV TEMP2,#05 ;东西要显示的时间,STLOP2:ACALL DISPLAY1 ;调用显示DEC TEMP1 ;时间够一秒显示时间减1DEC TEMP2MOV A,TEMP1CJNE A,#0,NEXT2 ;若显示时间不为0保持现在状态JB TF1 ,T40 ;判断南北是否多车JB TF0 ,T40 ;判断北南是否多车MOV TEMP1,#20 ;少车下次显示时间为20秒LJMP STAR3 ;跳到状态3T40:MOV TEMP1,#40 ; 多车下次显示时间为40秒LJMP STAR3 ;若显示时间为 0跳到第三状态NEXT2:LJMP STLOP2TEMP40:;TEM=40 程序SETB TR0 ; 开始计数SETB TR1CLR P1.2CLR P2.1 ;南北通行,东西禁止通行CLR P1.3CLR P1.5MOV TEMP1,#40 ;南北要显示的时间,MOV TEMP2,#45 ;东西要显示的时间STLOP11:ACALL DISPLAY1 ;调用显示DEC TEMP1 ;时间够一秒显示时间减1DEC TEMP2MOV A,TEMP1CJNE A,#0,NEXT11 ;若显示时间不为0保持现在状态LJMP STAR22 ;若显示时间为 0跳到第二状态NEXT11: LJMP STLOP11STAR22: ;状态1SETB P1.2CLR P1.1 ;南北黄灯,东西禁止通行SETB P1.3CLR P1.4MOV TEMP1,#05 ;南北要显示的时间,MOV TEMP2,#05 ;东西要显示的时间,STLOP22:ACALL DISPLAY1 ;调用显示DEC TEMP1 ;时间够一秒显示时间减1DEC TEMP2MOV A,TEMP1CJNE A,#0,NEXT22 ;若显示时间不为0保持现在状态JB TF1 ,T401 ; 判断是否多车JB TF0 ,T401MOV TEMP1,#20 ;少车下次显示时间为20秒LJMP STAR3T401:MOV TEMP1,#40 ;多车下次显示时间为40秒LJMP STAR3 ;若显示时间为 0跳到第三状态NEXT22:LJMP STLOP22STAR3:MOV A,26HCJNE A,#25,T40T1 ;判断时间,选初始值T20T1: ;南北通行要显示的时间为20的计数器初始值CLR TF0 ; 清溢出位CLR TF1MOV TH1 ,#0FFH ; 给初值MOV TL1 ,#0FCHMOV TH0 ,#0FFHMOV TL0 ,#0FCHLJMP TEMP320T40T1: ;南北通行要显示的时间为40的计数器初始值CLR TF0 ;CLR TF1MOV TH1,#0FFH ;给初值MOV TL1 ,#0F8HMOV TH0 ,#0FFHMOV TL0 ,#0F8HLJMP TEMP340TEMP320:;状态三SETB TR1 ;南北停止计数SETB TR0 ;东西开始计数SETB P1.1 ;东西通行,南北禁止通行CLR P1.0CLR P1.0SETB P1.5CLR P1.6SETB P2.1CLR P2.3MOV TEMP3,#25 ;南北要显示的时间,MOV TEMP4,#20 ;东西要显示的时间,STLOP33:ACALL DISPLAY ;调用显示DEC TEMP3 ;时间够一秒显示时间减1DEC TEMP4MOV A,TEMP4CJNE A,#0,NEXT33 ;若显示时间不为0保持现在状态LJMP STAR34 ;若显示时间为 0跳到第四状态NEXT33:LJMP STLOP33STAR34: ;状态四SETB P2.3CLR P2.2SETB P1.6 ;东西黄灯,南北禁止通行CLR P1.5MOV TEMP3,#05 ;南北要显示的时间,MOV TEMP4,#05 ;东西要显示的时间,STLOP34:ACALL DISPLAY ;调用显示DEC TEMP3 ;时间够一秒显示时间减1DEC TEMP4MOV A,TEMP4CJNE A,#0,NEXT34 ;若显示时间不为0保持现在状态JB TF1 ,T402JB TF0 ,T402MOV TEMP3,#25LJMP START402:MOV TEMP3,#45LJMP STARNEXT34: LJMP STLOP34TEMP340 :SETB TR1 ;南北停止计数SETB TR0 ;东西开始计数SETB P1.1 ;东西通行,南北禁止通行CLR P1.0SETB P1.1CLR P1.0CLR P1.6SETB P2.1CLR P2.3MOV TEMP3,#45 ;南北要显示的时间,MOV TEMP4,#40 ;东西要显示的时间,STLOP43:ACALL DISPLAY ;调用显示DEC TEMP3 ;时间够一秒显示时间减1DEC TEMP4MOV A,TEMP4CJNE A,#0,NEXT43 ;若显示时间不为0保持现在状态LJMP STAR44 ;若显示时间为 0跳到第四状态NEXT43:LJMP STLOP43STAR44: ;状态四SETB P2.3CLR P2.2SETB P1.6 ;东西黄灯,南北禁止通行CLR P1.5MOV TEMP3,#05 ;南北要显示的时间,MOV TEMP4,#05 ;东西要显示的时间,STLOP44:ACALL DISPLAY ;调用显示DEC TEMP3 ;时间够一秒显示时间减1DEC TEMP4MOV A,TEMP3CJNE A,#0,NEXT44 ;若显示时间不为0保持现在状态JB TF1 ,T403JB TF0 ,T403MOV TEMP3,#25LJMP START403:MOV TEMP3,#45LJMP STARNEXT44: LJMP STLOP44;显示DISPLAY1:MOV A,TEMP1 ;将南北要显示的数存放到AMOV B,#10 ;B=10DIV AB ;A除以B商存A,余数BMOV B_BIT,A ; 将A放到20HMOV A_BIT,B ;将B放到21HMOV A,TEMP2 ;将东西要显示的数存放到AMOV B,#10 ;B=10DIV AB ;A除以B商存A,余数B MOV C_BIT,A ;将A放到22HMOV D_BIT,B ;将B放到23HMOV DPTR ,#NUMT ;MOV R0,#2 ;R0=2DPL11: MOV R1,#250 ;R1=250DPLOP1:MOV A,A_BIT ;将南北要显示的10位数送A MOVC A,@A+DPTR ;查表MOV P0,A ;显示南北10位数CLR P2.7ACALL D1MS;延时1MSSETB P2.7 ;灭南北10位数MOV A,B_BIT ;将南北要显示的个位数送A MOVC A,@A+DPTR ;查表MOV P0,A ;显示南北个位数CLR P2.6ACALL D1MS ;延时1MSSETB P2.6 ;灭南北个位数MOV A,C_BIT ;将东西要显示的10位数送A MOVC A,@A+DPTR ;查表MOV P0,A ;显示东西10位数CLR P2.5ACALL D1MS ;延时1MSSETB P2.5 ;灭东西10位数MOV A,D_BIT ;将东西要显示的个位数送A MOVC A,@A+DPTR ;查表MOV P0,A ;显示东西东西位数CLR P2.4ACALL D1MS ;延时1MSSETB P2.4 ;灭东西个位数DJNZ R1,DPLOP ;循环扫描DJNZ R0,DPL1RET ;等待1秒返回;显示DISPLAY:MOV A,TEMP3 ;将南北要显示的数存放到A MOV B,#10 ;B=10DIV AB ;A除以B商存A,余数BMOV B_BIT,A ; 将A放到20HMOV A_BIT,B ;将B放到21HMOV A,TEMP4 ;将东西要显示的数存放到A MOV B,#10 ;B=10DIV AB ;A除以B商存A,余数BMOV C_BIT,A ;将A放到22HMOV D_BIT,B ;将B放到23HMOV DPTR ,#NUMT ;MOV R0,#2 ;R0=2DPL1: MOV R1,#250 ;R1=250DPLOP:MOV A,A_BIT ;将南北要显示的10位数送A MOVC A,@A+DPTR ;查表MOV P0,A ;显示南北10位数CLR P2.7ACALL D1MS;延时1MSSETB P2.7 ;灭南北10位数MOV A,B_BIT ;将南北要显示的个位数送A MOVC A,@A+DPTR ;查表MOV P0,A ;显示南北个位数CLR P2.6ACALL D1MS ;延时1MSSETB P2.6 ;灭南北个位数MOV A,C_BIT ;将东西要显示的10位数送A MOVC A,@A+DPTR ;查表MOV P0,A ;显示东西10位数CLR P2.5ACALL D1MS ;延时1MSSETB P2.5 ;灭东西10位数MOV A,D_BIT ;将东西要显示的个位数送A MOVC A,@A+DPTR ;查表MOV P0,A ;显示东西东西位数CLR P2.4ACALL D1MS ;延时1MSSETB P2.4 ;灭东西个位数DJNZ R1,DPLOP ;循环扫描DJNZ R0,DPL1RET ;等待1秒返回D1MS: MOV R7,#250 ;1MS延时程序DJNZ R7,$RET;1到10对应电路图数码管表NUMT: DB 7EH,48H,67H,6BH,59HDB 3BH,3FH,68H,7FH,7BH。
题目:智能交通灯控制系统班级:p09电气四班姓名:刘强0903110429一、任务:设计并制作一个城市交道口交通灯控制糸统二、要求:根据下图交道口模型,装上交通灯。
交道口模型如图所示。
交通灯控制规则如下:1)每个街口有左拐、右拐、直行及行人四种指示灯。
每个灯有红、绿两种颜色。
自行车与汽车共用左拐、右拐和直行灯。
2)共有四种通行方式:①车辆南北直行、各路右拐,南北向行人通行。
南北向通行时间为1分钟,各路右拐比直行滞后10秒钟开放。
②南北向左拐、各路右拐,行人禁行。
通行时间为1分钟。
③东西向直行、各路右拐,东西向行人通行。
东西向通行时间为1分钟,各路右拐比直行滞后10秒钟开放。
④东西向左拐、各路右拐。
行人禁行。
通行时间为1分钟。
3)在通行结束前10秒钟,绿灯闪烁直至结束。
1, 基本部分:按照上述控制要求,用发光二极管代替交通灯,用PROTEUS绘制电路图,并仿真调试实现之。
2, 发挥部分:1.有倒计时时间显示。
2若交道口出现紧急情况,交警可将糸统设置成手动:全路口车辆禁行、行人通行。
紧急情况结束后再转成自动状态。
3当有119、120等特种车辆通过时,糸统自动转为特种车放行,其它车辆禁止状态。
特种车辆通过15秒钟后,糸统自动恢复,用模型车演示。
4其它自选措施。
智能交通灯控制系统1.系统功能的确定功能一:可以实现红绿灯的转换以及控制路口的基本功能。
功能二:有倒计时功能和最后十秒绿灯闪烁的功能。
功能三:出现紧急情况时,警察可以手动控制特殊状态,并维持交通。
功能四:119或120等特种车经过时,可转换成为特种车道行驶状态,并在情况消除后15秒,恢复原状。
2.方案论证2.1方案一:如下图所示,为proteus仿真图。
其中,P1,P0端口的8位分别来控制东西,南北方向的红绿灯。
且运用了4个74LS164的8位移位寄存器(串行输入,并行输出)来控制4个LED的数码显示,通过AT89C51单片机的P3.0,P3.1两个扩展端口来接4个并行连接的74LS164的DIN和CLK两个端口来显示倒计时的功能,这会产生乱码使得显示杂乱,而主程序以顺序执行为主,其中穿插着对P3.7的端口高低电平的测试和跳转语句来实现功能三,并且功能一、二在主程序中实现,没有功能四的的实现程序。
单片机交通灯实验汇编语言程序经过几天的整理,终于将网络上得到交通灯仿真文件,用汇编自己编写了一个程序,实验结果完全符合本人的思路,实验成功。
程序比较长,估计还会用更好的办法重新写。
编写心得是:单片机编程,不一定要背指令,用时可以查,也不必去默写子程序,用时还是可以查,但是,很关键的就是,你的程序,你自己要清楚整个的执行过程,也就是单片机的执行流程。
而在实际的应用中,要注意驱动电路的设计,特别是单片机上电复位输出高电平可能造成的影响。
程序如下:如果网页显示格式错乱可从51hei/f/jtda.rar 处下载. ORG 0000HSTART:MOV R2,#30SU0:MOV P0,#00HMOV P1,#00HMOV P2,#00HMOV P3,#00111111BMOV A,R2MOV R4,AMOV A,R4MOV R0,AMOV B,#5DIV ABMOV B,#3MUL ABMOV R1,ASETB P0.4SETB P0.7SETB P2.2SETBP2.5AJMP KEYSU1A: DEC R0DEC R1SUL5: CJNE R1,#5,SUL6SETB P2.7SUL6: CJNE R1,#4,SUL7SETB P2.7SUL7: CJNE R1,#3,SUL1SETB P2.7SUL1: CJNE R1,#2,SUL2SETB P2.7SUL2: CJNE R1,#1,SUL3SETB P2.7SUL3: CJNE R1,#0,SUL4MOV A,R0MOV R1,ACLR P2.5CLR P0.7SETB P0.5SETB P2.4SUL4: CJNE R0,#0,KEYAJMP SU0BKEY: JB P3.5,KEY1 LCALL DELAY MOVR2,#45KEY1:JB P3.2,KEY2 LCALL DELAY MOV R2,#60KEY2:JB P3.3,KEY3 LCALL DELAY MOV A,R2 ADD A,#5 MOV R2,A CJNE R2,#95,DD MOVR2,#95KEY3:JB P3.4,DD LCALL DELAY MOV A,R2 SUBB A,#5 MOV R2,A CJNE R2,#0,DD MOV R2,#0DD:MOV R3,#50;数码1DD1: MOV P1,#00H MOV A,R0 MOV B,#10 DIV AB MOV DPTR,#TAB MOVC A,@A+DPTR MOV P1,A SETB P0.0 LCALL DELAY1 CLR P0.0 MOV A,B MOV DPTR,#TAB MOVC A,@A+DPTR MOV P1,A SETB P0.1 LCALL DELAY1 CLR P0.1;数码2 MOV。
交通灯控制一、课程设计的内容在实验平台上选择两组指示灯,每组分为红,黄,绿代表交通灯。
要求:1. 模拟十字交通路口的实际情况,设计十字路口交通灯自动变换系统。
2. 设计十字路口交通灯手动变换系统,并这两套系统可切换使用。
3. 在实现以上内容的基础上增加允许急救车优先通过的要求。
有急救车到达时,两方向交通信号为全红,以便让急救车通过。
二.设计思路及电路图在单片机实验箱上P0口和P2口不能做I/O接口。
但是为了实现交通灯的状态变化,我要用到I/O接口来对按键进行查询和显示发光二极管的状态,P1口控制四段数码管的显示。
所以我扩展I/O接口,用74LS377的输入端接P0口,其输出线1Q~8Q接8个发光二极管,WR作为锁存控制接74LS377的时钟端,扩展片选信号CS1接在74LS377的使能端G。
我用查询方式来查询按键来转换手动,自动,救护车到来的状态的变化,则把四个按键K4~K7与P3.2~P3.5相接,当按键置高电平时,程序就会转换到相应状态执行相应的模块状态。
在自动状态时,开始4个路口的红灯全亮(东西方向为之路,南北方向为主路)之后,南北路口的绿灯亮,东西口的红灯亮,延时显示并查询开关状态是否发生变化,当两个数码管(一个代表东西方向,一个代表南北方向)从0~3显示,当显示3后交通灯显示下一个状态,一直循环重复过程,直到查询到有按键发生变化。
当P3.3高电平时,自动转换为手动,(同理P3.3低电平时手动转换为自动。
)此时拨动按键使P3.2或P3.5置于高点位,就会转到主路或支路相应状态的交通灯显示,数码管显示0。
P3.4控制救护车来时的状态,当其高电位两个红灯全亮并蜂鸣器响起。
实验电路图:显示电路:三、程序:主程序流程图:输出口初始化化送灯的状态到锁存器,灯自动循环亮调用延时显示 并查询按键状态手动状态JB P3.3JNB P3.3开始JB P3.4P3.4 jnb之前状态JBP3.5 JB P3.2东西绿灯亮 南北红灯亮南北绿灯亮东西红灯亮救护车 东西南北红灯亮并警报显示子程序流程图:DISPL Y子程序流程图:ORG 4000HSTART: MOV DPTR,#0F100HMOV A,#11011110B ;东西南北红灯亮MOVX @DPTR,ALCALL DL1S ; 显示时间,并查询按键状态 LCALL XIANSHILOP1: MOV DPTR,#0F100HMOV A,#11011011B ;南北绿灯亮,东西红灯亮MOVX @DPTR,ALCALL DL1S ;显示时间,并查询按键状态LCALL XIANSHIMOV R0,#2LOP2: MOV DPTR,#0F100HMOV A, #11011001B ; 南北黄灯闪烁2次MOVX @DPTR,ALCALL DL1S ;显示时间,并查询按键状态 LCALL XIANSHILOPD: MOV DPTR,#0F100HMOV A,#11011011BMOVX @DPTR,ALCALL DL1SLCALL XIANSHIDJNZ R0,LOP2LOP3: MOV DPTR,#0F100HMOV A,#01111110B ;东西绿灯亮,南北红灯亮MOVX @DPTR,ALCALL DL1S ;显示时间,并查询按键状态LCALL XIANSHIMOV R0,#2LOP4: MOV DPTR,#0F100HMOV A,#00111110B ; 东西黄灯闪烁2次MOVX @DPTR,ALCALL DL1SLCALL XIANSHILOPE: MOV DPTR,#0F100HMOV A,#01111110B ;显示时间,并查询按键态 MOVX @DPTR,ALCALL DL1SLCALL XIANSHIDJNZ R0,LOP4 ;R0不为0,转L0P4AJMP STARTPK:MOV DPTR,#0F100H ;手动状态两个黄灯亮作为标志MOV A,#10111101BMOVX @DPTR,AJNB P3.3,START ;P3.3低电平转自动JB P3.2,ZHUL ;P3.2高电平转主路状态JB P3.5,ZILU ;P3.2高电平转之路状态JB P3.4,JHC ;P3.4高电平转救护车状态 CLR EA ;关救护车的蜂鸣器LCALL XIANSHI1 ;不显示时间,显示0AJMP PKZHUL:MOV DPTR,#0F100HMOV A,#11011011B ;南北绿灯亮,东西红灯亮MOVX @DPTR,ALCALL XIANSHI1 ;显示0AJMP PKZILU: MOV DPTR,#0F100HMOV A,#01111110B ;东西绿灯亮,南北红灯亮MOVX @DPTR,ALCALL XIANSHI1 ;显示0AJMP PKJHC: MOV TMOD,#01HMOV TH0,#0FCH ;蜂鸣器响起MOV TL0,#05BHSETB TR0SETB EACPL P1.7MOV DPTR,#0F100HMOV A, #11011110B ;东西,南北,红灯亮 MOVX @DPTR,ALCALL XIANSHI1 ;显示0;子程序DL1S: JB P3.3,PK ;查询按键状态JB P3.4,JHCRET;显示子程序XIANSHI:MOV A,#0 ;显示0MOV DPTR,#TB ;查表ANL A,0FHMOVC A,@A+DPTRMOV R1,AMOV P1,#11111111BCALL DISPLYLCALL DL1S1 ;调用延时 MOV A,#1 ;显示1 MOV DPTR,#TBANL A,0FHMOVC A,@A+DPTRMOV R1,AMOV P1,#11111111BCALL DISPLYLCALL DL1S1MOV A,#2 ;显示2MOV DPTR,#TBANL A,0FHMOVC A,@A+DPTRMOV R1,AMOV P1,#11111111BCALL DISPLYLCALL DL1S1MOV A,#3 ;显示3 MOV DPTR,#TBANL A,0FHMOVC A,@A+DPTRMOV R1,AMOV P1,#11111111BCALL DISPLYLCALL DL1S1RETXIANSHI1: MOV A,#0MOV DPTR,#TBANL A,0FH ;显示0的子程序 MOVC A,@A+DPTRMOV R1,AMOV P1,#11111111BCALL DISPLYLCALL DL1S1DISPLY:MOV R7,#8 ;MOV A,R1;MOV A,#8EHT: RLC A ;串形输入SETB P1.1 ;时钟置高MOV P1.0,C ;数据送sdaCLR P1.1 ;时钟置低位DJNZ R7,TMOV P1,#10110111B ;1RETDL1S1: MOV R6,#4DELAYY: MOV R5,#250DELAYE: MOV R3,#250 ;延时子程序DELAYF: DJNZ R3,DELAYFDJNZ R5,DELAYEDJNZ R6,DELAYYRETTB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6 H,0A1H,86H,8EHEND1 / 1。
题目:简易交通灯一、设计目的利用TDN微机原理试验箱及单元电路,实现对一道路交通灯的控制。
当通过车辆计数达到50时,绿灯灭,红灯亮,同时数码块倒计时若干秒(此次设计中设为9秒)。
此时,车辆停止,行人可以通过。
二、参加人员及分工李——试验报告霍——调试程序洪——编写程序三、技术要求1、设计完成交通灯的电路2、采用TDN试验箱上的8255、8259、8253完成3、程序设计中采用软件延时四、试验器材TDN-MD86/51实验箱一台,8253一片,8255一片,8259一片,数码管一组,发光二极管一组。
五、设计和调试环境TDN-MD86/51教学试验系统六、题目分析、工作原理、设计思想题目分析我们所做的交通灯是控制单路口处车辆和行人的通过及停止的简易交通灯。
因此需要两个灯和一块用于显示倒计时的数码块来控制车辆和行人的通行、停留问题。
其中两个灯分为红绿色,主要根据两只灯的亮灭情况来控制车辆,当红灯灭绿灯亮的时候车辆可以通过,而红灯亮绿灯灭时车辆就要停止通行。
数码块用于显示倒计时的时间以控制人,当倒计时开始时人通行,倒计时结束后行人就要等待。
根据题目分析得出以下设计思想及工作原理:设计思想在一开始启动交通灯时设置为红灯灭绿灯亮,让车辆先通行,行人等待,当通过50辆车后,红绿灯都同时灭然后红灯亮绿灯灭且数码快开始倒计时,此时为行人通行时间。
然后当数码块倒计时到0时行人通行的时间结束。
转而红灯灭绿灯亮又改为车辆通行时间。
红绿灯和数码块如此反复工作就构成的交通灯。
工作原理通过向8259写入程序来控制其他器件的工作。
在程序一开始写入中断向量和各芯片的控制方式字,以确保发生中断是正确的响应中断及芯片正确的工作状态。
接下来的程序就是控制8255和8253,8255选择工作方式1,A、B、C、口都做基本的输入输出。
通过8255A 口先让红灯灭绿灯亮。
8253选择工作方式2:计数停止中断,通过8253对车辆的计数达到50辆车是就发出中断请求。
编程提示:(1) 通过74LS164控制发光二极管,以模拟交通灯的控制。
(2) 程序中设定好计数初值,开始倒数。
(3) 各发光二极管共阴极,使其点亮应使对应的端口输出高电平。
;====================交通灯控制器 ========================== SECOND1 EQU 30H ;东西路口计时寄存器SECOND2 EQU 31H ;南北路口计时寄存器DBUF EQU 40H ;显示码缓冲区1TEMP EQU 44H ;显示码缓冲区2LED_G1 BIT P2.1 ;东西路口绿灯LED_Y1 BIT P2.2 ;东西路口黄灯LED_R1 BIT P2.3 ;东西路口红灯LED_G2 BIT P2.4 ;南北路口绿灯LED_Y2 BIT P2.5 ;南北路口黄灯LED_R2 BIT P2.6 ;南北路口红灯ORG 0000HLJMP STARTORG 0100HSTART: MOV TMOD,#01H ;置T0为工作方式1MOV TH0,#3CH ;置T0定时初值50msMOV TL0,#0B0HCLR TF0SETB TR0 ;启动T0CLR AMOV P1,A ;关闭不相关的LED;***************************************************LOOP: MOV R2,#20 ;置1s计数初值,50ms*20=1s MOV R3,#20 ;红灯亮20sMOV SECOND1,#25 ;东西路口计时显示初值25sMOV SECOND2,#25 ;南北路口计时显示初值25sLCALL DISPLAYLCALL STATE1 ;调用状态1WAIT1: JNB TF0,WAIT1 ;查询50ms到否CLR TF0MOV TH0,#3CH ;恢复T0定时初值50msMOV TL0,#0B0HDJNZ R2,WAIT1 ;判断1s到否?未到继续状态1MOV R2,#20 ;置50ms计数初值DEC SECOND1 ;东西路口显示时间减1sDEC SECOND2 ;南北路口显示时间减1sLCALL DISPLAYDJNZ R3,WAIT1 ;状态1维持20s;*******************************************MOV R2,#5 ;置50ms计数初值5*4=20MOV R3,#3 ;绿灯闪3sMOV R4,#4 ;闪烁间隔200msMOV SECOND1,#5 ;东西路口计时显示初值5sMOV SECOND2,#5 ;南北路口计时显示初值5sLCALL DISPLAYWAIT2: LCALL STATE2 ;调用状态2JNB TF0,WAIT2 ;查询50ms到否CLR TF0MOV TH0,#3CH ;恢复T0定时初值50msMOV TL0,#0B0HDJNZ R4,WAIT2 ;判断200ms到否?未到继续状态2CPL LED_G1 ;东西绿灯闪MOV R4,#4 ;闪烁间隔200msDJNZ R2,WAIT2 ;判1s到否?未到继续状态2MOV R2,#5 ;置50ms计数初值DEC SECOND1 ;东西路口显示时间减1sDEC SECOND2 ;南北路口显示时间减1sLCALL DISPLAYDJNZ R3,WAIT2 ;状态2维持3s;****************************************MOV R2,#20 ;置50ms计数初值MOV R3,#2 ;黄灯闪2sMOV SECOND1,#2 ;东西路口计时显示初值2sMOV SECOND2,#2 ;南北路口计时显示初值2sLCALL DISPLAYWAIT3: LCALL STATE3 ;调用状态3JNB TF0,WAIT3 ;查询100ms到否CLR TF0MOV TH0,#3CH ;恢复T0定时初值100msMOV TL0,#0B0HDJNZ R2,WAIT3 ;判断1s到否?未到继续状态3MOV R2,#20 ;置100ms计数初值DEC SECOND1 ;东西路口显示时间减1sDEC SECOND2 ;南北路口显示时间减1sLCALL DISPLAYDJNZ R3,WAIT3 ;状态3维持2s;*******************************************MOV R2,#20 ;置50ms计数初值MOV R3,#20 ;红灯闪20sMOV SECOND1,#25 ;东西路口计时显示初值25sMOV SECOND2,#25 ;南北路口计时显示初值25sLCALL DISPLAYWAIT4: LCALL STATE4 ;调用状态4JNB TF0,WAIT4 ;查询100ms到否CLR TF0MOV TH0,#3CH ;恢复T0定时初值100msMOV TL0,#0B0HDJNZ R2,WAIT4 ;判断1s到否?未到继续状态4MOV R2,#20 ;置100ms计数初值DEC SECOND1 ;东西路口显示时间减1sDEC SECOND2 ;南北路口显示时间减1sLCALL DISPLAYDJNZ R3,WAIT4 ;状态4维持20s;*******************************************MOV R2,#5 ;置50ms计数初值MOV R4,#4 ;红灯闪20msMOV R3,#3 ;绿灯闪3sMOV SECOND1,#5 ;东西路口计时显示初值5sMOV SECOND2,#5 ;南北路口计时显示初值5sLCALL DISPLAYWAIT5: LCALL STATE5 ;调用状态5JNB TF0,WAIT5 ;查询100ms到否CLR TF0MOV TH0,#3CH ;恢复T0定时初值100msMOV TL0,#0B0HDJNZ R4,WAIT5 ;判断200ms到否?未到继续状态5CPL LED_G2 ;南北绿灯闪MOV R4,#4 ;闪烁200msDJNZ R2,WAIT5 ;判断1s到否?未到继续状态5MOV R2,#5 ;置100ms计数初值DEC SECOND1 ;东西路口显示时间减1sDEC SECOND2 ;南北路口显示时间减1sLCALL DISPLAYDJNZ R3,WAIT5 ;状态5维持3s;****************************************MOV R2,#20 ;置50ms计数初值MOV R3,#2 ;红灯闪2sMOV SECOND1,#2 ;东西路口计时显示初值2sMOV SECOND2,#2 ;南北路口计时显示初值2sLCALL DISPLAYWAIT6: LCALL STATE6 ;调用状态6JNB TF0,WAIT6 ;查询100ms到否CLR TF0MOV TH0,#3CH ;恢复T0定时初值100msMOV TL0,#0B0HDJNZ R2,WAIT6 ;判断1s到否?未到继续状态6MOV R2,#20 ;置100ms计数初值DEC SECOND1 ;东西路口显示时间减1sDEC SECOND2 ;南北路口显示时间减1sLCALL DISPLAYDJNZ R3,WAIT6 ;状态6维持2sLJMP LOOP ;大循环;**********************************************STATE1: ;状态1SETB LED_G1 ;东西路口绿灯亮CLR LED_Y1CLR LED_R1CLR LED_G2CLR LED_Y2SETB LED_R2 ;南北路口红灯亮RETSTATE2: ;状态2CLR LED_Y1CLR LED_R1CLR LED_G2CLR LED_Y2SETB LED_R2 ;南北路口红灯亮RETSTATE3: ;状态3CLR LED_G1CLR LED_R1CLR LED_G2CLR LED_Y2SETB LED_R2 ;南北路口红灯亮SETB LED_Y1 ;东西路口绿灯亮RETSTATE4: ;状态4CLR LED_G1CLR LED_Y1SETB LED_R1 ;东西路口红灯亮SETB LED_G2 ;南北路口绿灯亮CLR LED_Y2CLR LED_R2RETSTATE5: ;状态5CLR LED_G1CLR LED_Y1SETB LED_R1 ;东西路口红灯亮CLR LED_Y2CLR LED_R2RETSTATE6: ;状态6CLR LED_G1CLR LED_Y1SETB LED_R1 ;东西路口红灯亮CLR LED_G2CLR LED_R2SETB LED_Y2 ;南北路口红灯亮RETDISPLAY: ;数码显示MOV A,SECOND1 ;东西路口计时寄存器MOV B,#10 ;16进制数拆成两个10进制数DIV ABMOV DBUF+3,AMOV A,BMOV DBUF+2,AMOV A,SECOND2 ;南北路口计时寄存器MOV B,#10 ;16进制数拆成两个10进制数DIV ABMOV DBUF+1,AMOV A,BMOV DBUF,AMOV R0,#DBUFMOV R1,#TEMPMOV R7,#4DP10: MOV DPTR,#LEDMAPMOV A,@R0MOVC A,@A+DPTRMOV @R1,AINC R0INC R1DJNZ R7,DP10MOV R0,#TEMPMOV R1,#4DP12: MOV R7,#8MOV A,@R0DP13: RLC AMOV P3.0,CCLR P3.1SETB P3.1DJNZ R7,DP13INC R0DJNZ R1,DP12RETLEDMAP:DB 3FH,06H,5BH,4FH,66H,6DH ;0,1,2,3,4,5DB 7DH,07H,7FH,6FH,77H,7CH ;6,7,8,9,A,BDB 58H,5EH,7BH,71H,0,40H ;C,D,E,F,,-END运行实验程序编译程序时,在系统“P.”状态后,运行程序时 L1~L12发光二极管模拟交通灯显示。