微机系统课程设计实验报告课题:交通信号灯自动控制模拟指示系统一、课程设计目的1.掌握CPU与各芯片管脚连接方法,提高借口扩展硬件电路的连接能力。
2.加深对定时器、计数器和并行借口芯片的工作方式和编程方法的理解。
3.掌握交通信号灯自动控制系统的设计思路和实现方法。
二、课程设计内容设计并实现十字路口通信号自动控制模拟指示系统。
设该路口由A、B两条通行相交而成,四个路口各设一组红、黄、绿三色信号灯,用两位数码管作倒计时显示。
三、应用系统设计方案交通信号灯的亮灭时间及数码管显示时间可以通过8253来控制,8253的时钟源采用时钟信号发生器与分频电路提供,通过计算获得计数初值为1000。
按照需要设定工作在方式3.交通信号灯及数码管可以采用系统提供的相应模块,控制可以通过8255可编程并行借口,PA口控制红黄绿交通灯的亮灭,PB口和PC口控制时间显示数码管的段和位。
PC0作为OUT1的输入。
四、系统测试结果1.基本功能实现(1)以秒为计时单位,两位数码管以十进制递减计数显示通行剩余时间,在递减计数为零瞬间转换。
即南北的绿灯、东西的红灯同时亮30秒,同时南北路口数码管递减显示绿灯剩余时间;为0时,南北的黄灯闪烁5秒钟,同时东西的红灯继续亮;南北的红灯、东西的绿灯同时亮30秒,同时东西路口数码管递减显示绿灯剩余时间;为0时,南北红灯继续亮,同时东西的黄灯闪烁5秒;若不结束,则开始循环。
(2)通过键盘可以对红、黄、绿三色信号灯所亮时间再0~99内任意设定。
(3)十字路口的通行气势状态可自行设定,系统启动后自动运行,按“Q”退出。
2、发挥部分实现(1)增加人工干预模式,在特殊情况下可通过人工干预,手动控制A、B交通灯的切换时间,并可以随时切换为自动运行模式。
(2)增加夜间控制功能,交通灯在进入夜间模式后,A、B干道上红、绿灯均不亮,黄灯信号灯闪烁。
(3)增加红灯倒计时显示。
五、课程设计中遇到的问题及解决办法1.8253的两个计时器的连接及工作方式选择,在查找相关资料后,将两个计时器串联,并工作在方式3下,初始值为1000。
2.在数码管上同时显示南北红灯、东西绿灯及黄灯的剩余时间倒计时,在查找相关资料,研究有关程序后解决了该问题。
六、实验体会微机系统课程设计实验加深了学生对微机系统的理解,提高了团队探讨、查找资料及合作能力,加深了学生对于软、硬件结合的映像,促进了学生总体能力的提升。
七、分组及分工组长:张栋软件:马思奇、王刚硬件:魏世峰、徐珂八、源程序// 321.cpp : Defines the entry point for the console application.//#include<iostream>#include<ctime>#include"stdafx.h"#include"windows.h"#include"stdio.h"#include"PCI9052Dll.h"#include"conio.h"//using namespace std;#define DefaultTime 10#define smgd 0xc0 //数ºy码?管¨¹段?初?始º?化¡¥#define smgw 0xc0 //数ºy码?管¨¹位?初?始º?化¡¥数ºy据Y #define hld 0xf3 //红¨¬绿¨¬灯Ì?初?始º?化¡¥数ºy据Yunsigned char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0到Ì?9的Ì?数ºy码?管¨¹代䨲码?int judge = 0;//,aaa=1; //判D断?黄?灯Ì?,ê?若¨?为a黄?灯Ì?则¨°为a1,ê?aaa是º?用®?来¤¡ä帮ã?助¨²保À¡ê存ä?干¨¦预¡è前¡ã红¨¬绿¨¬灯Ì?状Á¡ä态¬?的Ì?参?数ºy;unsigned short usIoAddr;unsigned short Addr;unsigned char data,data1,data2,data3,data4; //data用®?来¤¡ä记?录?当Ì¡À前¡ã黄?灯Ì?的Ì?方¤?向¨°,ê?data1,ê?data2,data3,data4用®?来¤¡ä记?录?4个?数ºy码?管¨¹的Ì?数ºy字Á? unsigned char Idata,Idata0,Idata1,Idata3,Idata2; //Idata0和¨ªIdata1用®?来¤¡ä判D断?时º¡À间?是º?否¤?到Ì?1秒?,ê?Idata2记?录?被À?干¨¦预¡è之?前¡ã的Ì?灯Ì?状Á¡ä态¬?unsigned char Idata4; //保À¡ê存ä?是º?否¤?为a自Á?动¡¥运?行D 模¡ê式º?void init_8255(){data = 0x81; //初?始º?化¡¥。
¡ê方¤?式º?控?制?字Á?。
¡êA出?,ê?B出?,C高?四?位?出?,ê?低̨ª四?位?入¨?(ê¡§从䨮8253)ê?,A,B都?为a 方¤?式º?0OutByte( Addr+3,data);OutByte( Addr , hld ); //初?始º?化¡¥红¨¬绿¨¬灯Ì?。
¡ê。
¡êS,N绿¨¬,ê?W,E红¨¬OutByte( Addr + 1 , smgd ); //初?始º?化¡¥数ºy码?管¨¹段?OutByte( Addr + 2 , smgw ); //初?始º?化¡¥数ºy码?管¨¹位?}void init_8253(){OpenDevice();GetIoBase(&usIoAddr);Addr = usIoAddr;OutByte( Addr+11 , 0x36 ); //初?始º?化¡¥计?数ºy器¡Â0,ê?先¨¨低̨ª后¨®高?,ê?方¤?式º?3,ê?二t进?制?OutByte( Addr+8 , 0xe8 );OutByte( Addr+8 , 0x03 );OutByte( Addr+11 , 0x76 ); //初?始º?化¡¥计?数ºy器¡Â1,ê?先¨¨低̨ª后¨®高?,ê?方¤?式º?3,ê?二t进?制?OutByte( Addr+9 , 0xe8 );OutByte( Addr+9 , 0x03 );}void fun( int a , int b) // a表À¨ª示º?红¨¬灯Ì?时º¡À间?. b为a模¡ê式º?:0表À¨ª示º?南?北À¡À,1表À¨ª示º?东?西¡Â,2表À¨ª示º?夜°1间?模¡ê式º? {char ch;for( int i = a; i >= -5; i-- ) //显?示º?黄?灯Ì?的Ì?五?秒?{int right_shi,left_shi,right_ge,left_ge,k; //i为a低̨ª位?k= i; //k1用®?来¤¡ä判D断?绿¨¬灯Ì?是º?否¤?结¨¢束º?;ê?k为a绿¨¬灯Ì?时º¡À间?OutByte( Addr , Idata2 );if(Idata2 = 0xf3){if(i >= 0){right_shi = (i + 5)/10; //right_shi(右®¨°十º?),right_ge(右®¨°个?)为a右®¨°边À?两¢?位?right_ge = (i + 5)%10;left_shi = k/10; //left_shi(左Á¨®十º?),left_ge(左Á¨®个?)为a左Á¨®边À?两¢?位?left_ge = k%10;}else if(i < 0 && i >= -5){right_shi = (i + 5)/10; //right_shi(右®¨°十º?),right_ge(右®¨°个?)为a右®¨°边À?两¢?位?right_ge = (i + 5)%10;left_shi = (k + 5) / 10; //left_shi(左Á¨®十º?),left_ge(左Á¨®个?)为a左Á¨®边À?两¢?位?left_ge = (k + 5) % 10;}}if(Idata2 = 0x1e){if(i >= 0){right_shi = (i)/10; //right_shi(右®¨°十º?),right_ge(右®¨°个?)为a右®¨°边À?两¢?位?right_ge = (i)%10;left_shi = (k + 5)/10; //left_shi(左Á¨®十º?),left_ge(左Á¨®个?)为a左Á¨®边À?两¢?位?left_ge = (k + 5)%10;}else if(i < 0 && i >= -5){right_shi = (i + 5)/10; //right_shi(右®¨°十º?),right_ge(右®¨°个?)为a右®¨°边À?两¢?位?right_ge = (i + 5)%10;left_shi = (k + 5) / 10; //left_shi(左Á¨®十º?),left_ge(左Á¨®个?)为a左Á¨®边À?两¢?位?left_ge = (k + 5) % 10;}}data3 = table[left_shi]; //data3,4为a左Á¨®边À?两¢?位?data4 = table[left_ge];data1 = table[right_shi];data2 = table[right_ge];// aaa=1;while( 1 ) //8253计?数ºy器¡Â,ê?一°?秒?一°?变À?{InByte( Addr+2 , &Idata ); //中D间?参?数ºyIdata1 = Idata & 0x01; //8253输º?入¨?结¨¢果?if( Idata1 == 0x01 && Idata0 == 0x00 ) //判D断?时º¡À间?。