标题:求大虾帮忙看看~ 我这程序怎么才能达到预计目的啊~
只看楼主
zhouzhuia
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2011-4-15
结帖率:100%
 问题点数:0 回复次数:0 
求大虾帮忙看看~ 我这程序怎么才能达到预计目的啊~
请大虾们帮我看看~  我这程序生成EXE文件后怎么不能达到预计目的啊~  真的很急啊~  过两天就要答辩了~  请帮我指出错在哪里,并改正下~  谢谢~
一、设计目标
模拟制作一套汽车信号灯微机控制系统,该系统可以正确反映驾驶操作与灯光信号的对应关系。
二、设计要求
汽车控制所需执行的操作包含左转弯、右转弯、应急、脚刹车、手刹车,这些操作均由相应的开关状态反映,所需控制的信号灯有:仪表盘左/右转弯信号指示灯、手刹抬起信号指示灯、左右头灯和左右尾灯,其驾驶操作与灯光信号对应关系如下:
1. 左/右转弯灯开关(合上时):仪表盘左/右转弯信号指示灯、左/右头灯、左/右尾灯闪烁。
2. 紧急开关合上:所有灯闪烁。
3. 刹车(合上刹车开关):左右尾灯亮。
4. 左/右转弯刹车:左/右转弯灯、左/右头灯、左/右尾灯闪烁,右/左尾灯亮。
5. 刹车、合上应急开关:尾灯亮、仪表盘左/右转弯信号指示灯和头灯都闪烁。
6. 左/右转弯刹车,并合上紧急开关:右/左尾灯亮,其余灯闪烁。
三、设计提示
1. 引脚信号定义
采用8255A的PA口作为开关控制,PB口作为灯的控制,开关与灯的逻辑关系(1表示开关合上,0表示打开;1表示灯亮,1(闪)表示闪烁,0表示熄灭)
表14.3  8255控制信号灯逻辑关系表

2. 工作原理
由要求可知,汽车信号灯控制系统可分为:左转、右转、刹车、应急开关闭合、手刹停车五种基本操作,而按要求又可组合为十组操作,即左转、右转、应急开关合、刹车、左转刹车、右转刹车、刹车并合上应急开关、左转刹车并合上应急开关、右转刹车并合上应急开关和拉上手刹并停靠。因此,可以分别设计十个子程序表示以上的十种操作功能。
五个开关输入分别控制五种基本操作,而CPU处理数据时是以字节处理,故在编写原代码时只用其中的五位。输出为两个头灯、两个尾灯、三个仪表板灯,(可采用发光二极管代替)。同上,为便于处理,程序中也是采用八位,但在接线时接七位就可以了。
在实现五个开关控制七个发光二极管时,主要是利用软件实现。软件实现:整体上采用子程序分支调用,局部对需要闪烁的状态来说则采用循环延时来实现,其余则采用顺序执行的方式;如果用硬件控制灯光闪烁,则需采用定时/计数器8253,在输入一定时钟脉冲的情况下,实现定时计数功能。
我写的程序是:
data segment                                              ;数据段
io8255a equ 288H                                          ;8255的A口地址
io8255b equ 289H                                          ;8255的B口地址
io8255c equ 28aH     ;8255的C口地址
io8255con equ 28bH                                         ;8255A的控制口地址
ctr    db 'enter c key to continue!',0ah,0dh              ;程序初始提示信息
       db 'enter other keys to exit to dos!',0ah,0dh,'$'
ctr01  db '1. zuo zhuan wan.....',0ah,0dh,'$'        ;左转弯时提示信息(以下类似)
ctr02  db '2. you zhuan wan.....',0ah,0dh,'$'
ctr03  db '3. jin ji kai guan he shang.....',0ah,0dh,'$'
ctr04  db '4. sha che.....',0ah,0dh,'$'
ctr05  db '5. zuo zhuan wan sha che.....',0ah,0dh,'$'
ctr06  db '6. you zhuan wan sha che.....',0ah,0dh,'$'
ctr07  db '7. jin ji sha che.....',0ah,0dh,'$'
ctr08  db '8. jin ji zuo zhuan sha che.....',0ah,0dh,'$'
ctr09  db '9. jin ji you zhuan sha che.....',0ah,0dh,'$'
ctr10  db '10. ting kao.....',0ah,0dh,'$'
data ends


stack segment stack                                          ;堆栈段
sta dw 50 dup(?)
stack ends
code segment                                               ;代码段
     assume cs:code,ds:data,es:data,ss:stack
main proc far
start: push ds
       sub ax,ax
       push ax
       mov ax,data
       mov ds,ax
       mov es,ax

ccc:   mov dx,offset ctr     ;显示提示信息
       mov ah,09h
       int 21h
       mov ah,01h
       int 21h
       cmp al,'c'            ;若输入‘C’,则继续执行,否则返回到DOS
       jz eee
       mov ax,4c00h
       int 21h
 
