当前位置:文档之家› 带数码管显示的十字路口交通灯控制 C 程序

带数码管显示的十字路口交通灯控制 C 程序

一.课程设计目的

用汇编语言独立完成一个程序题,以达到熟练运用汇编语言编程实现有比较完整功能的程序的目的。

⒈ 了解交通灯管理的基本工作原理

⒉ 熟悉8259A中断控制器的工作原理和应用编程

⒊ 熟悉8255A并行接口的各种工作方式和应用

⒋ 熟悉8253计数器/定时器的工作方式及应用编程,掌握利用软硬件相结合定时的方法

二.课程设计任务

本次课程设计的内容为交通信号灯的实时控制和管理。

某交通干线车行道和人行横道的交通信号灯设置如图所示:

其中: 表示红灯、 表示黄灯、 表示绿灯

具体要求如下:

1.东西方向车辆放行60秒钟。即东西方向的绿灯和南北方向的红灯同时点亮1分钟;

2.1分钟后,东西方向的黄灯闪烁5秒钟,以警示车辆将切换红绿灯。此时南北方向仍维持红灯点亮。在南北方向亮红灯期间,在2位数码管上显示计数值(每秒减1),从65减为0。

3.东西方向的黄灯闪烁5秒钟后,转为南北方向放行20秒钟。即东西方向的红灯和南北方向的绿灯同时点亮20秒钟;

4.南北方向放行20秒钟后,转为南北方向的黄灯闪烁5秒钟,以警示将切换红绿灯。此时东西方向仍维持红灯点亮。

5.南北方向的黄灯闪烁5秒钟后,再转为东西方向车辆放行1分钟。如此循环重复。

三.总体设计方案

1.用实验系统8255A实现对信号灯的控制(所用端口自定);2位数码显示用8255A实现控制。 2. 用实验系统8235的计数器2定时向实验系统主片8259A的IRQ7请求中断,以实现要求的1分钟、5秒钟和20秒的定时。

实验系统8235的计数器2的CLK2接OPCLK,频率为1.19318MHZ;GATE2已接 +5V;

定时采用软硬件相结合的方式实现。

⒊ 用实验系统的发光二极管模拟红绿灯。

注:8259A的端口地址为:218H、219H

8255A的端口地址为:端口A-200H、端口B-201H、端口C-202H、控制端口-203H

8253的端口地址为:计数器0-208H、计数器1-209H、计数器2-20aH、控制寄存器0-20bH。

四.部分电路设计及功能解说

设计数器0的计数初值为25000,由于CLK0接脉冲信号,频率为2.5MHZ,所以每10ms中断一次。利用CX对不同的状态时间计数,用来实现计数器0对1分钟,20秒钟,5秒钟的定时。中断子程序分为数码显示刷新部分和红绿黄灯各种状态切换部分。每进入中断即刷新LED显示。用对于东西车道和南北车道黄灯闪烁利用标志位判断实现,满足比较条件就暗,不满足条件就亮。

五.程序设计流程图

六.程序段功能汇总

1、MAIN程序

MAIN程序是总程序,输出说明,等待用户按键并读取键值。用SCANK:;扫描键盘输入,根据键盘输入调用bios 16H 中断的1号功能,读取键盘的状态。

2、子程序

子程序控制东西方向黄灯闪烁,南北绿灯。

/*****************************************************

十字路口交通灯控制 C 程序

******************************************************/

#define uchar unsigned char

#define uint unsigned int

#include

/*****定义控制位**********************/

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_Red=P1^3;//EW红灯

sbit SN_Red=P1^7;//SN红灯

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 Add_Button=P3^3;//时间加

sbit Reduces_Button=P3^4;//时间减

bit Flag_SN_Yellow; //SN黄灯标志位

bit Flag_EW_Yellow;//EW黄灯标志位

char Time_EW;//东西方向倒计时单元

char Time_SN;//南北方向倒计时单元

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};//1~~~~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)

{

char h,l;

h=Time_EW/10;

l=Time_EW%10;

P0=table[l];

EW_LED2=1;

Delay(2);

EW_LED2=0;

P0=table[h]; EW_LED1=1;

Delay(2);

EW_LED1=0;

h=Time_SN/10;

l=Time_SN%10;

P0=table[l];

SN_LED2=1;

Delay(2);

SN_LED2=0;

P0=table[h];

SN_LED1=1;

Delay(2);

SN_LED1=0;

h= EW1/10;

l= EW1%10;

P0=table[l];

Time_Show_LED1=1;

Delay(2);

Time_Show_LED1=0;

P0=table[h];

Time_Show_LED2=1;

Delay(2);

Time_Show_LED2=0;

}

/**********************外部0中断服务程序************************/

void EXINT0(void)interrupt 0 using 1

{

EX0=0; //关中断

if(Add_Button==0) //时间加

{

EW1+=5;

SN1+=5;

if(EW1>=100)

{

EW1=99;

SN1=79;

}

}

if(Reduces_Button==0) //时间减 {

EW1-=5;

SN1-=5;

if(EW1<=40)

{

EW1=40;

SN1=20;

}

}

if(Nomor_Button==0)//测试按键是否按下,按下为正常状态

{

EW1=60;

SN1=40;

EWL1=19;

SNL1=19;

Busy_LED=0;//关繁忙信号灯

Special_LED =0;//关特殊信号灯

}

if(Busy_Btton==0) //测试按键是否按下,按下为繁忙状态

{

EW1=45;

SN1=30;

EWL1=14;

SNL1=14;

Special_LED=0;//关特殊信号灯

Busy_LED=1;//开繁忙信号灯

}

if(Special_Btton==0)//测试按键是否按下,按下为特殊状态

{

EW1=75;

SN1=55;

EWL1=19;

SNL1=19;

Busy_LED=0;//关繁忙信号灯

Special_LED =1;//开特殊信号灯

}

EX0=1;//开中断

}

/**********************T0中断服务程序*******************/

void timer0(void)interrupt 1 using 1

相关主题