题目 交通灯控制系统的设计
一、课程设计的目的与要求
1、课程设计目的:
(1)进一步理解和消化书本知识,运用所学知识和技能进行简单的设计。
(2)通过课程设计提高应用能力,分析问题和解决问题的能力。
(3)培养查阅资料的习惯,训练和提高自学,独立思考的能力。
2、课程设计要求
交通灯控制系统的设计
1) 掌握在单片机系统中扩展简单I/O接口的方法。
2) 掌握数据输出程序的设计方法。
3) 掌握模拟交通灯控制的实现方法。
4) 掌握外部中断技术的基本使用方法。
5) 掌握中断处理程序的编程方法。
从课程设计的目的出发,通过设计工作的各个环节,达到以下要求:
(1)能够正确理解课程设计的题目和意义,全面思考问题。
(2)运用科学合理的方法,认真按时完成。
二、课程设计课题的分析
1、电路的设计
1)原理
要完成本实验,首先必须了解交通灯的亮灭规律。本实验需要用到试验箱上八个发光二极管中的六个,即红、绿、黄各两个。将L1(红)、L2(绿)、L3(黄)作为东西方向的指示灯,将L5(红)、L6(绿)、L7(黄)作为南北方向的指示灯。交通灯的亮灭规律为:初始态是两个路口的红灯全亮,之后,东西路口的绿灯亮,南北路口的红灯亮,东西方向通车,延时一段时间后,东西路口绿灯灭,黄灯开始闪烁。闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北方向开始通车,延时一段时间后,南北路口的绿灯灭,黄灯开始闪烁。闪烁若干次后,再切换到东西路口方向,重复上述过程。
各发光二极管的阳极通过保护电阻接到+5V的电源上,阴极接到输入端上,因此使其点亮使相应使相应输入端为低电平。
当有急救车到达时,两个方向上的红灯亮,以便让急救车通过,假设急救车通过路口的时间为10秒,急救车通过后,交通灯恢复中断前的状态。本程序以单次脉冲为中断申请,表示有急救车通过,单次脉冲输出端P-接CPU板上的INT0。
2)、硬件电路图
图1—1 交通灯控制系统的硬件接线图
74LS273的输出00—07接发光二极管L1—L8,74LS273的片选CS273接片选信号CS2,此时74LS273的片选地址为CFA0—CFA7之间任选。
3)、程序流程图
主程序流程
图1—2 主程序软件流程图
中断程序流程图
三、课程设计的结果
1、程序
NAME JIAOTONGGENG
OUTPORT EQU 0CFB0H ;端口地址
SAVE EQU 55H ;SAVE保存从端口CFA0输出的数据
CSEG AT 0000H
LJMP START
CSEG AT 4003H
LJMP INT
CSEG AT 4100H
START: SETB IT0 ;中断程序初始化
SETB EX0
SETB EA
MOV A,#11H ;置首显示码,两红灯全亮
MOV SAVE,A ;保存
ACALL DISP ;显示输出
ACALL DE3S ;延时3秒
LLL: MOV A,#12H ;东西路口绿灯亮,南北路口红灯亮
MOV SAVE,A
ACALL DISP
ACALL DE10S ;延时10秒
MOV A,#10H ;东西路口绿灯灭
MOV SAVE,A
ACALL DISP
MOV R2,#05H ;东西路口黄灯闪烁5次
TTT: MOV A,#14H
MOV SAVE,A
ACALL DISP
ACALL DE02S ;延时02秒
MOV A,#10H
MOV SAVE,A
ACALL DISP
ACALL DE02S
DJNZ R2,TTT
MOV A,#11H ;红灯全亮
MOV SAVE,A
ACALL DISP
ACALL DE02S ;延时02秒
MOV A,#21H ;东西路口红灯亮,南北路口绿灯亮
MOV SAVE,A
ACALL DISP
ACALL DE10S ;延时10秒
MOV A,#01H ;南北路口绿灯灭
MOV SAVE,A
ACALL DISP
MOV R2,#05H ;南北路口黄灯闪烁5次
KKK: MOV A,#41H
MOV SAVE,A
ACALL DISP
ACALL DE02S ;延时02秒
MOV A,#01H
MOV SAVE,A
ACALL DISP
ACALL DE02S
DJNZ R2,KKK
JMP LLL ;转SSS循环
DE10S: MOV R5,#100 ;延时10秒
JMP DE1
DE3S: MOV R5,#30 ;延时3秒
JMP DE1
DE02S: MOV R5,#02 ;延时02秒
DE1: MOV R6,#200
DE2: MOV R7,#126
DE3: DJNZ R7,DE3
DJNZ R6,DE2
DJNZ R5,DE1
RET
DISP: MOV DPTR,#OUTPORT
CPL A ;取反,点亮发光二极管
MOVX @DPTR,A
RET
;中断处理程序
INT: PUSH ACC ;有关寄存器入栈
PUSH PSW
MOV A,#11H ;两红灯全亮
ACALL DISP
ACALL DELAY
MOV A,SAVE ;将主程序中保存的数据再送给A
ACALL DISP
POP PSW ;有关寄存器出栈
POP ACC
RETI
DELAY:MOV R1,#100
DEL1 :MOV R2,#200
DEL2 :MOV R3,#126
DEL3 :DJNZ R3,DEL3
DJNZ R2,DEL2
DJNZ R1,DEL1
RET
END
2、现象
将程序输入到单片机中,运行程序,可以观察到现象:首先是两个路口的红灯全亮,延时3秒之后,东西路口的绿灯亮,南北路口的红灯亮,东西方向通车,延时10秒后,东西路口绿灯灭,黄灯开始闪烁。闪烁5次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北方向开始通车,延时10秒后,南北路口的绿灯灭,黄灯开始闪烁。闪烁5次后,再切换到东西路口方向,重复上述过程。
当有中断申请时,两个方向上的红灯亮,经过10秒急救车通过之后,恢复到急救车到来之前的状态继续运行,可有多次的中断申请。
四、课程设计的心得与体会
1通过试验进一步理解和消化了书本知识,分析每个语句的含义,运用所学知识进行简单的程序设计。
了解了在单片机系统中扩展简单I/O接口的方法 外部中断技术的基本使用方法,掌握了中断处理程序的编程方法。
2通过在图书馆查阅各种单片机资料,培养了我自学和独立思考的能力。与同学交流研究,让我懂得了更多以前不明白的知识
3在课程设计过程中,不断调试程序和修改程序,提高了对单片机的应用能力,分析问题和解决问题的能力。
硬件电路设计
此电中路设计采用AT89C51单片机,74LS47(数码管驱动)74LS373(数码管驱动输出锁存),8个数码管显示其延时值,四个红、黄、绿指示灯。硬件设计关键在于,延时显示时,要考虑到当个位数字显示时,要确保十位数字显示输出的不变。因此,可加输出锁存器。在延时最后三秒时,要让黄灯进行闪烁,并同时显示数字(这一步在软件设计上很关键)。
(1)电路连接图:
三、软件程序(C语言)
以下是整个设计的软件程序,直接可以编译成。Hex代码。通过以上电路,下载到单片机,可直接运行。
//////程序名:十字路口交通灯控制
//编写人:黄庭剑
//初写时间:2009年1月2日
//程序功能:南北为车行道,延时60秒;东西方向为人行道,延时20秒,且在最后3秒黄灯显示2秒钟再实现切换
//CPU说明:AT89C51型单片机; 24MHZ晶体振荡器
//完成时间:2009年1月6日
////
#include<stdioh>
#include<reg51h>
#include<intrinsh>
sfr p0 = 0x80;
sfr p1 = 0x90;
sfr p2 = 0xA0;
sfr p3 = 0xb0; //这部分内容其实在“#include<reg51h>”里已经有,但里面定义的必须区分大小写,在这里,因为我程序采用的是小写,reg51h里对各个端口与寄存器的定义都是大写,所以在编译连接时,会报错,所以,在本设计程序里,我只用到了端口,在这里也就只定义了四个,而没有去改reg51h里面的内容。其实两者是一样的。
sbit sw = p0^0;
sbit OE =P0^6;
sbit LE =P0^7; //74LS373锁存器控制端定义
char display[]={ 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99 }; //p1口的数码管时间显示调用,利用74L74BCD码,8位驱动输出;//函数声明 begin
void delay1(int count);
void delay_long(int number1,int number2);
void people_car_drive();
//函数声明end
////延时子程序
void delay1(int count)
{ int i;
for(i=count;i>0;i--)
{ ;}
}
void delay_long(int number1,int number2)
{
int a,b;
for(a=number1;a>0;a--)
{
for(b=number2;b>0;b--)
{ _nop_(); }
}
}
////延时子程序
void people_car_drive()
{
int p_1=2,i,j=9,p_2=6; ////行人通行时,延时20秒
p2=0x09; //南北红灯亮
p3=0x24; //东西绿灯亮
while(p_1-->0)
{ LE=1;
OE=0;
if(p_1==0){OE=1;} //当十位数减到0时,只显示个位数
p1=display[p_1];
delay1(1000);
LE=0;
j=9;
for(i=10;i>0;i--)
{
if(p_1==0&&j==3)break; //减到3时退出循环,让其黄灯闪烁显示
p1=display[j--];
delay_long(16000,2);
if(sw==1)return;
}
}
////
p2=0x12; //南北黄灯闪烁三秒,以提醒行人注意
p3=0x12;
p1=display[3];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[2];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[1];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
//以下是车辆通行时延时60秒//
p2=0x24; //南北绿灯亮
p3=0x09; //东西红灯亮
while(p_2-->0)
{ LE=1;
OE=0;
if(p_2==0){OE=1;} //当十位数减到0时,只显示个位数
p1=display[p_2];
delay1(1000);
LE=0;
j=9;
for(i=10;i>0;i--)
{
if(p_2==0&&j==3)break; //减到2时退出循环
p1=display[j--];
delay_long(16000,2);
if(sw==1)return;
}
}
p2=0x12; //南北黄灯闪烁三秒,以提醒行人注意
p3=0x12;
p1=display[3];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[2];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[1];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1); //南北黄灯闪烁三秒完毕
}
void main() //主函数入口处
{
p0=0x01;
p1=0x00;
p2=0x00;
p3=0x00; //初始化各端口
{ while(1)
{
if(sw==0)
{ people_car_drive();}
else
{
p2=0x00;
p3=0x00; //关闭所有交通灯
}
}
}
}
// 51单片机控制交通灯要求用汇编语言,仿真实例,可以参考一下
SNF EQU 00H ; 南北通行标志位
EWF EQU 01H ; 东西通行标志位
URF EQU 02H ; 紧急事件标志位
ORG 0000H
LJMP MAIN ; 上电转主程序
ORG 000BH ; 定时中断入口
LJMP DSZD
ORG 0003H ; 紧急中断入口
LJMP URZD
ORG 0030H
MAIN: LCALL INIT ; 调用初始化子程序
LOOP: LCALL DIS ; 循环执行显示子程序
AJMP LOOP
; 初始化程序
INIT: SETB SNF
SETB EWF
SETB URF
MOV R2,#20 ; 定时器中断20次为1s
MOV TMOD,#01H ; 初始化定时器
MOV TL0,#0B0H
MOV TH0,#3CH
SETB EA ; 开定时中断与紧急中断
SETB ET0
SETB TR0
SETB EX0
SETB IT0 ; 设置中断程控方式
MOV DPTR,#TAB ; 数值首地址放入DPTR中
MOV 40H,#40 ; 东南西北通行时间设置
MOV 41H,#40
MOV 30H,#40 ; 通行时间初始化
MOV 31H,#60
MOV P0,#4CH ; 初始化时南北通行并把交通灯状态分别放在32H和33H中
MOV 32H,#4CH
MOV P2,#15H
MOV 33H,#15H
RET
; 显示子程序
DIS: MOV P3,#0DFH ; 选中南北方向的十位数码管
MOV A,30H ; 把显示数据送人数码管显示
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P1,A ;
LCALL D1MS
MOV P3,#0EFH ; 选中南北方向的个位数码管
MOV A,B ; 送入数码管显示
MOVC A,@A+DPTR
MOV P1,A
LCALL D1MS
MOV P3,#7FH ; 选中第东西方向的十位数码管
MOV A,31H ; 送入数码管显示
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P1,A
LCALL D1MS
MOV P3,#0BFH ; 选中第东西方向的个位数码管
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
LCALL D1MS
SETB P30
SETB P31
JNB P30,DIS_S ; 查询是否第一个按键按下
JNB P31,DIS_E ; 查询是否第二个按键按下
AJMP DIS_R ; 没有键按下则返回
DIS_S:LCALL D5MS ; 按键去抖
JNB P30,DIS_SN
AJMP DIS_R
DIS_SN:MOV 40H,#50 ; 对通行时间从新分配,南北通行时间加长
MOV 41H,#30
AJMP DIS_R
DIS_E:LCALL D5MS ; 按键去抖
JNB P31,DIS_EW
AJMP DIS_R
DIS_EW:MOV 40H,#30 ; 东西通行时间加长
MOV 41H,#50
DIS_R:RET
; 定时中断处理程序
DS_C: LJMP DS_R ; 接力跳转
DSZD: PUSH ACC ; 保护现场
PUSH PSW
CLR TR0 ; 关定时器及中断标志位并重新赋值
CLR TF0
MOV TL0,#0B0H
MOV TH0,#3CH
DJNZ R2,DS_C ; 判断1m时间是否到达
MOV R2,#20 ; 到达重新赋值
DEC 30H ; 南北方向通行时间减一
MOV A,30H ; 把减一后的时间送入显示存储单元
; 南北通行到达最后4秒时黄灯闪烁
DS_10:CJNE A,#4,DS_11 ; 如果通行时间剩余4秒
JNB SNF,DS_11 ; 判断是否是南北通行
MOV P0,#8AH
MOV 32H, #8AH ; 把交通灯状态存入存储单元(后面类似)
DS_11:CJNE A,#3,DS_12 ; 不是剩余3秒,返回
JNB SNF,DS_12 ; 不是南北通行时间,返回
MOV P0,#88H
MOV 32H, #88H
DS_12:CJNE A,#2,DS_13
JNB SNF,DS_13
MOV P0,#8AH
MOV 32H, #8AH
DS_13:CJNE A,#1,DS_14
JNB SNF,DS_14
MOV P0,#88H
MOV 32H, #88H
;
DS_14:JNZ DS_NE ; 通行时间没有结束转向改变东西方向的数码管
CPL SNF ; 如果通行时间结束则对标志位取反
JNB SNF,DS_1 ; 判断是否南北通行
MOV 30H,40H ; 是,点亮相应的交通灯
MOV P0,#4CH
MOV 32H,#4CH ; 存储交通灯状态
MOV P2,#15H
MOV 33H, #15H ; 存储交通灯状态
DS_NE:DEC 31H ; 东西方向通行时间减一
MOV A,31H ; 把通行剩余时间送入显示存储单元
; 东西方向通行时间剩余4秒钟黄灯闪烁(程序注释与南北方向类似 略)
DS_20:CJNE A,#4,DS_21
JB EWF,DS_21
MOV P0,#51H
MOV 32H, #51H
DS_21:CJNE A,#3,DS_22
JB EWF,DS_22
MOV P0,#41H
MOV 32H, #41H
DS_22:CJNE A,#2,DS_23
JB EWF,DS_23
MOV P0,#51H
MOV 32H, #51H
DS_23:CJNE A,#1,DS_24
JB EWF,DS_24
MOV P0,#41H
MOV 32H, #41H
;
DS_24:JNZ DS_R ; 东西方向时间没有结束,返回
CPL EWF ; 对通行状态取反
JNB EWF,DS_2 ; 东西方向通行时间到来,跳转
MOV 31H,#80 ; 东西方向通行结束,重新显示时间
MOV P0,#89H ; 点亮相应的交通灯
MOV 32H, #89H
MOV P2,#29H
MOV 33H, #29H
AJMP DS_R
DS_1: MOV 30H,#80 ; 南北通行时间结束,重新对显示存储单元赋值
MOV P0,#89H ; 执行转弯状态1
MOV 32H, #89H
MOV P2,#26H
MOV 33H, #26H
AJMP DS_NE
DS_2: MOV 31H,41H ; 东西方向开始通行,赋值予显示存储单元
MOV P0,#61H ; 点亮相应的交通灯
MOV 32H, #61H
MOV P2,#15H
MOV 33H, #15H
DS_R: SETB TR0
POP PSW ; 恢复现场
POP ACC
RETI
; 紧急中断处理程序
URZD: PUSH ACC ; 保护现场
PUSH PSW
CLR IE0 ; 清除中断标志位
CLR TR0 ; 关定时器
CPL URF ; 紧急事件标志位
JB URF,UR_CON ; 紧急结束;跳转
MOV P0,#49H ; 各路口灯全显示红灯亮
MOV P2,#15H
AJMP UR_R
UR_CON:SETB TR0 ; 恢复正常交通
MOV A,32H
MOV P0,A
MOV A,33H
MOV P2,A
UR_R: POP PSW ; 恢复现场
POP ACC
RETI
; 查表指令0,1,2,3,4,5,6,7,8,9
TAB: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH
DB 7DH, 07H, 7FH, 6FH
; 延时5ms与1ms
D5MS: MOV R7,#5
D1MS: MOV R7,#10
MOV R6,#50
L1: DJNZ R6,$
DJNZ R7,L1
RET
END
以上就是关于单片机控制的交通灯全部的内容,包括:单片机控制的交通灯、如何用c语言编程在单片机上做交通信号灯、c51单片机控制交通灯要求用汇编语言等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)