一、实验目的

1. 掌握 CPU 与各芯片管脚连接方法,提高接口扩展硬件电路的连接能力。

2. 加深对定时器/计数器和并行接口芯片的工作方式和编程方法的理解。

3. 掌握交通信号灯自动控制系统的设计思路和实现方法。

二、实验所用仪器

星研微机试验箱、PC机。

三、系统功能与设计要求

1.基本功能要求

(1)以秒为计时单位,两位数码管以十进制递减计数显示通行(绿灯)剩余时间,在递减计数回零瞬间转换。十字路口交通灯的变化规律及控制时序:

① 南北口的绿灯、东西路口的红灯同时亮 30 秒,同时南北路口数码管递减 显示绿灯剩余时间 30,29,28……0 秒。

② 南北路口的黄灯闪烁 5 秒钟,同时东西路口的红灯继续亮。

③ 南北路口的红灯、东西路口的绿灯同时亮 30 秒,同时东西路口数码管递 减显示绿灯剩余时间 30,29,28……0 秒。

④ 南北路口的红灯继续亮,同时东西路口的黄灯闪烁 5 秒钟。

⑤ 转① 重复。

(2)通过键盘可以对红、黄、绿三色信号灯所亮时间在 0~99 秒内任意设定。

(3)十字路口的通行起始状态可自行设定,系统启动后自动运行,按“Q”键退出。

2.发挥部分

(1)增加人工干预模式。在特殊情况下可通过人工干预,手动控制 A,B 道路交通灯 的切换时间,并可以随时切换为自动运行模式。

(2)增加夜间控制功能,交通灯在进入夜间模式后,A、B 两个干道上红、绿灯均不 亮,黄色信号灯闪烁显示。

(3)增加两位红色信号灯倒计时显示。使系统同时显示 A,B 干道的红绿灯(通行/ 等待)时间

四、实现

硬件连接

软件流程

代码

extern void outportb(unsigned int, char);   //写I/O

extern char inportb(unsigned int);   //读I/O

extern void enable(void);   //开中断

extern void disable(void);   //关中断

extern void setvect(int, void interrupt (*isr)(void));   //写中断向量

extern void interrupt(far *getvect(int __interruptno))(); //读中断向量

#define u8 unsigned char

#define u16 unsigned int

#define PA_Addr 0x270

#define PB_Addr 0x271

#define PC_Addr 0x272

#define CON_Addr 0x273

#define IO8259_0 0x250

#define IO8259_1 0x251

#define COM_ADDR 0x263

#define T0_ADDR 0x260

#define IO273 0x230

// led状态数组

// be 南北绿,东西红

// bf,bd 南北黄闪,东西红

// eb 南北红,东西绿

// fb,db 南北红,东西黄闪

// dd,ff 夜间模式

// bb 全红灯

u8 led[] = {

0xbe,

0xbf,

0xbd,

0xeb,

0xfb,

0xdb,

0xdd,

0xff,

0xbb,

};

// 总时间,东西计数,南北计数,南北黄灯判断,东西绿灯判断,东西黄灯判断

u8 zjs = 0, dxjs = 0, nbjs = 0, snbh = 0, sdxl = 0, sdxh = 0;

// 南北绿灯时间,南北黄灯时间,东西绿灯时间,东西黄灯时间

u8 nbl = 30, nbh = 5, dxl = 30, dxh = 5;

// 开关状态

u8 flag = 0;

// 信号灯计数 数码管显示数组

u8 js[] = {16, 16, 16, 16};

// 键盘输入 数码管显示数组

u8 buffer[8] = {0x5, 0x0, 0x0, 0x3, 0x5, 0x0, 0x0, 0x3};

// 数码管状态数组

u8 SegArray[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,

0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E, 0xFF};

// 8255初始化

void INI_8255()

{

outportb(CON_Addr, 0x89);

}

// 8253初始化

void INI_8253()

{

outportb(COM_ADDR, 0x34);

outportb(T0_ADDR, 0x24);

outportb(T0_ADDR, 0xF4);

}

// 8259初始化

void INI_8259()

{

outportb(IO8259_0, 0x13); // ICW1

outportb(IO8259_1, 0x8);  // ICW2

outportb(IO8259_1, 0x9);  // ICW4

outportb(IO8259_1, 0xfc); // OCW1

}

// 交通灯输出

void port_273(u8 l)

{

outportb(IO273, l);

}

// 秒中断处理

void interrupt timer()

{

zjs--;

nbjs--;

dxjs--;

outportb(IO8259_0, 0x20);

}

// 延迟

void delay(u16 ms)

{

u16 i;

while (ms--)

{

i = 100;

do

{

;

} while (--i);

}

}

// 键盘输入数码管回显

void DIR()