eee:   mov dx,io8255con      ;给8255A送入方式控制字89H 设置为A口输出,C口输入(因为实验箱上没B口)
       mov al,89h
       out dx,al
      
       mov dx,io8255c        ;将4个开关的状态送入AL
       in  al,dx
      
       mov cx,0020h          ;设置循环次数
bb1:   cmp al,01h            ;将al的值依次与01H到0AH比较
       jnz bb2               ;不是01H则转bb1执行,是则调用中断在屏幕上显示相应提示信息,顺序执行下去
       mov dx,offset ctr01
;左转弯状态,实现六盏灯状态为:闪、灭、闪、灭、闪、灭
       mov ah,09h
       int 21h               ;调用09号中断,在屏幕上显示现在正处于左转弯状态
       mov dx,io8255a
left:  mov al,11101010b  ;六盏灯状态为:亮、灭、亮、灭、亮、灭(最高两位没影响)
       out dx,al
       call delay0        ;调延时子程序
       loop left
       jmp ccc

bb2:   cmp al,02h
       jnz bb3
       mov dx,offset ctr02
;右转弯状态,实现六盏灯状态为:灭、亮、灭、亮、灭、亮
       mov ah,09h
       int 21h
       mov dx,io8255a

right: mov al,11010101b ;六盏灯状态为:灭、亮、灭、亮、灭、亮
       out dx,al
       call delay0
       loop right
       jmp ccc

bb3:   cmp al,03h
       jnz bb4
       mov dx,offset ctr03 ;紧急开关合上
       mov ah,09h
       int 21h
       mov dx,io8255a

hurry: mov al,11000000b  ;六盏灯状态为:闪、闪、闪、闪、闪、闪
       out dx,al
       call delay0
       mov al,11111111b
       out dx,al
       call delay0
       loop hurry
       jmp ccc

bb4:   cmp al,04h
       jnz bb5
       mov dx,offset ctr04    ;刹车
       mov ah,09h
       int 21h
       mov dx,io8255a

break:  mov al,11000011b ;六盏灯状态为:灭、灭、灭、灭、亮、亮
       out dx,al
       call delay0
       loop break
       jmp ccc

bb5:   cmp al,05h
       jnz bb6
       mov dx,offset ctr05  ;左转弯刹车
       mov ah,09h
       int 21h
       mov dx,io8255a

leftbreak: mov al,11001010b  ;六盏灯状态为:亮、灭、亮、灭、亮、灭
           out dx,al
           call delay0
           loop leftbreak
           jmp ccc

bb6:   cmp al,06h
       jnz bb7
       mov dx,offset ctr06   ;右转弯刹车
       mov ah,09h
       int 21h
       mov dx,io8255a

rightbreak: mov al,11000101b ;六盏灯状态为:灭、亮、灭、亮、灭、亮
            out dx,al
            call delay0
            loop rightbreak
            jmp ccc

bb7:   cmp al,07h
       jnz bb8
       mov dx,offset ctr07   ;紧急刹车
       mov ah,09h
       int 21h
       mov dx,io8255a

hurrybreak: mov al,11111111b ;六盏灯状态为:亮、亮、亮、亮、亮、亮
            out dx,al
            call delay0
            loop hurrybreak
            jmp ccc
              
bb8:   cmp al,08h
       jnz bb9
       mov dx,offset ctr08   ;紧急左转刹车
       mov ah,09h
       int 21h
       mov dx,io8255a

hurryleftbreak: mov al,11111111b ;六盏灯状态为:亮、亮、亮、亮、亮、亮
                out dx,al
                call delay0
                mov al,11011111b
                out dx,al
                call delay0
                loop hurryleftbreak
                jmp ccc

bb9:   cmp al,09h
       jnz bb10
       mov dx,offset ctr09   ;紧急右转刹车
       mov ah,09h
       int 21h
       mov dx,io8255a
hurryrightbreak: mov al,11111111b ;六盏灯状态为:亮、亮、亮、亮、亮、亮
                 out dx,al
                 call delay0
                 mov al,11101111b
                 out dx,al
                 call delay0
                 loop hurryrightbreak
                 jmp ccc

bb10:  cmp al,0ah
       jnz bb11
       mov dx,offset ctr10  ;停靠
       mov ah,09h
       int 21h
       mov dx,io8255a

stop:  mov al,11001100b       ;六盏灯状态为:灭、灭、亮、亮、闪、闪
       out dx,al
       call delay0
       mov al,11001111b
       out dx,al
       call delay0
       loop stop
       jmp ccc
      
bb11:  jmp ccc
       ret   
main   endp


delay  proc near                            ;延时子程序
       push cx
       mov cx,0ffffh
pp:    loop pp
       pop cx
       ret
delay  endp

delay0 proc near                            ;延时子程序
       push cx
       push ax
       mov cx,0080h
pp0:   call delay
       loop pp0
       pop ax
       pop cx
       ret
delay0 endp

code   ends
       end main

搜索更多相关主题的帖子: 信号灯 仪表盘 指示灯 汽车 
2011-04-15 18:52



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-336830-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.091314 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved