微机应用系统课程设计报告(交通信号灯控制系统)课程小组成员:1.姓名:xxxx 班级:xxxxxxxxxx,学号:xxxxxxxxxx评语:成绩:2.姓名:xxxx 班级:xxxxxxxxxx,学号:xxxxxxxxxx评语:成绩:3.姓名:xxxx 班级:xxxxxxxxxx,学号:xxxxxxxxxx 评语:成绩:一、课题内容及要求:1. 实验内容:✧设计一个交通信号灯控制系统,要求:✧初始状态为两个方向的红灯全亮,时间6秒。
✧主干道绿灯亮,支干道红灯亮,主干道通车,时间为20秒。
✧主干道黄灯闪烁,支干道红灯亮,时间为6秒。
✧主干道红灯亮,支干道绿灯亮,支干道通车,时间为15秒。
✧主干道红灯亮,支干道黄灯闪烁,时间为6秒。
✧循环显示。
✧通过按键输入时间,使主干道和支干道通车时间一样。
✧画出硬件连接电路图,说明各个控制信号的作用。
✧画出程序流程图,编写程序,硬件连接调试,直至正确。
✧编写课程设计报告。
2. 实验要求编程实现功能,并撰写课程设计报告一份。
二、硬件设计1、硬件原理框图:2、设计电路:设计电路主要由四部分组成,一是P1口与十二个发光二极管连接电路,二是P0口、部分P2口和部分P3口与8255连接电路,三是8255的PA口、PB口与四个两位数码管的连接电路,四是8255的PC口与矩阵键盘的连接电路。
3、交通灯电路:设计中采用发光二极管作为交通灯来使用,单片机的I/O接口直接和交通灯(发光二极管)连接。
在十字路口的四组红、黄、绿三色交通灯中,东西方向道路上的两组同色灯连接在一起,南北方向道路上的两组同色的灯也彼此连接在,受单片机P1.0~P1.5控制。
单片机的I/O接口与交通灯电路的具体连接方式为:P1.0~P1.2分别接东西方向的红、黄、绿共6个放光二极管,P1.3~P1.5分别接南北方向的红、黄、绿共6个发光二极管。
12个发光二极管采用了共阴极的连接方式,因此I/O口输出高电平时,与之相连的发光二极管会亮,I/O口输出低电平时,相应的发光二极管会灭。
交通灯电路如下图所示4、倒计时显示电路:该显示装置选用双位数码管来显示交通灯转换的剩余时间,根据控制要求,每个路口需要1个数码管,这样四个路口就要求4个数码管。
我们可以选用共阴型数码管。
四个路口倒计时显示被置在同一时刻显示不同的数字。
电路如下图5、按键模块:按键模块主要利用经过8255扩展之后的PC口来控制的。
当有按键被按下时,PC口会产生低电平,按下不同键会调用相应的子程序,根据不同的按键进行相应的处理6、仿真电路及效果图:(1)仿真电路:(2)仿真效果:三、软件设计1、主程序流程图:2、系统程序设计 系统工作原理: (1)主程序:本设计系统以单片机为控制核心,连接成最小系统。
按键设置模块产生信号输入,信号灯状态模块显示通行状态,LED 倒计时模块模块接受信号并输出。
单片机上电后,系统进入正常工作状态,执行交通灯状态显示控制,同时将时间数据倒计时输入到LED数码管上实时显示。
在此过程中系统一直查询是否有时间调节服务。
(2)按键程序:按键采用查询方式进行处理,当某个键按下时,单片机确认外设已“准备好”,然后进行相应处理,(3)显示程序:显示主要包括数码管的时间显示和交通灯的交通状态显示,本设计包含六种正常交通状态。
3、程序源代码:#include <reg51.h>#include <absacc.h>#define uchar unsigned char#define uint unsigned int#define PAC XBYTE[0x7fff]#define PA XBYTE[0x7cff]#define PB XBYTE[0x7dff]#define PC XBYTE[0x7eff]#define state0 6#define state1 20#define state2 6#define state3 0#define state4 6#define KEYP PC //定义按键连接到PC口//定义数码管字形0~15、a~fuchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x5f,0x7c,0x58,0x5e,0x7b,0x71};char disp=0x3f; //声明七段显示初值为小数点uchar scan[4]={0xef,0xdf,0xbf,0x7f}; //显示器几件判断扫描码sbit red_a=P1^0;sbit yellow_a=P1^1;sbit green_a=P1^2;sbit red_b=P1^3;sbit yellow_b=P1^4;sbit green_b=P1^5;uchar flash_count=0,operation_type=0;//延时void delay_ms(uchar x){uchar h;while(x--){ for(h=0;h<120;h++);} //延时1ms}//灯状态子程序?void traffic_light_0(uchar x){uchar i,n;red_a=0;yellow_a=1;green_a=1; //东西通行red_b=0;yellow_b=1;green_b=1; //南北通行for(i=x;i>0;i--){for(n=1000;n>0;n--){PB=0x0a;PA=table[i/10]; //十位delay_ms(2);PB=0x05;PA=table[i%10];//个位delay_ms(2);}}}void traffic_light_1(uchar x){uchar i,n;red_a=1;yellow_a=1;green_a=0; //东西通行red_b=0;yellow_b=1;green_b=1; //南北通行for(i=x;i>0;i--){for(n=500;n>0;n--){PB=0x0e;PA=table[i/10];delay_ms(1);PB=0x0d;PA=table[i%10];//主东西delay_ms(1);PB=0x0b;PA=table[(i+6)/10];delay_ms(1);PB=0xf7;PA=table[(i+6)%10]; //支南北delay_ms(1);}}}void traffic_light_2(uchar x){uchar i,n;for(i=x;i>0;i--){yellow_a=~yellow_a;green_a=1;for(n=1000;n>0;n--){PB=0x0a;PA=table[i/10];delay_ms(2);PB=0x05;PA=table[i%10];delay_ms(2);}flash_count++;if(flash_count==6)break;//闪烁3次}flash_count=0;}void traffic_light_3(uchar x){uchar i,n;red_a=0;yellow_a=1;green_a=1; //东西通行red_b=1;yellow_b=1;green_b=0; //南北通行if(x==0){for(i=15;i>0;i--){for(n=250;n>0;n--){PB=0x0e;PA=table[(i+6)/10];delay_ms(1);PB=0x0d;PA=table[(i+6)%10];//主东西delay_ms(1);PB=0x0b;PA=table[i/10];delay_ms(1);PB=0xf7;PA=table[i%10]; //支南北delay_ms(1);}}}else{for(i=x;i>0;i--){for(n=248;n>0;n--){PB=0x0e;PA=table[(i+6)/10];delay_ms(1);PB=0x0d;PA=table[(i+6)%10];//主东西delay_ms(1);PB=0x0b;PA=table[i/10];delay_ms(1);PB=0xf7;PA=table[i%10]; //支南北delay_ms(1);}}}}void traffic_light_4(uchar x){uchar i,n;for(i=x;i>0;i--){yellow_b=~yellow_b;green_b=1;for(n=1000;n>0;n--){PB=0x0a;PA=table[i/10];delay_ms(2);PB=0x05;PA=table[i%10];delay_ms(2);}flash_count++;if(flash_count==6)break;//闪烁3次}flash_count=0;}// /* 键扫描函数*///扫描4x4键盘几4个七段显示器函数//PC口接入键盘PC口高4位做输出低4位做输入uchar scanner() //扫描函数开始{uchar col,row; //声明变量(col列,row行)uchar rowkey,kcode; //声明变量(rowkey行键值,kcode按键码)delay_ms(2); //消除键盘抖动for(col=0;col<4;col++) //for循环,扫描第col列{KEYP=scan[col]; //高4位输出扫描信号,低4位输入行值PA=disp; //输出数字rowkey=~KEYP&0x0f; //读入KEYP低4位,再清除高4位求出行键值if(rowkey!=0) //若有按键按下{if(rowkey==0x01)row=0; //若第0行被按下else if(rowkey==0x02)row=1; //若第1行被按下else if(rowkey==0x04)row=2; //若第2行被按下else if(rowkey==0x08)row=3; //若第3行被按下kcode=4*col+row; //算出按键号码disp=table[kcode]; //将键值编码后写入最右侧while(rowkey!=0)rowkey=~KEYP&0x0f; //在读入行键值}delay_ms(4);}return kcode;}//通过按键使交通灯?状态切换void traffic_light(){uchar key,key0,key1;uchar i,m[2];key=scanner();if(key==14)while(1){switch(operation_type){case 0://东西红灯(主干道),南北红灯(支干道)))traffic_light_0(state0);operation_type=1;break;case 1://东西绿灯,南北红灯traffic_light_1(state1);operation_type=2;break;case 2://东西黄闪,绿灯灭traffic_light_2(state2);operation_type=3;break;case 3://东西红灯,南北绿灯traffic_light_3(state3);operation_type=4;break;case 4://南北黄闪,traffic_light_4(state4);operation_type=1;break;}else if(key==15){//delay_ms(1000);while(scanner()==15);for(i=0;i<1;i++){key0=scanner();while(!key0)key0=scanner();delay_ms(1000);m[i]=key0;while(scanner()==key0);}key1=m[0]*10+m[1];while(1){switch(operation_type){case 0://东西红灯(主干道),南北红灯(支干道))traffic_light_0(state0);operation_type=1;break;case 1://东西绿灯,南北红灯traffic_light_1(state1);operation_type=2;break;case 2://东西黄闪,绿灯灭traffic_light_2(state2);operation_type=3;break;case 3://东西红灯,南北绿灯traffic_light_3(key1);operation_type=4;break;case 4://南北黄闪,traffic_light_4(state4);operation_type=1;break;}}}//主程序void main(){PAC=0x81;while(1)traffic_light();}4、调试与运行:(1)按照硬件连接图,东西方向,P1.0接红灯,P1.1接黄灯,P1.2接绿灯;南北方向,P1.3接红灯,P1.4接黄灯,P1.5接绿灯。