单片机代码如下,按键1按下触发中断,相当于总开关,可以控制南北信号灯,此外可以用串口发送16进制数据,控制信号灯时间(只做了南北方向的,东西方向需要另做一个res接受位)
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
目录
一、选题一理论部分 2
1.1 课题的要求与内容 2
1.1.1 课题内容: 十字路口交通灯系统设计 2
1.1.2 课题要求: 2
1.2 系统的方案设计 2
1.2.1 系统方案: 2
1.2.2系统的构成: 2
1.3系统的硬件设计 2
1.3.1 系统硬件的设计步骤 2
1.3.2 系统硬件电路连接效果 3
1.4 系统的软件设计 4
1.4.1 系统的软件设计步骤 4
二、选题一实践部分 4
2.1 系统的硬件原理与说明 4
2.1.1 系统的硬件仿真效果图 4
2.1.2 仿真图说明: 5
2.2系统硬件调试的过程中出现的问题以及解决的措施 5
2.3系统软件调试的过程中出现的问题以及解决的措施 6
一、(选题一)理论部分
1.1 课题的要求与内容
1.1.1 课题内容: 十字路口交通灯系统设计
为了减少交通事故,确保交通顺畅,十字路口必须安置信号灯,以一定的时间间隔轮流点亮和熄灭。系统要求利用单片机的定时器定时功能,令十字路口的红黄绿灯交替点亮和熄灭,并且用LED数码管显示时间。
1.1.2 课题要求:
(1)开机或复位后,信号灯全灭,南北和东西各有两组信号灯,分别是直行和左转弯,LED数码管显示2位:显示秒。南北方向直行绿灯时间为20s,左转绿灯时间为17s;东西方向直行绿灯时间为27s,左转方向为22s。黄灯时间为3s。
(2)发挥部分
a.系统存储两套十字路口配时方案,可以通过按键来进行选择;
b.利用串口调试助手或编写上位机软件,通过上位机来人工设定十字路口配时方案。
1.2 系统的方案设计
1.2.1 系统方案:
本次课程设计所采用的方案是用单片机控制十字路口交通灯。单片机具有结构简单、编程方便、经济、易于连接等优点,特别是其内部定时器、计数器、中断系统资源丰富可对交通灯进行精确的控制,有应用价值,可扩展功能多,灵活性比较强。
1.2.2系统的构成:
整个系统的构成以80C51单片机为核心,由I/O口扩展,LED数码管显示,紧急情况中断电路还有复位电路等组成。
单片机作为整个硬件系统的核心,它既是协调整个工作系统的控制器,又是数据处理器。它由单片机、时钟电路、复位电路等组成。行车方向指示采用LED发光二极管,可有红、绿两种颜色指示放行与禁止,黄灯作为红绿转换的提示,形象直观。
本系统为交通信号灯设计了两种不同的配时方案,可以根据道路实时交通量的大小选择最佳配时方案。同时本系统还配有串口调试助手,可以通过串口发送数据从而达到改变配时时间的效果。
1.3系统的硬件设计
本系统的硬件主要由以下几部分组成:80C51单片机、电阻、LED数码管、LED发光二极管、电容、电解电容、晶体振荡器、开关、标准RS232端口。电路图是在Proteus中来连接完成的。
1.3.1 系统硬件的设计步骤

图1 系统硬件设计流程图
1.3.2 系统硬件电路连接效果

图2 硬件电路连接效果图
1.4 系统的软件设计
本系统的软件设计部分全部在Keil uvision4中完成,采用的编程语言为Keil C51.
1.4.1 系统的软件设计步骤

图3 系统软件设计流程图
二、(选题一)实践部分
2.1 系统的硬件原理与说明
2.1.1 系统的硬件仿真效果图


