求单片机交通灯模拟设计 汇编程序 和原理图

用单片机8051设计一个十字路口的红、绿、黄交通信号灯控制系统,要求如下:1)用红、绿、黄三色发光二极管作信号灯。考虑到学生设计时的难度,只考虑一条道路相对的两个方向,每... 用单片机8051设计一个十字路口的红、绿、黄交通信号灯控制系统,要求如下:
1)用红、绿、黄三色发光二极管作信号灯。考虑到学生设计时的难度,只考虑一条道路相对的两个方向,每个方向有红、绿、黄三个灯。红灯亮禁止通行,绿灯亮允许通行,每隔30秒红绿灯交替变换。在每次由绿灯亮变成红灯亮或者由红灯亮变成绿灯亮的交替变化转换时要求黄灯闪烁5秒,给行驶中的车辆有时间停靠到禁行线之外。
2)能实现正常的计时显示功能。用倒计时的方法显示红灯、绿灯、黄灯还需亮的时间。
3)能实现控制器总清零功能。按下某个键后,系统实现总清零,计数器由初始状态开始计数,对应状态的指示灯亮
展开
 我来答
773003
2011-04-10
知道答主
回答量:7
采纳率:0%
帮助的人:0
展开全部
晶振为11.0592MHz
FIRST EQU P2.7 ;第一位数码管的位控制
SECOND EQU P2.6 ;第二位数码管的位控制
SEC BIT 00H ;1秒到的标记
VALUE EQU 21H
COUNT EQU 22H ;软件计数器
COUNTER EQU 20 ;软件计数器的计数值,20乘以定时器的定时值(50ms),即得到1s的定时值
DISPBUF EQU 5EH ;5E,5FH是显示缓冲区
TMRVAR EQU 16857 ;(65536-50000)*12/11.0592 定时器初值
HIDDEN EQU 16 ;当秒十位为0时的消隐码
RED EQU P1.0 ;红灯LED
GREEN EQU P1.1 ;绿灯LED
YLW EQU P1.2 ;黄灯LED
FLAG EQU P1.3 ;红绿灯交替标志,不用接LED灯

ORG 0000H
JMP START
ORG 0003H ;INT0中断入口
RETI
ORG 000BH ;TIMER0中断入口
JMP INT_T0 ;转去定时器0中断服务程序入口
ORG 0013H ;INT1中断入口
RETI
ORG 001BH ;TIMER1中断入口
RETI
ORG 0023H ;串行中断入口
RETI
START:
MOV SP,#5FH ;设置堆栈指针初值
MOV VALUE,#1EH ;秒计数器30
MOV DISPBUF,#0;
MOV DISPBUF+1,#0
CALL DISP
CALL INIT_T0
CLR SEC
SETB EA ;开总中断
LOOP:
JBC SEC,NEXT ;一秒到,清除一秒到的标志
CALL DISP ;调用显示程序
JMP LOOP ;一秒未到,继续循环

NEXT:
;==============================
MOV A,VALUE
JNZ RG
CPL FLAG
SETB YLW ;关闭黄灯

RG: JB FLAG,REDL
SETB RED
CLR GREEN
JMP NEW
REDL: SETB GREEN
CLR RED
;=================================
NEW:
MOV A,VALUE ;获得秒的数值
MOV B,#10
DIV AB ;二进制转化为十进制,十位和个位分送显示缓冲区
JZ NEXT1 ;如果A中值是0,高位0消隐
JMP NEXT2 ;否则直接送去显示
NEXT1:
MOV A,#HIDDEN
NEXT2:
MOV DISPBUF,A
MOV DISPBUF+1,B ;个位送显示缓冲区
CALL DISP
JMP LOOP
;主程序到此结束

DISP:
PUSH ACC ;ACC入栈
PUSH PSW ;PSW入栈
;==================
MOV A,DISPBUF
CJNE A,#HIDDEN,XL
MOV A,DISPBUF+1 ;在确定没有十位的前提下,取个数
SUBB A,#6
JNC XL ;若秒数大于6,黄灯不闪,跳出执行其它
CLR YLW ;点亮黄灯
;==================
XL: MOV A,DISPBUF ;取第一个待显示数
MOV DPTR,#DISPTAB
MOVC A,@A+DPTR ;取字形码
MOV P0,A ;将字形码送P0位(段口)
CLR FIRST ;开第一位显示器位口
LCALL DELAY ;延时5毫秒
SETB FIRST ;关闭第一位显示器(开始准备第二位的数据)

MOV A,DISPBUF+1 ;取显示缓冲区的第二位
MOV DPTR,#DISPTAB
MOVC A,@A+DPTR
MOV P0,A ;将第二个字形码送P0口
CLR SECOND ;开第二位显示器
LCALL DELAY ;延时
SETB SECOND ;关第二位显示
;==========
SETB YLW ;关闭黄灯
;==========
POP PSW
POP ACC
RET

DELAY:
PUSH PSW
SETB RS0
MOV R7,#50
D1: MOV R6,#50
D2: DJNZ R6,$
DJNZ R7,D1
POP PSW
RET
DISPTAB: DB 0C0H,7EH,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,0C6H,0A1H,86H,8EH,0FFH

INIT_T0: ;初始化T0为10毫秒的定时器
MOV TMOD,#01H
MOV TH0,#HIGH(TMRVAR)
MOV TL0,#LOW(TMRVAR)
SETB ET0 ;开T0中断
SETB TR0 ;定时器0开始运行
RET ;返回

INT_T0:
PUSH ACC
PUSH PSW ;中断保护
MOV TH0,#HIGH(TMRVAR)
MOV TL0,#LOW(TMRVAR)
INC COUNT ;软件计数器加1
MOV A,COUNT
CJNE A,#COUNTER,INT_RET
MOV COUNT,#0 ;计到20,软件计数器清0
SETB SEC ;将秒标志置为1
DEC VALUE ;秒的值减1
MOV A,VALUE
CJNE A,#0FFH,INT_RET
MOV VALUE,#30
INT_RET:
POP PSW
POP ACC
RETI
END
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式