单片机汇编语言:交通灯实验——-十字路口交通灯模拟设计
前言:对于单片机汇编语言的实验,十字路口的交通灯可以说是很经典了,今天来尝试使用8255来对交通灯进行一个控制。
毋庸置疑,在使用一个新东西前得对它有一个基本了解
8255芯片是一种通用的并行输入输出设备,常用于微处理器系统中。它包含了3个可编程的I/O端口A、B和C以及控制逻辑。每个端口都可以被配置为输入或输出,并且可以通过编程控制对其进行数据传输和控制。
8255并行接口引脚图
8255芯片有三种工作模式:
- 简单IO模式(模式0):在此模式下,端口A和端口B是独立的,并且每个端口可以被配置为输入或输出。端口C可以被配置为控制寄存器或数据寄存器。在此模式下,输入和输出数据可以直接读写到指定的端口。
- 合并IO模式(模式1):在此模式下,端口A和端口B合并成为一个16位的端口AB,并且可以同时进行输入和输出操作。端口C被配置为控制寄存器或数据寄存器。
- 可编程IO模式(模式2):在此模式下,端口A、端口B和端口C都是独立的,并且可以分别进行输入和输出操作。端口C可以被配置为控制寄存器、端口A的高8位或端口B的高8位。
一、实验题目
假设一个十字路口为东西走向,南北走向,在东北方向分别设置一组交通灯,模拟交通灯的控制,实际交通灯的变化规律为:初始状态0为东北红灯,延时;然后转状态1,东向绿灯通车,北向红灯,延时;然后转状态2,东向绿灯灭,黄灯闪烁几次,北向红灯;然后转状态3,东向红灯,北向绿灯通车,延时;转状态4,东向红灯,北向绿灯灭,黄灯闪烁几次,然后又循环至状态1。
二、实验原理图
三、实验分析
端口地址确定:
CS====>Y0====>P24
在89C51中,P24是第二个8位I/O口(P2)的第4位。8255CS是一个可编程并行输入/输出接口,它具有三个8位I/O端口(Port A、Port B和Port C),这些端口可以通过地址线(A0、A1、A2)来选择。当8255CS连接到89C51的P24接口时,它的Port A将连接到89C51的P24.0引脚(即PA0)。
在89C51的内存映射中,每个I/O口都有对应的地址。对于P24来说,它的地址是0x00008000。因此,PA0的地址是0x00008000。
观察原理图可知,PA0-PA5依次接发光二极管L0-L5。
PA5 | PA4 | PA3 | PA2 | PA1 | PA0 |
L5 | L4 | L3 | L2 | L1 | L0 |
红 | 黄 | 绿 | 红 | 黄 | 绿 |
实验中所需要的四种状态
状态0
东向 | 北向 | ||||
红 | 黄 | 绿 | 红 | 黄 | 绿 |
L5 | L4 | L3 | L2 | L1 | L0 |
PA5 | PA4 | PA3 | PA2 | PA1 | PA0 |
1 | 0 | 0 | 1 | 0 | 0 |
状态1
东向 | 北向 | ||||
红 | 黄 | 绿 | 红 | 黄 | 绿 |
L5 | L4 | L3 | L2 | L1 | L0 |
PA5 | PA4 | PA3 | PA2 | PA1 | PA0 |
0 | 0 | 1 | 1 | 0 | 0 |
状态2
东向 | 北向 | ||||
红 | 黄 | 绿 | 红 | 黄 | 绿 |
L5 | L4 | L3 | L2 | L1 | L0 |
PA5 | PA4 | PA3 | PA2 | PA1 | PA0 |
0 | 闪 | 0 | 1 | 0 | 0 |
状态3
东向 | 北向 | ||||
红 | 黄 | 绿 | 红 | 黄 | 绿 |
L5 | L4 | L3 | L2 | L1 | L0 |
PA5 | PA4 | PA3 | PA2 | PA1 | PA0 |
1 | 0 | 0 | 0 | 0 | 1 |
状态4
东向 | 北向 | ||||
红 | 黄 | 绿 | 红 | 黄 | 绿 |
L5 | L4 | L3 | L2 | L1 | L0 |
PA5 | PA4 | PA3 | PA2 | PA1 | PA0 |
1 | 0 | 0 | 0 | 闪 | 0 |
//延时子程序编写
DELAY :MOV R6, #00H
DELAY1:MOV R7, #80H
DJNZ R7, $
DJNZ R6, DELAY1
//查指令表可知MOV、DJNZ指令均需用两个机器周期,而一个机器周期时间长度为12/ 6.0MHZ,所以该段指令执行
时间为:(2×128+3) ×256×(12÷6000000)=132.6ms
/*************下面为定时器延时**************/
DELAY1:MOV TOMD,#10H; 短延时
SETB TR1
MOV R0,#0AH ;十六进制循坏10次,一次为50ms,总时长0.5s
LOOP:MOV TH1,#03CH
MOV TL1,#0B0H
JNB TF1,$
CLR TF1
CPL P1.1
DJNZ R0,LOOP
RET
DELAY2:MOV TOMD,#10H; 长延时
SETB TR1
MOV R0,#40 ;十进制循坏40次,一次为50ms,总时长2s
LOOP1:MOV TH1,#03CH
MOV TL1,#0B0H
JNB TF1,$
CLR TF1
CPL P1.1
DJNZ R0,LOOP1
RET
ORG 0000H
; 初始化堆栈指针
MOV SP, #60H
MOV DPTR, #8003H
; 设置控制字:所有端口设置为输出模式(假设不使用中断和端口C的拆分控制)
; 控制字格式(示例):D7 D6 D5 D4 D3 D2 D1 D0
; - - - - A B C上 C下
; X X X X 1 1 0 0 (所有端口为输出)
; 这里我们假设使用模式0(基本输入/输出),并且不需要中断
MOV A, #80H ; 控制字为80H(二进制10000000),表示所有端口为输出
; 将控制字写入8255A的控制寄存器(地址8003H)
MOVX @DPTR, A
MOV DPTR, #8000H
TASK0://状态0
MOV A, #24H ; PA口=00100100
MOVX @DPTR, A ; 将累加器A的内容写入PA口
CALL DELAY1 ;调用延时
SJMP TASK1
TASK1:
MOV A, #12H ; PA口=00001100
MOVX @DPTR, A ; 将累加器A的内容写入PA口
CALL DELAY1 ;调用延时
SJMP TASK2
TASK2: //假设闪烁3次
MOV R0,#03H //
LED_LOOP:
MOV A,#14H //00010100
MOVX @ DPTR,A //
CALL DELAY2
MOV A, #04H //00000100
MOVX @DPTR,A
CALL DELAY2
DJNZ R0,LED_LOOP
SJMP TASK3
TASK3:
MOV A, #09H ; PA口=00001001
MOVX @DPTR, A ; 将累加器A的内容写入PA口
CALL DELAY1 ;调用延时
SJMP TASK4
TASK4:
MOV R0,#03H //
LED_LOOP:
MOV A,#0AH //00001010
MOVX @ DPTR,A //
CALL DELAY2
MOV A, #08H //00001000
MOVX @DPTR,A
CALL DELAY2
DJNZ R0,LED_LOOP
SJMP TASK1
完整代码已经给出
作者:794520