{

u8 i, dig = 0xfe;

u8 SegArray[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,

0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E, 0xFF};

for (i = 0; i < 8; i++)

{

outportb(PA_Addr, SegArray[buffer[i]]);

outportb(PB_Addr, dig);

delay(3);

outportb(PB_Addr, 0xff);

dig = ((dig << 1) | 1);

}

}

// 判断有无按键闭合

u8 AllKey()

{

u8 i;

outportb(PB_Addr, 0x0);

i = (~inportb(PC_Addr) & 0x3);

return i;

}

// 行列扫描判断当前闭合键

u8 key()

{

u8 i, j, keyResult;

u8 bNoKey = 1;

while (bNoKey)

{

if (AllKey() == 0) //调用判有无闭合键函数

{

DIR();

DIR();

continue;

}

DIR();

DIR();

if (AllKey() == 0) //调用判有无闭合键函数

continue;

i = 0xfe;

keyResult = 0;

do

{

outportb(PB_Addr, i);

j = ~inportb(PC_Addr);

if (j & 3)

{

bNoKey = 0;

if (j & 2) // 1行有键闭合

keyResult += 8;

}

else //没有键按下

{

keyResult++; //列计数器加1

i = ((i << 1) | 1);

}

} while (bNoKey && (i != 0xff));

}

if (!bNoKey)

{

while (AllKey()) //判断释放否

{

DIR();

}

}

return keyResult;

}

// 信号灯计数数码管显示

void display()

{

u8 i, choose = 1;

js[0] = dxjs % 10;

js[1] = dxjs / 10;

js[2] = nbjs % 10;

js[3] = nbjs / 10;

for (i = 0; i < 4; i++)

{

outportb(PB_Addr, ~choose);

outportb(PA_Addr, SegArray[js[i]]);

delay(3);

choose = choose << 1;

}

}

//键盘输入赋值

void get_key()

{

u8 k = key();

u8 pos;

// A 南北绿灯秒数

if (k == 0xA)

{

pos = 7;

buffer[pos--] = key();

buffer[pos--] = key();

nbl = buffer[7] * 10 + buffer[6];

}

// B 南北黄灯秒数

if (k == 0xB)

{

pos = 5;

buffer[pos--] = key();

buffer[pos--] = key();

nbh = buffer[5] * 10 + buffer[4];

}

// C 东西绿灯秒数

if (k == 0xC)

{

pos = 3;

buffer[pos--] = key();

buffer[pos--] = key();

dxl = buffer[3] * 10 + buffer[2];

}

// D 东西黄灯秒数

if (k == 0xD)

{

pos = 1;

buffer[pos--] = key();

buffer[pos--] = key();

dxh = buffer[1] * 10 + buffer[0];

}

}

void main()

{

//初始化

disable();

INI_8255();

INI_8253();

INI_8259();

setvect(8, timer);

enable();

while (1)

{

get_key();

flag = inportb(PC_Addr);

flag = flag >> 4;

zjs = nbl + nbh + dxl + dxh;

nbjs = nbl;

dxjs = nbl + nbh;

snbh = nbh + dxl + dxh;

sdxl = dxl + dxh;

sdxh = dxh;

// 自动运行模式

if (flag == 7)

{

// 置初始状态,南北绿,东西红

port_273(led[0]);

while (1)

{

display();

// 南北黄灯,置计数值

if (zjs == snbh)

{

nbjs = nbh;

}

// 黄灯闪烁

if (zjs <= snbh && zjs > sdxl)

{

if ((zjs % 2) == 0)

{

port_273(led[1]);

}

else

{

port_273(led[2]);

}

}

// 东西绿灯,置计数值,输出交通灯状态

if (zjs == sdxl)

{

dxjs = dxl;

nbjs = dxl + dxh;

port_273(led[3]);

}

// 东西黄灯,置计数值

if (zjs == sdxh)

{

dxjs = dxh;

}

// 黄灯闪烁

if (zjs <= sdxh && zjs > 0)

{

if ((zjs % 2) == 0)

{

port_273(led[4]);

}

else

{

port_273(led[5]);

}

}

// 计数值为0,重置

if (zjs == 0)

{

zjs = nbl + nbh + dxl + dxh;

nbjs = nbl;

dxjs = nbl + nbh;

port_273(led[0]);

}

// 循环读入开关状态,判断是否退出

flag = inportb(PC_Addr);

flag = flag >> 4;

if (flag != 7)

{

break;

}

}

}

// 夜间模式

else if (flag == 3)

{

while (1)

{

if ((zjs % 2) == 0)

{

port_273(led[6]);

}

else

{

port_273(led[7]);

}

flag = inportb(PC_Addr);

flag = flag >> 4;

if (flag != 3)

{

break;

}

}

}

// 人工干预

else if (flag == 6)

{

port_273(led[3]);

}

else if (flag == 5)

{

port_273(led[0]);

}

else if (flag == 4)

{

port_273(led[8]);

}

}

}

