单片机的交通灯控制器设计.docx
- 文档编号:7614614
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:25
- 大小:432.40KB
单片机的交通灯控制器设计.docx
《单片机的交通灯控制器设计.docx》由会员分享,可在线阅读,更多相关《单片机的交通灯控制器设计.docx(25页珍藏版)》请在冰豆网上搜索。
单片机的交通灯控制器设计
目录
1.课程设计目的……………………………………………………………2
2.课程设计正文……………………………………………………………2
2.1软件设计………………………………………………………………2
2.1.1系统分析………………………………………………………………2
2.1.2绘制交通控制器原理图………………………………………………2
2.1.3软件仿真………………………………………………………………5
2.2硬件设计…………………………………………………………………5
2.2.1核心器件简介…………………………………………………………5
2.2.2小系统板原理图和器件清单…………………………………………8
2.2.3大板器件清单…………………………………………………………8
2.2.4单元电路设计…………………………………………………………9
2.2.5电路板焊接……………………………………………………………11
2.3软件程序设计……………………………………………………………12
3课程设计总结………………………………………………………………24
4参考文献……………………………………………………………………24
1.课程设计目的
加强对单片机和其编程语言的认识,充分掌握和理解设计各部分的工作原理、设计过程、选择芯片器件、模块化编程等多项知识。
用单片机模拟实现具体应用,使个人设计能够真正使用。
把理论知识与实践相结合,充分发挥个人能力,并在实践中锻炼。
提高利用已学知识分析和解决问题的能力。
提高实践动手能力。
2.课程设计正文
2.1软件设计
2.1.1系统分析
设计交通灯控制器,要求:
(1)A道和B道上均有车辆要求通过时,A,B道轮流放行。
即A道放行时,B道禁行;
(2)用2个数码管显示秒数,简化设计,不同时段显示放行时间和禁行时间。
(3)有紧急车辆要求通过时,系统要能禁止普通车辆通行,A,B道均为红灯,紧急车由K1开关模拟。
(4)东西和南北各用3个发光二极管,分别是红灯,黄灯,绿灯。
(5)上电时,默认红灯时间为10秒,绿灯时间为15秒。
设置5个按键,分别为加1,减1,调节切换,紧急状态,开始运行。
2.1.2绘制交通控制器原理图
在拿到设计说明书后,和同组同学讨论设计方案,通过在美食林门前交差路口观察交通灯原理,通过网上查资料初步设计好原理图,使用altiumdesigner6
绘制好原理图。
绘制原理图期间,由于altiumdesigner6中没有STC90C52AD器件图,所以首先绘制其器件图,如下所示:
根据单片机课设资料,设计好最小系统和外围设备的连接图原理图及PCB:
原理图:
PCB:
2.1.3软件仿真
为了更快更好的设计成功,我们需要在硬件设计前进行一些与实际差不多的软件仿真,这样做可以减少器件的损坏,在电路板焊接前初步了解电路的原理和所实现的功能,软件仿真图如下:
2.2硬件设计
2.2.1核心器件简介
STC90C52AD
管脚功能
STC90C52单片机为40引脚芯片如图2-3所示。
I/O口线:
P0、P1、P2、P3共四个八位P0口是三态双向口,通称数据总线口,因为只有该口能直接用于对外部存储器的读ˆ写操作。
P0口也用以输出外部存储器的低8位地址。
由于是分时输出,故应在外部加锁存器将此地址数据锁存,地址锁存信号用ALE。
P1口是专门供用户使用的I/O口,是准双向口。
P2口是从系统扩展时作高8位地址线用。
不扩展外部存储器时,P口也可以作为用户I/O口线使用,P2口也是准双向口。
P3口是双功能口,该口的每一位均可独立地定义为第一I/O功能或第二I/O功能。
作为第一功能使用时操作同P1口。
P3口的第二功能如表2-1。
图2-390C52引脚图
控制口线:
PSEN(片外取控制)、ALE(地址锁存控制)、EA(片外储器选择)、RE2SET(复位控制);
电源及时钟:
CCC、VSS;XTAL1,XTAL2
表2-1引脚功能表
74LS245
双向总线发送器/接收器(3S)
简要说明:
245为三态输出的八组总线收发器,其主要电器特性的典型值如下(不同厂家具体值有差别):
型号
tPLH
tphl
PD
54LS245/74LS245
8ns
8ns
275mW
引出端符号:
AA总线端
BB总线端
/G三态允许端(低电平有效)DIR方向控制端
逻辑图:
2.2.2小系统板原理图和器件清单
标识符
器件名称
规格型号
数量
标识符
器件名称
规格型号
数量
U1
单片机
STC90C52AD
1
C11C12
瓷片电容
22p或30p
2
U2
RS232驱动
MAX232
1
C13-C17
独石电容
0.22uF(224)
5
J1-J4,CRY
LstsHsts
接线插孔座
排母
86针
C1C2
电解电容
1.0uF/50V
2
C3C4C0
电解电容
10uF/50V
3
CRY
晶体谐振器
6MHz
1
C5-C8
电解电容
47uF(22uF)
4
High,Low,PS
发光二极管
φ3
3
JPS
接线端子
电源用
1
R1
金属膜电阻
200Ω
1
RST
按钮
小(0.2×0.3)
1
R0
金属膜电阻
6.8K
1
JDB
DB9插座
DB9针形座
1
R2R3R4
金属膜电阻
3.3K
3
U1
DIP插座
DIP40
1
R9
金属膜电阻
1M
1
U2
DIP插座
DIP16
1
2.2.3大板器件清单
4个共阴极数码管
4个NPN三极管
8个1K电阻
8个550欧电阻
7个330欧电阻
5个按键
1个74LS245
3个绿色发光二极管
3个红色发光二极管
2个黄色发光二极管
2.2.4单元电路设计
晶振电路
复位电路
显示电路
2.2.5电路板焊接
焊接小板时按老师给的资料焊接,大板按自己设计的原理图焊接,焊接时应注意利用大板的结构,利用好板上的接地和电源。
焊接时注意按照器件引脚图焊接而不要按原理图的引脚焊接。
焊接好的实物图如下:
2.3软件程序设计
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitwe0=P1^0;
sbitwe1=P1^1;
sbitwe2=P1^2;
sbitwe3=P1^3;
sbits0=P1^4;//调时模式开关
sbits1=P1^5;//加1开关
sbits2=P1^6;//减1开关
sbits3=P1^7;//南北向转换开关
sbitk1=P3^2;//紧急车辆通过开关
ucharb,aa,ge,shi,ge1,shi1;
uintt1,t2,t3,i,red,green;
intcheck,yellow;
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
voidinit();
voidcheckdisplay();
voiddelay(uintz);
voiddisplay(ucharshi,ucharge,ucharshi1,ucharge1);
voidmain()
{
init();
while
(1)
{
change:
if(s0==0)//进入调时模式
{
delay(5);
if(s0==0)
{
i=1;
P0=0xbf;
TR0=0;
green=t1;
red=t2;
while(!
s0);
delay(5);
while(!
s0);
while(i==1)
{
if(s0==0)
{
delay(5);
if(s0==0)
{
i=0;
}
}
if(s1==0)
{
delay(5);
if(s1==0)
{
if(t3%2!
=1)
{
t1++;
green=t1;
}
if(t3%2==1)
{
t2++;
red=t2;
}
}
while(!
s1);
delay(5);
while(!
s1);
}
if(s2==0)
{
delay(5);
if(s2==0)
{
if(t3%2!
=1)
{
t1--;
green=t1;
}
if(t3%2==1)
{
t2--;
red=t2;
}
}
while(!
s2);
delay(5);
while(!
s2);
}
if(s3==0)
{
delay(5);
if(s3==0)
{
t3++;
if(t3%2==1)
P0=0x7f;
else
P0=0xbf;
}
while(!
s3);
delay(5);
while(!
s3);
}
shi=green/10;
ge=green%10;
shi1=red/10;
ge1=red%10;
display(shi,ge,shi1,ge1);
check=t1-t2;
if(check<0)
{
check=-check;
}
if(check>=10)//检查黄灯时间是否超出10s范围
{
while
(1)
{
checkdisplay();
}
}
}
TR0=1;
}
while(!
s0);
delay(5);
while(!
s0);
}//到此调时程序结束
shi=green/10;
ge=green%10;
shi1=red/10;
ge1=red%10;
display(shi,ge,shi1,ge1);
P0=0xde;
if(aa==10)
{
aa=0;
green--;
red--;
if(red==0||green==0)//红灯时间走完进入黄灯倒计时状态
{
yellow=t1-t2;
if(yellow<0)
{
yellow=-yellow;
}
while(yellow!
=0)
{
P0=0xdd;
if(s0==0)
gotochange;//跳回调试模式
if(red==0)
{
P2=table[yellow];
we3=0;
delay
(1);
we3=1;
}
if(green==0)
{
P2=table[yellow];
we1=0;
delay
(1);
we1=1;
}
if(aa==10)
{
aa=0;
if(red==0)
{
yellow--;
green--;
}
if(green==0&&yellow!
=0)
{
yellow--;
red--;
}
}
P2=0xff;
shi=green/10;
ge=green%10;
shi1=red/10;
ge1=red%10;
display(shi,ge,shi1,ge1);
}
}
shi=green/10;
ge=green%10;
shi1=red/10;
ge1=red%10;
display(shi,ge,shi1,ge1);
if(green==0&&yellow==0)//东西方向和南北方向红绿灯换路
{
green=t1;
red=t2;
if(green==t1&&red==t2)
{
while(green!
=0&&red!
=0)
{
P0=0xf3;
if(s0==0)
gotochange;
shi=red/10;
ge=red%10;
shi1=green/10;
ge1=green%10;
display(shi,ge,shi1,ge1);
if(aa==10)
{
aa=0;
green--;
red--;
if(red==0||green==0)//红灯时间走完进入黄灯倒计时状态
{
yellow=t1-t2;
if(yellow<0)
{
yellow=-yellow;
}
while(yellow!
=0)
{
P0=0xeb;
if(s0==0)
gotochange;
if(red==0)
{
P2=table[yellow];
we1=0;
delay
(1);
we1=1;
}
if(green==0)
{
P2=table[yellow];
we3=0;
delay
(1);
we3=1;
}
if(aa==10)
{
aa=0;
if(red==0)
{
yellow--;
green--;
}
if(green==0&&yellow!
=0)
{
yellow--;
red--;
}
}
P2=0xff;
shi=red/10;
ge=red%10;
shi1=green/10;
ge1=green%10;
display(shi,ge,shi1,ge1);
}
}
shi=green/10;
ge=green%10;
shi1=red/10;
ge1=red%10;
display(shi,ge,shi1,ge1);
}
}
red=t2;
green=t1;
}
}
}
}
}
voidinit()
{
t1=15;
t2=10;
t3=0;
red=t2;
yellow=0;
green=t1;
P1=0xff;//有可能导致仿真出错
P3=0xff;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
EX0=1;
ET0=1;
TR0=1;
IT0=1;
}
voidcheckdisplay()//黄灯超时检查子程序
{
P2=0x40;
we0=0;
delay
(1);
we0=1;
P2=0xff;
P2=0x40;
we1=0;
delay
(1);
we1=1;
P2=0xff;
P2=0x40;
we2=0;
delay
(1);
we2=1;
P2=0xff;
P2=0x40;
we3=0;
delay
(1);
we3=1;
P2=0xff;
}
voiddisplay(ucharshi,ucharge,ucharshi1,ucharge1)//数码管显示子程序
{
if(shi!
=0)
{
P2=table[shi];
we0=0;
delay
(1);
we0=1;
}
else
we0=1;
P2=0xff;
if(ge!
=0||shi!
=0)
{
P2=table[ge];
we1=0;
delay
(1);
we1=1;
}
else
we1=1;
P2=0xff;
if(shi1!
=0)
{
P2=table[shi1];
we2=0;
delay
(1);
we2=1;
}
else
we2=1;
P2=0xff;
if(ge1!
=0||shi1!
=0)
{
P2=table[ge1];
we3=0;
delay
(1);
we3=1;
}
else
we3=1;
P2=0xff;
}
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=55;y>0;y--);
}
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}
voidexter0()interrupt0//紧急车辆通过中断程序
{
if(k1==0)
{
delay(5);
if(k1==0)
{
b=1;
TR0=0;
while(!
k1);
delay(5);
while(!
k1);
while(b)
{if(k1==0)
b=0;
P0=0xf6;
we0=1;
we1=1;
we2=1;
we3=1;
}
}
while(!
k1);
delay(5);
while(!
k1);
TR0=1;
}
}
3课程设计总结
为期两周的单片机课设结束了,在老师的指导和小组成员的共同努力下,终于完成了这次课程设计。
这次课程设计中我主要负责原理图的设计和pcb绘制,这次课设是我对altiumdesigner这个软件更加了解了,学会了单个原件的绘制和封装的添加,对pcb连线的规则也也有了进一步的了解。
这次课设还让我学到了很多动手实践的能力,在同伴们的共同努力下,通过软件仿真,在板子焊接好以后,稍作调试就实现了预期的效果,对于付出后的收获是很不一样的感觉。
转眼间又是一学年结束的时候,下学期就步入了大学的最后一学期,这次课设我学到了很多东西,它将会在新的一学期帮助我,更努力的学习这方面知识,为毕业后从事设计方面工作打下良好的基础,成为一名优秀的设计工作人员。
最后感谢老师们的辛勤工作和指导,谢谢!
4参考文献
[1]李朝青.单片机原理及接口技术(第3版).北京:
北京航空航天大学出版社,2005
[2]马忠梅等.单片机的C语言应用程序设计.北京:
北京航空航天大学出版社,2007
[3]赵新民.智能仪器设计基础.哈尔滨:
哈尔滨工业大学出版社,1999
[4]何立民.单片机应用技术大全.北京:
北京航空航天大学出版社,1994
课程设计
评语
课程设计
成绩
指导教师
(签字)
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 交通灯 控制器 设计