求高手帮忙写一个汇编语言的简易交通灯程序

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-07-04
初学者求高手帮忙写两个简单的汇编程序,谢谢啦~

第一个问题比较简单:
DATA SEGMENT
B1 DB 0FEH
X DB ?
Y DB ?
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START: MOV AX,DATA
MOV DS,AX
MOV BL,B1
MOV AL,BL
AND AL,0FH
MOV X,AL
AND BL,0F0H
MOV CL,4
SHR BL,CL
MOV Y,BL
MOV AX,4C00H
INT 21H
CODE ENDS
END START
第二题嘛方法很多,这里提供两种:
DATA SEGMENT
BUF DB 10,?,10 DUP(?),'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE , DS:DATA
START:
MOV AX , DATA
MOV DS , AX
LEA BX , BUF
MOV DX , BX
MOV AH , 0AH
INT 21H
mov dl , 0ah
mov ah , 02h
int 21h
mov dl , 0dh
mov ah ,02h
int 21h
CMP 3[BUF] , 24H
JZ ANOTHER
CMP 4[BUF] , 24H
JZ ANOTHER
CMP 5[BUF] , '$'
JNZ ANOTHER
ADD BX , 3
MOV AH , 09H
INT 21H
JMP OVER
ANOTHER:
MOV DL , 3[BUF]
MOV AH , 02H
INT 21H
mov dl , 0ah
mov ah , 02h
int 21h
mov dl , 0dh
mov ah ,02h
int 21h
MOV DL , 4[BUF]
MOV AH , 02H
INT 21H
OVER:
MOV AX , 4C00H
INT 21H
CODE ENDS
END START

这里还有一种精简的
.model small
.data
buf db 10 , ? , 10 dup(?) , '$'
.code
.startup
mov dx , offset buf
mov ah , 0ah
int 21h
mov dl , 0ah
mov ah , 02h
int 21h
mov dl , 0dh
mov ah ,02h
int 21h
mov dl , [buf+3]
mov ah , 02h
int 21h
mov dl , 0ah
mov ah , 02h
int 21h
mov dl , 0dh
mov ah ,02h
int 21h
mov dl , [buf+4]
mov ah , 02h
int 21h
.exit 0
end
完了,希望能给你提供帮助!

; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
CR equ 000DH
LF equ 000AH
KB_Back equ 0008H
KB_ESC equ 001BH
; -----------------------------------------
; 功能:输出一个字符
; 入口:dl=要显示的字符
enter_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
enter_Chr endp
; -----------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -----------------------------------------
; 功能:取光标位置
; 入口:无
; 出口:DH=行号,DL=列号
GetCursor Proc Near
PUSH AX
PUSH BX
PUSH CX
XOR BX,BX
MOV AH,3
INT 10H
MOV Cursor_Row,DH
MOV Cursor_Col,DL
POP CX
POP BX
POP AX
RET
Cursor_Row DB ?
Cursor_Col DB ?
GetCursor EndP
; -----------------------------------------
; 功能:置光标位置
; 入口:Cursor_Row=行坐标; Cursor_Col: 列坐标)
SetCursor Proc Near
PUSH CX
PUSH BX
PUSH AX
MOV DH,Cursor_Row
MOV DL,Cursor_Col
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
RET
SetCursor EndP
; -----------------------------------------
; 功能:输出回车换行
enter_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
enter_CTLF endp
; -----------------------------------------
; 功能:键盘输入一个N位的十进制数字,
; 用逻辑和移位指令将其转换成二进制数并保存在指定的内存单元。
; 入口:N=数字位数;di=保存输入的数字首地址
; 出口:转换后的二进制数保存在di所指的单元
Input_Digit Proc Near
push dx
push cx
push bx
push di
lea di,@@Save_Tmp
push di
cld
mov cx,N
push cx
@@Input: call GetCursor ;取光标位置
mov ah,1 ;从键盘接受一个字符
int 21h
cmp al,KB_ESC
jnz $+12
mov Mark_Bit,al
pop cx
pop di
pop di
pop bx
pop cx
pop dx
ret
cmp al,CR ;若键入的是回车,已经键入的数字不足N位
jz @@ASC_Dec ;转去处理已经键入的数字
cmp al,KB_Back
jz @@KBBack ;若是回空键,重新输入
cmp al,'0'
jb @@KB_Back ;若低于数字'0',重新输入
cmp al,'9'
ja @@KB_Back ;若低于数字'9',重新输入
jmp @@Save_Dig
@@KBBack: dec Cursor_Col
inc cx
dec di
@@KB_Back: call SetCursor ;置光标位置
jmp @@Input
@@Save_Dig: and al,0fh ;转换成二进制数
stosb ;保存
loop @@Input ;接受下一个数字
@@ASC_Dec: mov ax,cx
pop cx
pop si
sub cx,ax ;实际输入的数字位数
xor dx,dx
xor ax,ax
jcxz @@Save_Ret ;若直接回车,没有输入任何数字,按输入'0'处理
dec cx ;实际输入的数字位数减1,准备把输入的这一串数字转换成二进制数
mov bx,10
@@Mul_Ten: lodsb
cbw
add ax,dx
mul bx
mov dx,ax
loop @@Mul_Ten
lodsb
cbw
add ax,dx
@@Save_Ret: pop di
stosw
pop bx
pop cx
pop dx
mov Mark_Bit,0
ret
@@Save_Tmp db 16 dup(?)
Input_Digit EndP
; -----------------------------------------
; 功能:将AL中的低4位二进制数转换成十六进制显示的ASCII码
; 入口:AL
; 出口:AL=转换后的ASCII码
AL_ASCII Proc Near
cmp al,10 ;AL<10?
jb @@To_ASCII ;AL<10,按数字处理
add al,7 ;AL>=10,按大写字母处理
@@To_ASCII: add al,'0' ;转换成相应的数字或大写字母
ret
AL_ASCII EndP
; -----------------------------------------
; 功能:将AL中的字节数转换成十六进制显示的ASCII码
; 入口:AL
; 出口:AX=转换后的ASCII码
Byte_ASCII Proc Near
push cx
mov cx,4
xor ah,ah ;将AH置0
shl ax,cl ;将AX左移4位
shr al,cl ;将AL右移4位
xchg ah,al
call AL_ASCII ;调用子程序,将AL中的值转换成相应的ASCII码
xchg ah,al
call AL_ASCII
xchg ah,al
pop cx
ret
Byte_ASCII EndP
; -----------------------------------------
N equ 5 ;数字位数
Number dw ? ;16位二进制数
PromptStr DB 'Please input a decimal(0---65535, ESC to exit): $'
Hex_String db 'The heximal: '
Hex_Str db ' H$'
Mark_Bit db ? ;标志字节
Disp_Ok db 'OK$'
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
Input_Dec: Output PromptStr ;提示输入十进制数
lea di,Number ;分数存放地址
call Input_Digit ;从键盘输入一个十进制数
cmp Mark_Bit,KB_ESC
je Exit_Proc
call enter_CTLF ;输出一个回车、换行
call enter_CTLF ;输出一个回车、换行
lea di,Hex_Str
mov ax,Number ;读出这个数
push ax
xchg ah,al ;先转换高位字节
call Byte_ASCII ;把8位二进制数转换成十六进制显示的ASCII码
stosw ;保存至字符串变量
pop ax
call Byte_ASCII ;把8位二进制数转换成十六进制显示的ASCII码
stosw
Output Hex_String ;显示十六进制数
call enter_CTLF ;输出一个回车、换行
call enter_CTLF ;输出一个回车、换行
jmp Input_Dec
Exit_Proc: call SetCursor ;置光标位置
Output Disp_Ok
mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束

