;==================================================================== ; author:GUET_diadestiny ; 计时十字路口交通信号灯及公共时钟 ;==================================================================== OUT_PUT MACRO PORT,DATA MOV DX, PORT MOV AL, DATA OUT DX, AL ENDM ;8253初始化,CONTROLER为命令口地址,CMD为命令内容,TIMEPORT为计数器N的端口,COUNT为计数初值 SET_8253 MACRO CONTROLER,CMD,TIMEPORT,COUNT OUT_PUT CONTROLER,CMD MOV DX, TIMEPORT MOV AX, COUNT OUT DX, AL MOV AL,AH OUT DX,AL ENDM ;中断向量设置,VECTOR为中断向量,FUNCNAME为中断子程序名 SET_VEC MACRO VECTOR,FUNCNAME PUSH DS MOV AX,0 MOV DS,AX MOV DI,VECTOR*4 MOV AX,OFFSET FUNCNAME MOV [DI],AX MOV AX,SEG FUNCNAME MOV [DI+2],AX POP DS ENDM ; INI_A为偶数口地址,ICW1,ICW2,ICW4为对于要写入的命令,适合单片8259初始化 SET_8259 MACRO INI_A,ICW1,ICW2,ICW4 OUT_PUT INI_A,ICW1 OUT_PUT INI_A+2,ICW2 OUT_PUT INI_A+2,ICW4 ENDM ;NOW用于表示当前计数单元,MAX用于当前计时最大值,NEXT表示下一计数单元,STORAGE为转换的LED编码存储单元 INT_PRO MACRO NOW,MAX,NEXT,STORAGE LOCAL JUST MOV AX,0 MOV AL,NOW CMP AL,MAX ;比较计数是否到最大值 JNE JUST ;不是则跳转 INC NEXT ;是则下一计数单元加一 MOV NOW,0 JUST: MOV BL,10 DIV BL MOV BL,AL MOV AL,LIGHT[BX] ;转换高位 MOV STORAGE,AL MOV BL,AH MOV AL,LIGHT[BX] ;转换低位 MOV STORAGE+1,AL ENDM DATA SEGMENT TCON0 EQU 0090H ;8253计数器0地址 TCON1 EQU 0092H TCON2 EQU 0094H TCONTR EQU 0096H OUT373 EQU 0080H IOA EQU 00A0H ;8255A端口地址 IOB EQU 00A2H IOC EQU 00A4H IOCON EQU 00A6H PORT8259 EQU 00B0H ;8259端口地址 TABLE DB 0FFH,0C0H,0FFH,0F9H,0FFH,0A4H,0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ; 交通灯倒计时数码管顺序显示数字对应编码 TABLE_END = $ ;下文计算偏移 LIGHT DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;共阴极八数码管0-9对应编码,公共时钟 NOW_FLAG DW 0 ;当前累计数 N_HOUR DB 14 ;当前时时刻(假定当前时间是14点30分) N_MIN DB 30 ;当前分时刻 N_SEC DB 0 ;当前秒时刻 HOUR DB 0,0,40H ;用于存放LED时显示编码 MINTU DB 0,0,40H ;用于存放LED分显示编码 SEC DB 0,0 ;用于存放LED秒显示编码 TEMP DB 0 ;临时保存编码 DATA ENDS STACK SEGMENT DW 2048 DUP(0) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA ;设置数据段 MOV DS,AX SET_VEC 91H,IRQ1FUN;设置中断向量IRQ1 SET_8259 PORT8259,13H,91H,03H ;初始化8259,设定ICW2=90H OUT_PUT IOCON,80H ;初始化8255 SET_8253 TCONTR,00110111B,TCON0,1000H ;初始化8253 SET_8253 TCONTR,01110111B,TCON1,1000H ;初始化8253 OUT_PUT PORT8259+2,00H ;OCW1,开放中断输入 LEA SI,TABLE_END ;装载地址至SI STI ;开中断 LEA DI,LIGHT ;装载地址至DI ENDLESS: MOV CX,7F08H ;控制输出共阴极数码管 LEA DI,HOUR ;装载存储编码 SHOW: OUT_PUT IOA,[DI] OUT_PUT IOB,CH CALL DELAY OUT_PUT IOB,0FFH INC DI ROR CH,1 DEC CL JNZ SHOW JMP ENDLESS IRQ1FUN PROC NEAR INC N_SEC INT_PRO N_SEC,60,N_MIN,SEC ;秒 INT_PRO N_MIN,60,N_HOUR,MINTU ;分 INT_PRO N_HOUR,24,TEMP,HOUR ;小时 DEC SI ;倒计时逆序 CMP SI,OFFSET TABLE-1 JNZ THEN1 LEA SI,TABLE_END-1 THEN1: MOV AL,[SI] MOV DX,OUT373 OUT DX,AL ;373输出到倒计时数码管 MOV AX,NOW_FLAG MOV BL,20H DIV BL ;经过推算,32个红绿灯状态为设定的一个周期 INC NOW_FLAG CMP AH,26 ;将余数AH进行比较,得到状态编码 JB NN1 TEST AH,01H JZ FOUR_ONE OUT_PUT IOC,10000000B ;红绿灯状态4.2 IRET FOUR_ONE: OUT_PUT IOC,10000010B ;红绿灯状态4.1 IRET NN1: CMP AH,16 JB NN2 OUT_PUT IOC,10000001B ;红绿灯状态3 IRET NN2: CMP AH,10 JB NN3 TEST AH,01H JZ TWO_ONE OUT_PUT IOC,00000100B ;红绿灯状态2.2 IRET TWO_ONE: OUT_PUT IOC,01000100B ;红绿灯状态2.1 IRET NN3: OUT_PUT IOC,00100100B ;红绿灯状态1 IRET IRQ1FUN ENDP ;共阴极数码管所需延时子程序 DELAY PROC NEAR PUSH CX PUSH DI MOV CX,30H Y1: LOOP Y1 POP DI POP CX RET DE
您提供的代码是一个汇编语言程序,用于控制十字路口的交通信号灯和公共时钟。程序中使用了8253计时器、8255并行接口芯片和8259中断控制器来实现功能。以下是对代码的简要解释:
-
宏定义:程序开始部分定义了几个宏,用于简化代码编写和提高可读性。
OUT_PUT
宏用于向指定端口输出数据。SET_8253
宏用于初始化8253计时器。SET_VEC
宏用于设置中断向量。SET_8259
宏用于初始化8259中断控制器。INT_PRO
宏用于中断处理程序中的时间更新逻辑。
-
数据段:定义了程序中使用的各种常量、变量和数组。
- 计时器和端口地址常量。
- 数码管显示数字和时间的编码数组。
- 用于存储当前时间的变量。
-
堆栈段:定义了程序的堆栈空间。
-
代码段:
- 初始化数据段、设置中断向量、初始化8259、8255和8253。
- 主循环中,程序不断更新时间显示,并根据计时器中断更新交通信号灯状态。
IRQ1FUN
是中断服务程序,用于处理秒、分、时的更新,并控制交通信号灯的状态。DELAY
子程序用于在数码管刷新时提供延时。
-
交通信号灯状态控制:通过
IRQ1FUN
中断服务程序中的逻辑,程序能够根据计时器的计数来更新交通信号灯的状态。状态编码存储在TABLE
数组中,并通过OUT_PUT
宏输出到实际的交通信号灯控制系统。 -
时间更新:程序中的时间(小时、分钟、秒)通过中断服务程序中的
INT_PRO
宏进行更新,确保时间的准确性。 -
数码管显示:程序通过
SHOW
标签下的代码段来控制数码管显示当前的时间。
请注意,这段代码是一个示例,实际应用中需要根据具体的硬件配置和接口进行相应的调整。此外,代码中可能存在一些需要优化的地方,例如延时子程序的实现可能不够高效。在实际项目中,可能需要使用更精确的时间控制方法来确保交通信号灯的准确切换。15
8253计时器在程序中是如何初始化的?
8253计时器的初始化过程主要包括以下几个步骤:
-
地址配置:首先需要确定8253计时器的地址范围。例如,在8088最大系统下,8253的地址范围为370H~373H13。
-
工作方式设置:初始化8253计时器时,需要设置其工作方式。8253计时器有多种工作方式,例如工作方式0和工作方式113。
-
计数器设置:初始化时,需要为计数器设置特定的计数模式和计数初值。例如,可以将计数器0设置在工作方式0,计数器1设置在工作方式1,并且设置计数初值为713。
-
控制字编写:在8255中,控制字的编写是初始化8253计时器的重要部分。控制字用于设置8253计时器的读写方式、计数器模式等12。
-
写入初始化程序:编写初始化程序,将控制字和计数初值写入8253计时器的相应寄存器。例如,向8253的A1A0=11B的地址写入0101 0010B,表示计数器1设置成方式1,并且采用低8位时常数,假设时常数为15,则计数器1的初始化程序段如下:MOV AL, 0B6H; MOV DX, 0C3H; OUT DX, AL; MOV AL, 15H; MOV DX, 0C2H; OUT DX, AL14。
-
编程原理:8253定时器的编程原理包括寄存器配置,通过对8253定时器的寄存器进行配置来实现定时、计数、频率测量等功能11。
通过上述步骤,8253计时器可以在程序中被正确初始化,以满足不同的应用需求。
8255并行接口芯片在程序中扮演什么角色?
8255并行接口芯片在程序中扮演着多种角色,主要包括以下几个方面:
-
数据口的角色:8255芯片可以作为微机的数据口,用于数据的输入和输出。它具有3个8位并行I/O口,这些口可以被配置为输入或输出,以满足不同的数据传输需求。"8255的PC有很多作用,可以扮演多种角色:1. 做数据口。8255"16。
-
可编程并行I/O接口:8255芯片是Intel公司生产的可编程并行I/O接口芯片,具有3个通道3种工作方式,可以通过软件进行灵活配置。"8255芯片是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O口。具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。"17。
-
与外设的交互:8255芯片可以与打印机等外设进行交互。在实验中,8255可以用于与打印机的连接,实现数据的输入输出。"▫ 可编程并行输入/输出接口芯片8255A. ▫ 可编程定时 ... 作I/O线用。 Page 53. 七、8255应用举例. 1、与打印机 ..."18。
-
数据输入过程的控制:在并行接口的输入过程中,8255芯片负责接收外设通过数据总线发送的数据,并在内部寄存器中锁存这些数据,同时向外设发出数据输入响应信号。"并行接口的输入过程:1. 外设将原始数据放在数据总线上,并向并行接口发出“数据准备好”信号;2. 在并行接口中,将数据锁存于寄存器中,并向外设发出“数据输入响应”信号 ..."20。
综上所述,8255并行接口芯片在程序中主要扮演数据传输、外设交互和数据输入控制等角色,其灵活性和可编程性使其在多种应用场景中发挥重要作用。
8259中断控制器是如何被初始化的?
8259中断控制器的初始化过程是确保其正常工作的重要步骤。首先,计算机系统复位后,在开始使用8259A之前,需要对其进行初始化命令字编程。这一过程涉及到确定8259A的基本操作和中断方式24。初始化命令字编程是在8259A正常工作时写入的,它会影响8259A的状态和中断方式24。
在初始化过程中,ICW2(中断向量寄存器)扮演着重要角色。在初始化时,ICW2的高五位被写入,这些位将作为中断向量的高五位。随后,在中断响应时,8259A会根据中断源(即哪个管脚触发了中断)自动填入剩余的位,从而形成完整的8位中断向量,也称为中断类型号25。
此外,8259A的中断操作功能非常强大,包括中断请求、屏蔽、排队、结束、级联以及提供中断类型号和查询等操作。这些操作方式各有不同,但都是通过初始化设置来配置的23。
总结来说,8259中断控制器的初始化涉及对8259A进行命令字编程,确定其基本操作和中断方式,并通过ICW2设置中断向量的高五位,以便在中断响应时形成完整的中断向量2425。
程序中是如何控制数码管显示的?
程序控制数码管显示的过程主要涉及以下几个步骤:
-
字符到信号的转换:程序首先需要将需要显示的数字、字母和符号等字符转换成对应的七段数码管段亮灭控制信号。这是通过数码管显示程序实现的,它负责这一转换过程26。
-
数码管结构的理解:在进行控制之前,需要了解数码管的基本结构。一个7段数码管由a、b、c、d、e、f、g位段组成,如果包括右下角的小数点,则可以认为是8段,其中dp位段表示小数点27。
-
单片机I/O控制:程序通过单片机的I/O控制方法来管理数码管的显示。例如,51单片机的I/O端口可以用来控制数码管的亮灭28。
-
数码管接口电路:程序还需要掌握数码管接口电路的设计,以确保数码管能够正确接收来自单片机的信号并显示相应的字符28。
-
动态显示技术:程序可能采用动态显示技术,这种方法通过将所有位数码管的段选线并联在一起,并由位选线控制哪一位数码管有效,从而简化了硬件设计,减少了锁存器的使用29。
-
实验与调试:在51单片机学习过程中,通过实验和调试,可以逐步优化程序,使得数码管能够依次显示数字0-9,例如通过调整程序延时来解决数码管显示数字过暗的问题30。
通过上述步骤,程序能够有效地控制数码管显示所需的字符。
交通信号灯状态是如何通过程序控制的?
交通信号灯的状态是通过编程来控制的,这涉及到编写一系列指令来控制计算机或其他电子设备的行为31。控制原理基于计时程序,通过控制交通信号灯的颜色和时间来引导道路交通的流向,确保道路交通的安全畅通32。交通信号灯的控制包括一系列的相变,这些相变组成了周期,通过改变这些相的持续时间来实现交通信号灯的优化控制33。在实现交通灯控制时,可以利用ARM芯片进行模拟,需要自行选择所需ARM芯片,查阅相关文献资料,熟悉所选ARM芯片的各个引脚功能、工作方式、计数/定时以及I/O口等34。
汇编语言程序设计特点2 | 汇编语言特点 了解汇编语言程序设计的特点。 |
汇编语言程序基本结构及应用设计方法2 | 基本结构设计 掌握汇编语言程序的基本结构及简单应用的设计方法。 |
汇编语言指令编写程序设计3 | 汇编语言编程 利用汇编语言指令编写汇编语言程序设计。 |
汇编语言与高级语言结合实现方法4 | 汇编与高级语言结合 采用与第七章一样的实现方法,使用汇编语言为高级语言编写的软件做准备。 |
8253芯片计时器设置5 | 8253芯片计时 使用8253芯片做计时,设置中断向量,更改服务地址。 |
C语言程序运行原理6 | C语言程序原理 阐述计算机及程序的基本工作原理,C语言程序的运行方式。 |
82595 | 中断控制器 用于管理中断请求和响应。 |
82535 | 定时器 用于生成定时中断信号。 |
8255A5 | 可编程并行接口 用于控制交通灯和公共时钟的显示。 |
GUET_diadestiny1 | 汇编语言程序作者 编写了计时十字路口交通信号灯及公共时钟的汇编程序。 |