本科毕业论文(设计) 第 12 页
图(3-1)
通过具体的路口交通灯状态的演示分析我们可以把这四个状态归纳如下:
◆东西方向红灯灭,同时绿灯亮,南北方向黄灯灭,同时红灯亮,倒计时20秒。此状态下,东西向禁止通行,南北向允许通行。
◆东西方向绿灯灭,同时黄灯亮,南北方向红灯亮,倒计时5秒。此状态下,除了已经正在通行中的其他所以车辆都需等待状态转换。
◆南北方向红灯灭,同时绿灯亮,东西方向黄灯灭,同时红灯亮,倒计时20秒。此状态下,东西向允许通行,南北向禁止通行。
◆南北方向绿灯灭,同时黄灯亮,东西方向红灯亮,倒计时5秒。此状态下,除了已经正在通行中的其他所以车辆都需等待状态转换。 下面我们可以用图表表示灯状态和行止状态的关系如下: 表1交通状态及红绿灯状态
本科毕业论文(设计) 第 13 页
东西向 南北向 东西红灯 东西黄灯 东西绿灯 南北红灯 南北绿灯 南北黄灯 状态1 禁行 通行 1 0 0 0 1 0 状态3 等待变换 等待变换 1 0 0 0 0 1 状态4 通行 禁行 0 0 1 1 0 0 状态6 等待变换 等待变换 0 1 0 1 0 0 表1
东西南北四个路口均有红绿黄3灯和数码显示管2个,在任一个路口,遇红灯禁止通行,转绿灯允许通行,之后黄灯亮警告行止状态将变换。状态及红绿灯状态如表1所示。说明:0表示灭,1表示亮。 第二节 软件设计
本次设计,编写软件使用的是汇编语言。因为汇编语言是面向机器硬件的语言,助记符指令和机器指令一一对应,用汇编语言编写的程序效率高,占用存储空间小,运行速度快,用汇编语言能编写出最优化的程序。能直接管理和控制硬件设备(功能部件),它能处理中断,也能直接访问存储器及I/O接口电路。 开始
程序初始化 东西红灯亮 南北绿灯亮 东西红灯闪烁 南北黄灯亮 东西绿灯亮 南北红灯亮 东西黄灯亮 南北红灯闪烁 返回
汇编语言指令说明
AJMP 功能:绝对转移。
ANL 功能:对字节变量做逻辑“与”。 ANLC 功能:对位变量做逻辑“与”。 CJNE 功能:比较且不相等则转移。 CPL 功能:累加器取反。 DEC 功能:减量。
DJNZ 功能:减量且如果不等于零则转移。
本科毕业论文(设计) 第 14 页
INC 功能:增量。
MOV 功能:传送字节变量。 MOVX 功能:外部传送。 NOP 功能:空操作。
ORL 功能:对字节变量进行逻辑或。 RETI 功能:从中断返回。
第四节 总体设计与电路图(图3-2)
图(3-2)
图(3-2)中大部分连线采用总线形式。共五个二位阴极数码管,其中四个分别用于四个路口的倒计时显示,另外一个用于总体的直行时间显示,五个数码管的阳极都接到AT89C51的P0口,阴极接到P2口;共32个发光二极管,其中16个绿色发光二极管,14个红色发光二极管,2个黄色发光二极管,四个路口每个路口各有一个红(禁行)、黄(警告)发光二极管,二个绿色发光二极管(通行),一个用于直行通行,一个用于左拐通行,四个人行道,每个人行道两边各有一红、绿发光二极管,另外两个红色发光二极管分别用于繁忙模式和特殊模式的指示,其中四个路口的二极管接到P1口,人行道的发光二极管接到P3口,繁忙模式和特殊模式的指示灯接P2口;外部中断0接上三个按钮,分别用于繁忙、特殊、正常模式的转化。
本科毕业论文(设计) 第 15 页
交通灯程序
/*********************************************************** 十字路口交通灯控制 C 程序
***********************************************************/ #include
#define uchar unsigned char #define uint
unsigned int
/*****定义控制位*******************************************/ sbit Time_Show_LED2=P2^5; //Time_Show_LED2(直行时间显示)控制位
sbit Time_Show_LED1=P2^4; //Time_Show_LED1(直行时间显示)控制位
sbit EW_LED2=P2^3; //EW_LED2控制位 sbit EW_LED1=P2^2; //EW_LED1控制位 sbit SN_LED2=P2^1; //SN_LED2控制位 sbit SN_LED1=P2^0; //SN_LED1控制位 sbit SN_Yellow=P1^6; //SN黄灯 sbit EW_Yellow=P1^2; //EW黄灯 sbit EW_ManGreen=P3^0; //EW人行道绿灯 sbit SN_ManGreen=P3^1; //SN人行道绿灯 sbit Special_LED=P2^6; //交通特殊指示灯 sbit Busy_LED=P2^7; //交通繁忙指示灯 sbit Nomor_Button=P3^5; //交通正常按键 sbit Busy_Btton=P3^6; //交通繁忙按键 sbit Special_Btton=P3^7; //交通特殊按键 sbit EW_ManRed=P3^3; //EW人行道红灯 sbit SN_ManRed=P3^4; //SN人行道红灯 bit Flag_SN_Yellow; //SN黄灯标志位 bit Flag_EW_Yellow; //EW黄灯标志位 char Time_EW; //东西方向倒计时单元 char Time_SN; //南北方向倒计时单元
本科毕业论文(设计) 第 16 页
uchar EW=60,SN=40,EWL=19,SNL=19; //程序初始化赋值,正常模式
uchar EW1=60,SN1=40,EWL1=19,SNL1=19; //用于存放修改值的变量 uchar
code
table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //0-9段选码
uchar code S[8]={0x28,0x48,0x18,0x48,0x82,0x84,0x81,0x84};
//交通信号灯控制代码
/**********************延时子程序**************************/ void Delay(uchar a) {
uchar i; i=a;
while(i--){;} }
/*****************显示子函数******************************/ void Display(void) {
uchar h,l; h=Time_EW/10; l=Time_EW;
P0=table[l];
EW_LED2=1; //点亮EW_LED2 Delay(2);
EW_LED2=0; //熄灭EW_LED2 P0=table[h];
EW_LED1=1; //点亮EW_LED1 Delay(2); EW_LED1=0;