最简单的单片机交通信号灯

单片机要求使用 AT89C51,信号灯连接电路如下:

东西:绿灯P0.0 黄灯P0.1 红灯P0.2
南北:绿灯P0.5 黄灯P0.6 红灯P0.7

运行步骤:
开始

东西 南北 都是红灯

步骤(1)
南北绿灯亮15s,东西红灯亮15s。
南北黄灯亮 3s,东西红灯亮 3s。
南北红灯亮15s,东西绿灯亮15s。
南北红灯亮 3s,东西黄灯亮 3s。
循环步骤(1)

;============================================
用汇编语言编写的程序如下,在12MHz的条件下,已经通过了仿真调试。
;--------------------------------------------
ORG 0000H
MOV P0, #01111011B ;P0.7=P0.2=0, 东西 南北 都是红灯.
CALL DL3S
LOOP:
MOV P0, #11011011B ;P0.5=P0.2=0, 南北绿 东西红.
CALL DL15S
MOV P0, #10111011B ;P0.6=P0.2=0, 南北黄 东西红.
CALL DL3S
MOV P0, #01111110B ;P0.7=P0.0=0, 南北红 东西绿.
CALL DL15S
MOV P0, #01111101B ;P0.7=P0.1=0, 南北红 东西黄.
CALL DL3S
SJMP LOOP
;--------------------------------------------
DL15S:
MOV R4, #5
DL2:
CALL DL3S
DJNZ R4, DL2
RET
;--------------------------------------------
DL3S: ;延时3s,实测3.03s
MOV R5, #23
DL3:
MOV R6, #0
DL4:
MOV R7, #0
DL5:
DJNZ R7, DL5
DJNZ R6, DL4
DJNZ R5, DL3
RET
END
;============================================
电路图,可以搜索:
做而论道 最简单的单片机交通信号灯
百度一下,即可找到。

org 0000h
ajmp main
org 0003h
ajmp intto
org 0100h
main:
mov sp,#60h
setb ea
setb ex0
clr it0

m1:
mov p0,#018h
acall d1
mov p0,#024h
acall d1
mov p0,#042h
acall d1
mov p0,#024h
acall d1
ajmp main

intto:
clr ex0
push th1
push tl1
push p0
setb ex0
jb p1.0,l1
mov p0,#42h
acall d2
ajmp l3

l1:
jb p1.1,l2
mov p0,#18h
acall d2
ajmp l3

l2:
jb p1.2,l3
mov p0,#12h
acall d2
ajmp l3

l3:
clr ex0
pop p0
pop tl1
pop th1
setb ex0
reti