交通信号灯自动控制模拟指示系统相关推荐

  1. 微机原理课程设计-模拟十字路口交通信号灯

    一.设计任务描述 1.1设计目的 通过课程设计使学生更进一步掌握微机原理及应用课程的有关知识,提高应用微机解决问题的能力,加深对微机应用的理解.通过查阅资料,结合所学知识进行软.硬件的设计,使学生初步 ...

  2. 51单片机模拟交通信号灯控制系统设计

    51单片机模拟交通信号灯控制系统设计 设计要求: 1.用LED灯模拟十字路口交通灯控制 2.正常情况下双方向轮流通行 3.特殊情况时,A方向通行 4.紧急情况时,A和B方向都不通行 本任务涉及定时控制 ...

  3. 51单片机实验——模拟三台机器故障检测与指示系统

    1.实验题目: 在proteus中模拟实现一个三台机器故障检测与指示系统,如图2所示,当无故障时,LED0 灯亮:当有故障时,LED0 灯灭,1故障(P2.0为0)时,LED1 灯亮,2故障(P2.1 ...

  4. arduino学习笔记二十二--模拟交通信号灯

    交通信号灯是交通信号中的重要组成部分,是道路交通的基本语言.交通信号灯由红灯(表示禁止通行).绿灯(表示允许通行).黄灯(表示警示)组成.分为:机动车信号灯.非机动车信号灯.人行横道信号灯.车道信号灯 ...

  5. 消防应急照明和疏散指示系统在轨道交通中的设计应用

    摘要:本文分析了消防应急照明和疏散指示系统的特点与设计要点,介绍了系统在城市轨道交通中的设计应用,轨道交通设计中新的消防应急照明和疏散指示系统的备用照明仍由EPS供电,新增一套疏散指示照明系统,增加疏 ...

  6. java模拟交通信号灯_java 多线程交通信号灯模拟过程详解

    这学期我们java课程的课程设计项目----交通信号灯的线程设计 实验目的:多线程设计,同步机制 题意 设计一个交通信号灯类: 变量:位置.颜色(红.黄.绿).显示时间(秒). 方法:切换信号灯. 创 ...

  7. 单片机实验——改进型交通信号灯设计,交通信号系统是保障交通安全高效的重要设施,为了利于司机更好的判断,很多交通信号灯系统在原来的系统基础上设置了倒计时显示器。本实验利用7段数码管作倒计时显示器

    实验内容及要求 交通信号系统是保障交通安全高效的重要设施,为了利于司机更好的判断,很多交通信号灯系统在原来的系统基础上设置了倒计时显示器.本实验利用7段数码管作倒计时显示器,设计一个改进型的交通信号灯 ...

  8. 安科瑞应急照明和疏散指示系统满足城市轨道交通车站火灾模式下安全疏散的要求

    应急照明和疏散指示系统在城市轨道交通站的设计与应用 安科瑞 崔远航 前言 城市轨道交通车站中传统的应急照明和疏散指示照明均由交流220V电源供电,随着新应急照明和疏散指示系统国家规范GB51309-2 ...

  9. C#模拟最简单的交通信号灯

    界面大致这个样子: while循环触发交通灯,交通灯触发汽车的行为. 红绿灯5s,黄灯3s. 代码是:console控制台的!!!! using System; using System.Collec ...

最新文章

  1. 数据库表(字段类型、约束、截断表、修改表字段、重命名表)
  2. wxWidgets编译安装gtk问题的解决办法
  3. 多比矢量图开发手册(六)-Web高级图元编程
  4. json对象与.net对象互相转换
  5. 通过apt自动生成建造者模式单线程版代码(二)
  6. Java中finalize方法用途何在?
  7. nginx 配置两个域名
  8. windows下安装ElasticSearch的Head插件
  9. windows分区的理解
  10. 信息学奥赛一本通C++语言——1128:图像模糊处理
  11. 模型压缩+编译器优化,使AI算法在移动端性能超越专用硬件
  12. 2014校招 百度试题及答案
  13. TinkPad E40 CentOS 6.5 无线网卡驱动 RTL8191SEvB 安装
  14. Markdown转pdf分页
  15. 联通手机卡网速的修改
  16. 适合新手的网站建设方案
  17. mah和mwh的关系?
  18. 数字变成大写的类,把人民币转化为大写汉字
  19. AHB到标准握手时序桥 - 逻辑设计部分
  20. 判断当前音效是否播放完毕

热门文章

  1. linux命令---top
  2. 计算机浅析自己的未来规划,计算机职业生涯规划书
  3. 网易服务器修改权限等级,网易七鱼客服管理_七鱼客服管理人员权限设置_企业服务汇...
  4. catalog start with
  5. Evernote和有道云笔记的比较
  6. 成都普陀计算机学校,成都智慧校园软件
  7. 血族第四季/全集The Strain迅雷下载
  8. 我的物联网项目之订单系统
  9. 系统错误——Required request body is missing:
  10. 【str家族】如何使用处理字符和字符串的库函数