通过masm软件运行该程序
单片机源程序如下:
- STACK SEGMENT STACK 'STACK'
- DW 128 DUP(?)
- STACK ENDS
- DATA SEGMENT;定义8255和8253各端口地址数据
- PA8255 EQU 3000H
- PB8255 EQU 3200H
- PC8255 EQU 3400H
- CON8255 EQU 3600H
- CLK08253 EQU 3800H
- CLK18253 EQU 3A00H
- CLK28253 EQU 3C00H
- CON8253 EQU 3E00H
- DATA ENDS
- CODE SEGMENT
- ASSUME CS:CODE,DS:DATA,SS:STACK
- START:
- PUSH DS
- SUB AX,AX
- PUSH AX
- MOV AX,DATA
- MOV DS,AX
- MOV DX,CON8253;初始化8253通道0
- MOV AL,36H;00110110
- OUT DX,AL
- MOV DX,CLK08253
- MOV AX,2710H
- OUT DX,AL
- MOV AL,AH
- OUT DX,AL;通道0初始化完成,工作方式3,初始计数值为10000,周期为0.01s
- MOV DX,CON8253;通道2初始化完成,工作方式3,计数初值为100,由clk0输入以后周期为1s
- MOV AL,96H;10010110
- OUT DX,AL
- MOV DX,CLK28253
- MOV AL,64H
- OUT DX,AL
- MOV DX,CON8255
- MOV AL,80H
- OUT DX,AL;8255初始化完成,A,B,C均工作在方式0,即基本的输入输出
- MOV AL,10H;初始化各灯的状态
- MOV DX,PA8255
- OUT DX,AL;红灯全亮
- MOV DX,PB8255
- MOV AL,1FH
- OUT DX,AL;黄灯全灭
- MOV DX,PC8255
- MOV AL,1FH
- OUT DX,AL;绿灯全灭
- CALL DELAY
- BEGIN:
- MOV DX,CON8255
- MOV AL,80H
- OUT DX,AL
- MOV AL,10H
- MOV DX,PB8255
- OUT DX,AL
- MOV DX,PA8255
- MOV AL,15H
- OUT DX,AL;05H=00000101,2、4红灯亮
- MOV DX,PB8255
- MOV AL,1FH
- OUT DX,AL;0FH=00001111,黄灯全灭
- MOV DX,PC8255
- MOV AL,1AH
- OUT DX,AL;OAH=00001010,1,3绿灯亮
- CALL DELAY
- MOV DX,CON8253
- MOV AL,70H
- OUT DX,AL;通道1初始化完成,工作方式0,01110000
- MOV DX,CLK18253
- MOV AX,0BB8H
- OUT DX,AL
- MOV AL,AH
- OUT DX,AL;0BB8H=3000,即通道1的计数值为3000,也就是30S
- LOP30_1:
- MOV AL,0;扫描PC4口是否有高电平输入
- MOV DX,CON8255
- MOV AL,88H;88
- OUT DX,AL;改PC口为输入方式,准备读入PC4的值
- MOV DX,PC8255
- IN AL,DX
- AND AL,10H;取PC4的值
- CMP AL,10H
- JNZ LOP30_1;未检测到高电平则继续循环检测
- MOV DX,CON8255
- MOV AL,80H
- OUT DX,AX
- MOV DX,PA8255
- MOV AL,15H;05H=00000101;2,4红灯亮
- OUT DX,AL
- MOV DX,PC8255
- MOV AL,1FH;0FH=00001111
- OUT DX,AL;1、3绿灯灭
- MOV DX,PB8255
- MOV AL,1AH;0AH=00001010
- OUT DX,AL;1、3黄灯开始闪
- MOV CX,0
- LOP5_1:
- MOV DX,CON8255;检测PC7高电平
- MOV AL,88H
- OUT DX,AL;改PC口为输入方式,准备读入PC7
- MOV DX,PC8255
- IN AL,DX
- AND AL,80H;取PC7
- CMP AL,80H
- JNZ LOP5_1;如果不是高电平则不需要进行延时
- CALL DELAY
- INC CX
- CMP CX,05H
- JNZ LOP5_1
- MOV DX,CON8255
- MOV AL,80H
- OUT DX,AL
- MOV AL,10H
- MOV DX,PB8255
- OUT DX,AL
- MOV DX,PA8255
- MOV AL,1AH
- OUT DX,AL;0AH=00001010,1、3红灯亮
- MOV DX,PB8255
- MOV AL,1FH
- OUT DX,AL;0FH=00001111,黄灯全灭
- MOV DX,PC8255
- MOV AL,15H
- OUT DX,AL;05H=00000101,2、4绿灯亮
- CALL DELAY
- MOV DX,CON8253;重新写入方式控制字,0方式
- MOV AL,70H
- OUT DX,AL
- MOV DX,CLK18253
- MOV AX,0BB8H
- OUT DX,AL
- MOV AL,AH
- OUT DX,AL;0BB8H=3000,即通道1的计数值为3000,也就是30S
- LOP30_2:
- MOV AL,0;扫描PC4口是否有高电平输入
- MOV DX,CON8255
- MOV AL,88H
- OUT DX,AL;改PC口为输入方式,准备读入PC4的值
- MOV DX,PC8255
- IN AL,DX
- AND AL,10H;取PC4的值
- CMP AL,10H
- JNZ LOP30_2;未检测到高电平则继续循环检测
- MOV DX,CON8255
- MOV AL,80H
- OUT DX,AX
- MOV DX,PA8255
- MOV AL,1AH;OAH=00001010,1,3路口红灯亮
- OUT DX,AL
- MOV DX,PC8255
- MOV AL,1FH;0FH=00001111
- OUT DX,AL;2、4绿灯灭
- MOV DX,PB8255
- MOV AL,15H;05H=00000101
- OUT DX,AL;2、4黄灯开始闪烁
- MOV CX,0
- LOP5_2:
- MOV DX,CON8255;检测PC7高电平
- MOV AL,88H
- OUT DX,AL;改PC口为输入方式,准备读入PC7
- MOV DX,PC8255
- IN AL,DX
- AND AL,80H;取PC7
- CMP AL,80H
- JNZ LOP5_2
- CALL DELAY
- INC CX
- CMP CX,05H
- JNZ LOP5_2
- JMP START;下一次循环
-
- DELAY PROC NEAR
- MOV DX,120;延时子程序
- DELAY1:
- MOV BX,1000
- DELAY2:
- DEC BX
- CMP BX,0
- JNZ DELAY2
- DEC DX
- CMP DX,0
- JNZ DELAY1
- RET
- DELAY ENDP
- CODE ENDS
- END START
复制代码
所有资料51hei提供下载:
123456.rar
(1.15 KB, 下载次数: 7)
|