d1:
mov r0,#10
mov tmod,#10h
mov th1,#15h
mov tl1,#0a0h
setb tr1
lp2:
jbc tf1,lp1
sjmp lp2
lp1:
mov th1,#15h
mov tl1,#0a0h
djnz r0,lp2
ret
d2:
mov tmod,#10h
mov th1,#0ech
mov tl1,#78h
setb tr1
lp3:
jbc tf1,lp4
sjmp lp3
lp4:
mov th1,#0ech
mov tl1,#78h
djnz r0,lp3
ret
end
这也是交通程序不知道能不能帮你

  • 求汇编高手帮忙编写一段程序
    答:这回完全测试通过了,除了代码比较冗余。如果看不懂可以在MSN找我。feng.gzh@hotmail.com --- .model small .data data1 db 6 dup(0) ;多的一位是符号位,其中保存正号或者负号的ascii data2 db 5 dup(0)data3 db 5 dup(0);p_big dd 0 ;p_small dd 0 input1 db 6,0,6 dup(?
  • 急求!请高手帮忙,用汇编语言编写一个加法运算器。请帮我写一个...
    答:DATA SEGMENT X DW ?SYMBOL DB ?Y DW ?Z DW ?DISPINFO1 DB 'NOT YUNSUAN CHAR!','$'DISPINFO2 DB 'YUSHU IS:$'CUAN DW 10000,1000,100,10,1 DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE START: MOV AX,DATA MOV DS,AX BINGIN: ...
  • 求高手帮忙写一汇编程序
    答:用Atmel89C51和Maxim7219实现一个8位LED显示时钟。编译通过了,DIGIT是显示缓存器,用来接收BUF,SBF,MBF,HBF表示的秒,分,时数据,计时器采用中断实现。程序如下:ORG 0000H AJMP MAIN ORG 000BH AJMP CLOCK ORG 001BH MAIN: MOV TMOD,#01H ;定时器方式1 MOV TL0,#0B0H ;定时器低位初值 MOV...
  • 高分悬赏!高手给我写汇编语言实验啊?
    答:jg exit ;输入字母则退出主程序 add ebx , eax dec esi cmp esi , 0 jnz rotate mov dl , ' 'mov ah , 02 int 21h and ebx , 000000ffh mov ecx , ebx xor edx , edx xor eax , eax call fibo ;递归调用 mov ebx , edx xor eax , eax mov si , 8 mov oper0 , ...
  • 求汇编语言高手帮忙编个程序
    答:;汇编,输入十进制,输出十六进制 code segment assume cs:code,ds:code org 100h start:push cs pop ds Again:lea dx,Tips1 mov ah,9 int 21h ;显示提示 xor bp,bp ;BP清0 mov cx,5 In:mov ah,0 int 16h ;无回显输入 cmp al,1bh ;Esc退出程序 jz quit cmp al,0dh jz Show ;...
  • 编写一个简单的汇编语言程序~求高手帮忙
    答:输入部分,你自己写吧 64位的长整数转化成10进制数并用ASCII码表示出来 参考资料:http://tieba.baidu.com/f?kz=587761326
  • 汇编语言习题,,,高手帮忙
    答:2009-10-23 汇编语言一道题 11 2010-01-03 汇编语言的一道题 3 2009-04-26 汇编语言习题 20 2010-10-17 汇编语言的一题!!急!! 1 2010-07-13 汇编语言的一道题 谢谢啦 1 2009-04-20 汇编语言简单习题 18 2015-02-03 关于汇编语言的一道题!急! 2009-05-13 汇编语言习题答案 20 更多...
  • 求高手帮忙写一个c语言发牌程序
    答:鷹弈 采纳率:57% 来自:芝麻团 擅长: C/C++ 汇编语言 其他回答 自动发牌 一副扑克有52张牌,打桥牌时应将牌分给四个人。请设计一个程序完成自动发牌的工作。要求:黑桃用S(Spaces)表示;红桃用H(Hearts)表示;方块用D(Diamonds)表示;梅花用C(Clubs)表示。*问题分析与算法设计 按照打桥牌的规定,每人应当有13...
  • 帮忙写一个简单的汇编程序
    答:DSEG SEGMENT table DB 100 DUP(1)A DB 0 B DB 0 C DB 0 DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG START: MOV AX,DSEG MOV DS,AX ;>>> ;代码添加处 ;>>> MOV BX,OFFSET TABLE MOV Cl,100 LP: CMP BYTE PTR [BX],0 JB FU CMP BYTE PTR [BX],0 JA ZH ADD B,...
  • 单片机初学者,单片机汇编语言不懂,谁能帮我看下,谢谢 ORG 0000H MOV...
    答:ORG 0000H ;ORG是汇编伪指令,定位程序地址用,这里是程序入口0000HMOV P1,#0FFH ;给P1口赋值FFH,即P1口全部置1P1.0=1;P1.0口置1,这里单独给P1口的第一位置1.;这个程序没写完,至少应该结尾处有一个END,为了使程序可控,结束前加一个死循环较好。因此需要加如下两句:SJMP $ ;原地循环,这样可以保持以前的状态...