图4 硬件仿真效果图
2.1.2 仿真图说明:
当开关1按下时,交通信号灯首先执行第一套配时方案,首先,南北方向的直行是绿灯,东西方向的直行和左转均为红灯,待南北方向的直行时间变为0时,黄灯闪烁3秒,然后南北方向的左转变为绿灯,东西方向的直行和左转仍然全部为红灯;待南北方向的左转时间变为0时,黄灯仍然闪烁3秒,然后东西方向的直行变为绿灯,以此类推,信号灯亮的顺序和南北方向一致。配时方案2中信号灯亮的顺序和配时方案一的顺序一致,只是亮的时间不同。
本系统在设计的过程中还使用了串口调试助手,修改的是南北方向直行的时间的个位上的数值。
2.2系统硬件调试的过程中出现的问题以及解决的措施
问题:
信号灯点亮的顺序不对。
串口不能正常使用。
措施:
重新计算信号灯的字模。
重新连接串口。
2.3系统软件调试的过程中出现的问题以及解决的措施
问题:
接收不到串口发来的数据。
措施:
给定义的变量赋初值。
三、(选题一)结束语
通过本次课程设计,使我得到了一次用专业知识、专业技能分析和解决问题全面系统的锻炼。使我在51单片机的基本原理、单片机应用系统开发过程,以及在常用编程设计思路技巧(特别是C语言)的掌握方面都能向前迈了坚实的一步。
首先,我感触最深的当属查阅大量的设计资料了。为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的,在资料中查看与自己的设计相似的只是,在此基础上完善直至符合设计要求。
其次,在这次课程设计中,我们运用到了以前所学的专业知识,如:C语言、proteus制图。编写的程序与仿真电路图配合使用,发现问题,解决问题,在解决问题的过程中,我受益颇多。
最后,要做好一个课程设计,就必须要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,一次性就将整个程序设计好的概率很小,反复修改、不断改进是程序设计的必经之路,一个完美的代码通常是要修改很多次的;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一目了然地明白设计者的思路,这样也为资料的保存和交流提供了方便;在设计过程中应该将每次遇到的问题记录下来,并分析清楚,从中学到的知识也会让我受益终身。
单片机源码:
#include<reg51.h>
sbit LED1=P1^0;
sbit LED2=P1^1;
unsigned char code DIG_CODE[10]={0x6f/*9*/,0x7f/*8*/,0x07/*7*/,0x7d/*6*/,0x6d/*5*/,0x66/*4*/,0x4f/*3*/,0x5b/*2*/,0x06/*1*/,0x3f/*0*/};
unsigned int time;
unsigned int LedNumVal[2];
unsigned int button;
static unsigned char rec;
static unsigned char recs;
static unsigned char recg;
void Delay (unsigned int a )
{
unsigned char i=1;
unsigned int time=0;
if(time==a)
{i++;
}
}
void Display_show( int a , int b )
{
int i=1;
int j;
int k;
LedNumVal[0] = (9 - b) * 1000;
LedNumVal[1] = (9 - a) * 1000;
while(i==1)
{
LED2=0;
P0=DIG_CODE[LedNumVal[0] / 1000];
Delay(5);
if(LedNumVal[0] > 10000) //
{
LedNumVal[1] = LedNumVal[1] + 1000; //
LedNumVal[0] = 0; //b=9
}
j = 10;
while(j--);
P0 = 0x00;
LED2 = 1;
LED1=0;
P0=DIG_CODE[LedNumVal[1] / 1000];
Delay(5);
if(LedNumVal[1] == 9000) //
{
if(LedNumVal[0] > 9500) //
{
i++; //??b<0
}
}
k = 10; //
while(k--);
P0 = 0x00;//
LED1 = 1;
}
}
void main(void)
{
TMOD = 0x21; //
TH0 = 0xFE; //
TL0 = 0x0C ; //
TH1=TL1=0xf4; //
TR1=1; /
ES=1; //
PS=1; //
PT0=0; /
PCON=0; //
SCON=0x50;
IT0=1; //
EA = 1; //
ET0=1; //?
TR0= 1; /
EX0=1; /
EX1=1;
rec=0; //receive初值
while(1)
{
if(button==1)
{
if((button==1)&&(rec==0)) P2=0X7E; Display_show(1,2); //南北方向12s
if((button==1)&&(rec!=0)) P2=0x7e; Display_show(recs,recg);
P2=0X7D;
Display_show(0,3);
//??????3s
P2=0X7B;
Display_show(0,7);
//7s
P2=0X7D;
Display_show(0,3);
//3s
P2=0XE7;
Display_show(0,7);
//7s
P2=0XD7;
Display_show(0,3);
//3s
P2=0XB7;
Display_show(0,7);
//7s
P2=0XD7;;
Display_show(0,3);
//3s
}
if(button==2)
{
P2=0X7E;
Display_show(2,8);
//28s
P2=0X7D;
Display_show(0,3);
//3s
P2=0X7B;
Display_show(1,2);
//12s
P2=0X7D;
Display_show(0,3);
//3s
P2=0XE7;
Display_show(2,3);
//23s
P2=0XD7;
Display_show(0,3);
//3s
P2=0XB7;
Display_show(1,0);
//10s
P2=0XD7;;
Display_show(0,3);
//3s
}
}
}
void T0zd(void) interrupt 1 //T0 (1ms)
{
TH0 = 0xFE;
TL0 = 0x0C ;
LedNumVal[0]++;
time++;
}
void int0(void) interrupt 0 using 0
{
EX0=0;
button = 1;
EX0=1;
}
void int1(void) interrupt 2 using 0
{
EX1=0;
button = 2;
EX1=1;
}
void receiver() interrupt 4
{
if(RI==1)
{
RI=0;
rec=SBUF;
SBUF=rec;
while(TI==0);
TI=0;
recg=rec%16; //个位
recs=rec/16*10; //十位
}
}
全部资料51hei下载地址:
交通信号灯.zip
(8.04 MB, 下载次数: 113)
|