单片机汇编语言:交通灯实验——-十字路口交通灯模拟设计

前言:对于单片机汇编语言的实验,十字路口的交通灯可以说是很经典了,今天来尝试使用8255来对交通灯进行一个控制。

毋庸置疑,在使用一个新东西前得对它有一个基本了解 

        8255芯片是一种通用的并行输入输出设备,常用于微处理器系统中。它包含了3个可编程的I/O端口A、B和C以及控制逻辑。每个端口都可以被配置为输入或输出,并且可以通过编程控制对其进行数据传输和控制。

8255并行接口引脚图

8255芯片有三种工作模式

  1. 简单IO模式(模式0):在此模式下,端口A和端口B是独立的,并且每个端口可以被配置为输入或输出。端口C可以被配置为控制寄存器或数据寄存器。在此模式下,输入和输出数据可以直接读写到指定的端口。
  2. 合并IO模式(模式1):在此模式下,端口A和端口B合并成为一个16位的端口AB,并且可以同时进行输入和输出操作。端口C被配置为控制寄存器或数据寄存器。
  3. 可编程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

物联沃分享整理
物联沃-IOTWORD物联网 » 单片机汇编语言:交通灯实验——-十字路口交通灯模拟设计

发表回复