logo资料库

汇编语言写的交通灯模拟系统.doc

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
前期实验报告 一.实验题目:交通灯模拟系统. 二.实验目的 通过并行接口 8255 实现十字路口交通灯的模拟控制,进一步掌握并行口的 使用、定时器的定时和 LED 数码管的动态显示。 三.实验内容 利用 8255 端口 C 控制 LED 发光管。LED 发光管 L7(红)、L6(黄)、L5 (绿)作为南北路口的交通灯与 8255 的 PC7、PC6、PC5 相连,L2(红)、L1 (黄)、L0(绿)作为东西路口的交通灯与 PC4、PC3、PC2 相连。编程使六个 灯按交通灯变化规律亮灭。十字路口的交通灯的变化规律要求: (1)南北路口的绿灯、东西路口的红灯同时亮 30 秒左右。 (2)南北路口的黄灯闪烁若干次,同时东西路口的红灯继续亮。 (3)南北路口的红灯、东西路口的绿灯同时亮 30 秒左右。 (4)南北路口的红灯继续亮、同时东西路口的黄灯闪烁若干次。 (5)转 1 重复。 1. 利用软件延时子程序实现 30 秒控制 2. 利用 8253 硬件延时实现 30 秒控制 3. 结合电路图(使用 8255 端口 A 和 PC1、PC0),利用 8253 定时,将绿灯亮的 剩余时间在两位 LED 数码管上动态显示出来。 五.初步实现方案和功能 (1) 利用试验箱上的 8255 电路,8253 定时器,8259A 中断控制器,LED 显示电 路和单脉冲发生器,按下图构成试验电路。8255 的地址选择:288H~28bH,8253 地址选择:280H~283H。 电路图(略) (2) 令 8255 的 A 和 C 工作在方式 0 输出,8259 选择 IRQ3 中断,按实验要求(3) 编写顺序控制程序。若 PCi 输出高电平,则相应的 LED 数码管亮。8253 的计数 通道 0 和 1 的工作方式为方式 3,计数初值都为 1000,每一计数时间为一秒。 (3) 为快捷编写顺序控制程序,将灯显示规则细分为 16 种状态,每种状态的延 时时间及需要向 C 口写入的数据列入下表中。 1
状态 延时(s) 红 黄 绿 红 黄 绿 PC7 PC6 PC5 PC4 PC3 PC2 十六进制数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 30 1 1 1 1 1 1 30 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 30H 50H 10H 50H 10H 50H 10H 84H 88H 80H 88H 80H 88H 80H 总体的设计方案是:主程序控制灯和 LED 数码管的显示,而中断延时子程序控 灯的显示状态和 LED 数码管的倒计时(绿灯 30 秒计时: 29~00,黄灯 6 秒计时:6~1)数字显示。 1. 主程序流程图 开始 初始化 8255,8259,8253 设置循环初始值 是 取灯显示状态 否 0ffH 比较 是否相等 否 将灯状态从 C 口输出 将 倒 计 时 数 从 A 口 输 出、,并显示 判 断是 否 有键按下 是 停止程序退出 结束 2
2. 中断延时子程序 开始 否 flag=0? 是 绿灯倒计时数值减一 黄灯倒计时计数减一, 同时控制灯显示下一个状态 计数值送计数单元 否 计 算 值 是 否为 0 是 是 flag=0? 否 绿灯倒计时计数单元重新赋值 29 flag 取非 结束 主程序 ; LED 发光管 L7、L6、L5 作为南北路口的交通灯与 8255 的 PC7、PC6、PC5 相连 ; LED 发光管 L2、L1、L0 作为东西路口的交通灯与 8255 的 PC4、PC3、PC2 3
相连 ; 红 黄 绿 红 黄 绿 0 0 .model small .data DENG db 30h,50h,10h,50h,10h,50h,10h db 83h,88h,80h,88h,80h,88h,80h db 0ffh byte 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh byte 3,0 word ? ;存放要显示的十位和个位 ;六个灯可能 ;的状态数据 ;结束标志 ;段码 ;位码 ;控制灯显示 ;存放灯状态,有绿灯为 0,黄灯非 0 led buf bz N flag intseg intoff intimr word 0 byte 0 dw ? dw ? db ? .code start: mov mov mov mov out ax,@data ds,ax dx,28bh al,80h dx,al mov mov out al,0 dx,28ah dx,al ax,350bh 21h intseg,es intoff,bx mov int mov mov ; cli push ds mov mov mov mov int pop dx,offset intproc ax,seg intproc ds,ax ax,250bh 21h ds ;将 8255 设为 A 和 C 口输出 ;关掉数码管显示 ;中断设置 ;设置新中断向量表项 4
al,21h intimr,al al,0f7h 21h,al dx,283h al,36h dx,al ax,1000 dx,280h dx,al al,ah dx,al dx,283h al,76h dx,al ax,1000 dx,281h dx,al al,ah dx,al ; in mov and out mov mov out mov mov out mov out mov mov out mov mov out mov out sti ;向 8253 写控制字 ;使通道 0 为工作方式 3 ;写入循环计数初值 1000 ;先写入低字节 ;后写入高字节 ;设 8253 通道 1 工作方式 3 ;写入循环计数初值 1000 ;先写低字节 ;后写高字节 mov mov mov out cmp jz bx,N al,DENG[bx] dx,28ah dx,al al, 0ffh a ;点亮相应的灯 a: again: mov N,0 bl,buf mov bh,0 mov al,led[bx] mov dx,288h mov dx,al out al,2 mov dx,28ah mov out dx,al call delay ;bl 为要显示的十位数 ;求出对应的 led 数码 ;自 8255 的 A 口输出 ;使左边的数码管亮 ;延时 5
;关掉数码管显示 ;bl 为要显示的数 ;求出对应的 led 数码 ;自 8255 的 A 口输出 ;使右边的数码管亮 ;延时 ;关掉数码管显示 ;有键按下则退出 mov mov out al,0 dx,28ah dx,al bl,buf+1 mov bh,0 mov al,led[bx] mov dx,288h mov dx,al out al,1 mov dx,28ah mov out dx,al call delay mov al,0 mov dx,28ah out dx,al mov ah,0bh int 21h test al,al je again cli mov al,intimr out 21h,al mov dx,intoff mov ax,intseg mov ds,ax mov ax,250bh int 21h sti .exit delay proc ;延时 push cx mov cx,3000 delay1: loop delay1 pop cx ret delay endp 6
;要显示的数减 1 proc intproc sti push ax push ds ; mov ax,@data mov ds,ax ; cmp flag,0 jnz yellow mov al,buf+1 dec al cmp al,9 jb intp2 mov al,9 jmp intp yellow: inc N mov al,buf+1 dec al cmp al,6 jb intp2 mov al,6 jmp intp2 intp: mov ah,buf dec ah cmp ah,9 jb intp1 mov ah,0 jmp intp2 intp1: intp2: mov buf,ah mov buf+1,al mov al,buf+1 7
e mov ah,buf cmp ax,0 jnz cmp flag,0 jz mov buf,02h mov buf+1,09h f f: e: not flag mov al,20h out 20h,al pop ds pop ax iret intproc endp end start 8
分享到:
收藏