• 基于单片机的智能交通灯系统的设计


    目 录

    1绪论 1
    2课题的设计要求和设计方案 2
    2.1设计要求 2
    2.1.1 题目概述 2
    2.1.2 设计任务 2
    2.1.3 设计要求 2
    2.2设计方案 2
    2.2.1供电方案 2
    2.2.2输入方案 3
    2.2.3显示界面方案 3
    2.2.4交通灯方案 3
    2.2.4.1交通灯规则方案 3
    2.2.4.2 各种模式下通行时间 5
    2.2.5万年历设计方案 5
    3芯片的介绍及应用 7
    3.1 AT89C51单片机介绍及应用 7
    3.1.1单片机的引脚及功能 7
    3.1.2单片机最小系统的设置 9
    3.2 LCD1602芯片介绍及应用 9
    3.2.1 液晶显示器的介绍 9
    3.2.2 液晶显示器各种图形的显示原理 10
    3.2.3 LCD1602的基本参数及引脚功能 10
    3.2.4 LCD1602的指令说明及时序 11
    3.2.5 LCD1602液晶显示模块原理图 14
    3.3 DS1302芯片介绍及应用 15
    3.3.1 DS1302引脚功能 15
    3.3 .2 DS1302读写说明 15
    3.3 .3 DS1302时钟采集模块原理图 18
    3.4 DS18B20 芯片介绍及应用 18
    3.4 .1 DS18B20 引脚功能 18
    3.4.2 DS18B20 的应用及原理图 19
    4 程序的设计流程 20
    4.1 交通灯程序的设计流程 20
    4…1.1 倒计时显示的理论分析 20
    4.1.2 状态灯显示的理论分析 20
    4.1.3 交通灯主程序设计流程 20
    4.2 万年历的设计流程 22
    4.3 万年历时间的调整流程 22
    4.4 交通信号系统工作模式的工作流程 24
    5 软硬件的仿真调试 26
    5.1 PROTEUS仿真图 26
    5.2 硬件实物图 26
    结论 28
    致谢 29
    参考文献和资料 30
    附录Ⅰ:系统源程序 31
    2 课题的设计要求和设计方案
    2.1 设计要求
    2.1.1题目概述
    道路交通信号灯是道路交通安全的产品,它可以加强道路交通管理,减少交通事故的发生,提高道路使用效率,改善交通状况的一种重要工具。它适用于各种十字、丁字等交叉路口,由道路交通信号灯控制,指导车辆和行人安全而有序地通行。
    2.1.2 设计任务
    设计一种交通信号灯的控制系统。要求直观,简单。能够满足十字路口交通等的使用需求。
    2.1.3 设计要求

    1. 交通路口为十字路口。
      2.马路为双向六车道,即要有左转灯,直行灯,右转灯。
      3.要考虑人行横道的信号灯。
      4.有显示设备可以显示通信时间。
      5.要求通行时间可调。

    2.2 设计方案
    2.2.1 供电方案
    系统要在正常而稳定的状态下工作,必须要有可靠的电源。而本次基于单片机的设计需要显示的芯片较多,电源供应量大,因此本次设计了如下三种方案。
    方案一:利用独立的稳压电源供电。优点是可提供稳定而可靠电源,而且可以利用220V电压转化,不受各种因素的限制;缺点是各模块都采用独立电源,会增加本次设计的难度,而且对其他电路还会造成一定的干扰。
    方案二:采用USB转接口5V电压供电,这样简单明了,但是单单一个5V电源供电可能会显得电源不足,而无法满足实际的需要。
    方案三:采用USB转接口5V双电源电压供电,这样把本次设计分为两大模块,一是交通信号灯控制系统,二是万年历系统,采用双电源供电,一个为交通信号灯控制系统提供电源,另一个为万年历系统提供电源。这样即简单而又可提供稳定的电源。
    考虑到实际情况和电路的简洁,本设计采用了第三套方案,此方案在电路的设计上可以把系统分为两大模块,使系统设计简单化,从而又可以提供稳定而可靠电源。而且在单电源断电的情况下不影响另一模块的工作。

    2.2.2 输入方案
    该系统要求能手动及智能控制改变交通信号灯的通行时间和万年历时间的调整。
    方案一:采用8155扩展I/O 口及键盘、显示等。该方案的优点是:使用灵活可编程,并且有RAM,及计数器。若用该方案,可提供较多I/O 口,但操作起来稍显复杂。
    方案二: 直接在I/O口线上接上按键开关。该方案优点是:编程更加简洁,使用更加简单,且成本更低。缺点就是功能有限。
    综合考虑本设计的实际需要,在使用输入的时候不需要过于复杂的功能,因此直接在I/O口线上接上按键开关足以满足本次系统设计的需要,故采用方案二。

    2.2.3 显示界面方案
    本设计涉及到倒计时、状态灯、时间、温度等显示功能。基于功能需求,本设计考虑如下四种方案:
    方案一:完全采用数码管显示。这种方案只显示有限的符号和数码字符,无法胜任功能需求。
    方案二:完全采用点阵式LED 显示。这种方案实现复杂,且须完成大量的软件工作;但功能强大,可方便的显示各种英文字符,汉字,图形等。
    方案三:采用LCD1602液晶显示,这种显示比较乐观,但是工作量大,而且设计复杂,再加上需要到的LCD1602较多,从经济上也不划算。
    方案四:采用数码管、LED与LCD1602相结合的方法因为设计既要求倒计时数字输出,又要求有状态灯输出,同时还要显示出年、月、日、时、分、秒、星期和温度。为了方便观看并考虑到实际情况,用数码管显示交通信号灯的倒计时,用LED显示交通灯的状态灯、用LCD1602显示年、月、日、时、分、秒、星期和温度。这种设计方案既满足系统功能要求,又减少了系统实现的复杂度。

    2.2.4交通灯方案
    2.2.4.1交通灯规则方案
    本设计的交通灯以十字路口为模型,在实现基本的功能前提下增加了时间及温度的液晶显示。从而还增加了路口高峰期的智能化人工管理机制。
    实际生活中交通信号灯的规则千变万化,在不同的路口上看到的交通信号灯的规则不一样,但是总体还是相差不大,也有一些根据实际的需要而设置不同的交通规则,本次系统交通规则的设置是根据现实生活中的交通规则和多加考虑各种现实因素结合起来而制定了以下交通规则。
    下图所示为一种红绿灯规则的状态图:
    在这里插入图片描述

       	/***********************************************************
    	       十字路口交通灯控制 C 程序
    	***********************************************************/
    	#include 
    	#define	uchar	unsigned char
    	#define	uint	unsigned int
    	/*****定义控制位*******************************************/
    	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_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   EW_ManRed=P3^3;       //EW人行道红灯
    	sbit   SN_ManRed=P3^4;       //SN人行道红灯
    	sbit   x=P1^7;
    	sbit   y=P1^3;
    	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};  //0-9段选码
    	uchar code S[8]={0x28,0x48,0x98,0x88,0x82,0x84,0x89,0x88};  
    	//交通信号灯控制代码
    	/**********************延时子程序**************************/
    	void Delay(uchar a)
    	{
    		uchar	i;
    		i=a;
    		while(i--){;}
    	}
    	
    	/*****************显示子函数******************************/
    	void Display(void)
    	{
    		uchar h,l;
    		h=Time_EW/10;
    		l=Time_EW%10;
    	  	P0=table[l];        
    		EW_LED2=1;	      //点亮EW_LED2
    		Delay(2);
    		EW_LED2=0;        //熄灭EW_LED2
    		P0=table[h];
    		EW_LED1=1;        //点亮EW_LED1
    		Delay(2);
    		EW_LED1=0;
    	
    		h=Time_SN/10;
    		l=Time_SN%10;
    		P0=table[l];
    		SN_LED2=1;        //点亮SN_LED2
    		Delay(2);
    		SN_LED2=0;
    		P0=table[h];
    		SN_LED1=1;		  //点亮SN_LED1
    		Delay(2);
    		SN_LED1=0;
    			
    		h= EW1/10;
    		l= EW1%10;
    		P0=table[l];
    		Time_Show_LED1=1;	 //点亮Time_Show_LED1
    		Delay(2);
    	   Time_Show_LED1=0;
    		P0=table[h];
    		Time_Show_LED2=1;	//点亮Time_Show_LED2
    		Delay(2);
    		Time_Show_LED2=0;
    	} 
    	/**********************外部0中断服务程序******************/
    	
    	void INT0_srv(void)interrupt 0 using 1
    	{
    		 EX0=0;               //关中断
    	
    	    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
    	{
    		static uchar count;
    		TH0=(65536-50000)/256;
    		TL0=(65536-50000)%256;
    		count++;
    		
    		if(count==10)
    		{
    		    if(Flag_SN_Yellow==1)  //测试南北黄灯标志位
    		        {SN_Yellow=~SN_Yellow;}
    		    if(Flag_EW_Yellow==1)  //测试东西黄灯标志位
    		        {EW_Yellow=~EW_Yellow;} 
    		}
    		if(count==20)
    		{
    		    Time_EW--;
    		    Time_SN--;
    		    if(Flag_SN_Yellow==1)  //测试南北黄灯标志位
    		        {SN_Yellow=~SN_Yellow;}
    		    if(Flag_EW_Yellow==1)  //测试东西黄灯标志位
    		        {EW_Yellow=~EW_Yellow;}
    		    count=0;
    		}
    	}
    	/*********************主程序开始***********************/
    	void	main(void)
    	{ 
    	Busy_LED=0;
    	Special_LED=0;
    	IT0=1;	   //INT0负跳变触发
    	TMOD=0x01; //定时器工作于方式1
    	TH0=(65536-50000)/256; //定时器赋初值
    	TL0=(65536-50000)%256;
    	EA=1;  //CPU开中断总允许
    	ET0=1; //开定时中断
    	EX0=1; //开外部INTO中断
    	TR0=1; //启动定时
    	
    	    while(1)
    	    {				
    	        /*******S0状态**********/
    	SN_ManRed=0;
    	SN_ManGreen=1;  //SN人行道通行
    	EW_ManRed=1;	//EW人行道禁止
    	EW_ManGreen=0;
    	Flag_EW_Yellow=0;	   //EW关黄灯显示信号
    	Time_EW=EW;
    	Time_SN=SN;
    	while(Time_SN>=5)
    			{    
    			    P1=S[0];	//SN绿灯,EW红灯
    			    Display();
    			}
    	
    			/*******S1状态**********/
    			P1=0x00;
    			while(Time_SN>=0)
    			{
    	Flag_SN_Yellow=1; //SN开黄灯信号位
    	P1=P1|0x08;    //保持EW红灯
    	Display();
    			}
    	
    			/*******S2状态**********/
    	SN_ManRed=1;      //SN人行道禁止
    	SN_ManGreen=0;
    	EW_ManRed=1;	  //EW人行道禁止
    	EW_ManGreen=0;
    	Flag_SN_Yellow=0; //SN关黄灯显示信号
    	Time_SN=SNL;
    	while(Time_SN>=5)
    			{
    	P1=S[2];      //SN左拐绿灯亮,EW红灯
    	Display();
    			}
    	
    			/*******S3状态**********/
    			P1=0x00;
    			while(Time_SN>=0)
    			{
    	//Flag_SN_Yellow=0;	//SN开黄灯信号位
    	x=1;
    	P1=P1|0x08;    //保持EW红灯
    	Display();
    			}
    	
    			/***********赋值*********/
    	EW=EW1;
    	SN=SN1;
    	EWL=EWL1;
    	SNL=SNL1;
    			/*******S4状态**********/
    	SN_ManRed=1;      //SN人行道禁止
    	SN_ManGreen=0;
    	EW_ManRed=0;
    	EW_ManGreen=1;	  //EW人行道通行
    	Flag_SN_Yellow=0; //SN关黄灯显示信号
    	Time_EW=SN;
    	Time_SN=EW;
    	while(Time_EW>=5)
    			{
    			    P1=S[4];	  //EW通行,SN红灯
    				Display();
    			}
    	
    			/*******S5状态**********/
    			P1=0X00;
    			while(Time_EW>=0)
    			{
    	Flag_EW_Yellow=1;//EW开黄灯信号位
    	P1=P1|0x80;    //保持SN红灯
    	Display();
    			}
    	
    			/*******S6状态**********/
    	SN_ManRed=1;     //SN人行道禁止
    	SN_ManGreen=0;
    	EW_ManRed=1;	 //EW人行道禁止
    	EW_ManGreen=0;
    	Flag_EW_Yellow=0;//EW关黄灯显示信号
    	Time_EW=EWL;
    	while(Time_EW>=5)
    			{
    	P1=S[6];     //EW左拐绿灯亮,SN红灯
    	Display();
    			}
    	
    			/*******S7状态**********/
    			P1=0X00;
    			while(Time_EW>=0)
    			{
    	//Flag_EW_Yellow=0; //EN开黄灯信号位
    	y=1;
    	P1=P1|0x80;    //保持SN红灯
    	Display();
    			}
    				
    			/***********赋值********/
    			EW=EW1;
    			SN=SN1;
    			EWL=EWL1;
    			SNL=SNL1;
    		}
    	}
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    Web知识:markupsafe.escape() 函数的作用
    Redis实践经验
    海康摄像头4G内网连接方案
    上半年Java面试真题整理,一共343道,每一题都很经典,上半年就有89人拿到offer
    HCIP-一、RSTP 特性及安全
    PYQT常用组件--方法汇总
    C++打怪升级(二)- 引用详解
    HTTP代理反爬虫技术详解
    四级常见英语短语1000条
    PCIE知识点-008:PCIE switch的结构
  • 原文地址:https://blog.csdn.net/newlw/article/details/127673169