专业综合课程设计.docx
《专业综合课程设计.docx》由会员分享,可在线阅读,更多相关《专业综合课程设计.docx(16页珍藏版)》请在冰豆网上搜索。
专业综合课程设计
专业综合课程设计报告
—.项目名称及负责内容
十字路口交通灯的控制电路
我主要负责软件程序的设计,流程图的设计及主要参数的计算。
2.设计基本要求及步骤
十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。
那么靠什么来实现这井然秩序呢?
靠的就是交通信号灯的自动指挥系统。
2.1设计目的
本设计是专业课程综合训练,可以通过理论学习,资料查阅,软、硬件设计,系统调试等环节,巩固和提高所学的知识和应用水平。
学会提出问题,观察和分析问题,得到最终的科学方法。
培养严谨的工作作风,务实的工作态度。
为今后的毕业设计,及从事单片机控制系统的设计与维护奠定坚实的基础。
2.2基本要求
本系统需要采用MSC・51系列单片机AT89C51作为中心器件来设计交通灯控制器,实现以下功能:
1-初始值为0,接着东西绿灯亮,南北红灯亮,东西方向通车。
2.延时26s,东西路口绿灯熄灭,黄灯闪烁3次。
3.黄灯闪烁后,东西路口红灯亮同时南北路口绿灯亮,南北方向开始通车。
4.延时26s,南北方向绿灯灭,黄灯闪烁3次,然后又切换成东西方向通车,如此重复。
2.3设计步骤
1•利用Proteus7.5SP3仿真软件按下列要求绘制仿真实例
2•按照基本要求编制程序实现相应功能。
1)利用定时器产生秒信号,控制十字路口红绿黄灯交替点亮和熄灭
2)采用LED数码管显示交通灯剩余时间
3)系统工作符合一般交通灯控制要求
3.设计方案
3.1方案选择
1)用数字电子技术来实现交通灯控制
2)用单片机技术来实现交通灯控制
在刚刚选择了这个题目时,我犹豫过到底要用单片机知识还是用数字电子技术知识来做,因为单片机我学的不扎实,要自己写程序的话在一周之内根本不可能,拿到题目的下午我就去图书馆查找了一些相尖的资料,回来宿舍上网也找了
一些尖于交通灯的论文,看过之后,我和组员商量发现如果用数电知识来做的话,网上搜到的电路图相当复杂,光看懂电路图就得不少时间。
其中还有不少芯片需要查找看其功能。
但用C语言我仍然挺难完成程序的撰写。
看了许多网上的程序和书上的程序及请教同学,我们先一起商量把程序分为了四部分:
初始化、中断程序、显示程序、主程序及消抖等其他部分。
最后,我们还是决定用单片机。
3.2参数计算
1.设单片机工作在主频为12MHZ下,由于一个机器周期等于12个振荡脉冲周期,所以机器周期(延时)为1us.
2.定时器工作在T。
方式1定时50ms初值M=(216・5000)“256=3CH为高8位的值。
低8位的值为B0H。
3•内部振荡器的频率主要取决于晶振的频率。
一般在1.2-12MHZ之间,电容值
在5—30PF之间选择,电容的大小对振荡频率有微小的影响,可起频率微调的作用。
4.仿真图中RP1为电阻排,又称上拉电阻,大约为1KU乍用:
实现电平转换;直接驱动大负载。
图中R17/R18可以实现线与。
仿真图中与六个二极管相连的电阻R9/R10/R11/R12/R13/R14的作用是限制电流的大小,保护电路。
取值为3001.
5.在复位电路中,电阻和电容值的选取因使RST端的高电平维持2个机器周期以上才能完成复位。
6.程序中W的值指的是次数,表示1s内定时50ms需要20次。
7.数码管采用共阳极接法,当阴极端加载高电平时,对应段的发光二极管就导通点亮,加载低电平时则不亮。
8.程序中延时函数选用参变量Z。
4.软件设计
4.1•程序流程图
运行址程
LED
显
示缓
EW:
绿灯(26),SN:
红灯
冲区
N
SN:
黄灯灭>EW:
红灯
4.2程序源代码
〃52头文件
〃初始化头文件
〃宏定义
inelude
#includevintrins.h>
#defineuintunsignedint
#defineucharunsigned
charucharshi1,ge1,shi2,ge2,s1,s2,k,hh,ll,yy;
uintw;
codeuchartable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};〃共阳极
数码管
A
sbitnbh=P10;
sbitnby=P1A1;
sbitnbl=P1M2;
sbitdxh=P1A3;
sbitdxy=P1A4;
sbitdxl=P1A5;
sbitSwitch_add=P3A6;
sbitSwitch_sub=P3A7;
voiddelay(uintz)//延时函数振荡频率为12MHZ,延时1us
{
uintx,y;
for(x=z;x>0;x_)
for(y=110;y>0;y-);
}
voidinit()
{
TMOD=1:
//TO方式1定时
TH0=(65536-50000)/256;〃装TO初值,定时50msTL0=(65536-50000)%256;
EA=1;//开中断
ET0=1;//允许TO申请中断
TR0=1;〃启动TO
hh=26;
yy=6;
ll=hh-yy;
EX0=1;//幵中断0
IT0=1;〃外部中断0下降沿有效
s仁0;//南北时间为Os
s2=0;/冻西时间为Os
shi仁s1/10;〃南北十位时间
gel=s1%10;//南北个位时间
shi2=s2/10;/东西十位时间
ge2=s2%10;/冻西个位时间
P2=0x11;P0=table[shi1];delay(5);//P2.0=1接数码管1,显示南北的十
位时间
P2=0x22;P0=table[ge1];delay(5);//P2.1=1接数码管2,显示南北的个
位时间
P2=0x44;P0=table[shi2];delay⑸;〃P2.2=1接数码管3,显示东西的十
位时间
P2=0x88;P0=table[ge2];delay(5);//P2.3=1接数码管4,显示东西的个
位时间
}
voiddxlnbh()//东西绿,南北红
{
s仁hh;//南北红时间
s2=ll;〃东西绿时间
k=ll;
P仁Oxde;/东西绿南北红while(k)
if(w==20)〃每一秒变化一次
s1-;〃南北时间减一
s2-;〃东西时间减一shi仁s1/10;//南北十位时间ge仁s1%10;/南北个位时间shi2=s2/10;/冻西十位时间ge2=s2%10;/冻西十位时间w=0;
}
P2=0x11:
P0=table[shi1];delay(5);//P2.0=1接数码管1,显示南北的十位时间P2=0x22;P0=table[ge1];delay⑸;〃P2.1=1接数码管2,显示南北的个位时间P2=0x44;P0=table[shi2];delay(5);//P2.2=1接数码管3,显示东西的十位时间P2=0x88;P0=table[ge2];delay⑸;〃P23=1接数码管4,显示东西的个位时间}
}
voiddxynbh()//东西黄闪6S南北红6S
{
P仁Oxee;/冻西黄南北红
k=yy;
while(k)
{
if(w==20)
{if(s2==0)s2=6;〃东西时间为0时»重置时间为6s
s1-;〃南北时间减一
s2-;〃东西时间减一shi仁sl/10;〃南北的十位时间ge仁s1%10;//南北个位时间shi2=s2/10;/冻西十位时间ge2=s2%10;//东西个位时间w=0;
k—;
if(k%2)
P1=Oxfe;//南北红,南北黄灭else
P仁Oxee;俑北红,东西黄
P2=0x11;P0=table[shi1];delay(5);
P2=0x22;P0=table[ge1];delay(5);
P2=0x44;P0=table[shi2];delay(5);P2=0x88;P0=table[ge2];delay(5);
}
}
voiddxhnbl()//东西红,南北绿
{s1=ll;
s2=hh;
k=ll;
P仁0xf3;〃东西红,南北绿
while(k)
{
if(w==20)
{
s1-;
s2-;
shi1=s1/10;
ge仁s1%10;
shi2=s2/10;
ge2=s2%10;
w=0;
k";
}
P2=0x11;P0=table[shi1];delay(5);
P2=0x22;P0=table[ge1];delay(5);
P2=0x44;P0=table[shi2];delay(5);
P2=0x88;P0=table[ge2];delay(5);
}
}
voiddxhnby()〃南北黄闪6S东西红6S
{
P1=0xf5;
k=yy;
while(k)
{
if(w==20)
if(s1==0)s1=6;
S1-;
s2-;
shi仁s1/10;ge仁s1%10;shi2=s2/10;ge2=s2%10;w=0;
k-;
}
if(k%2)
,南北黄灭南北黄亮
P仁0xf7;〃东西红
elseP仁0xf5;//东西红,
P2=0x11;P0=table[shi1];delay(5);
P2=0x22;P0=table[ge1];delay(5);
P2=0x44;P0=table[shi2];delay(5);
P2=0x88;P0=table[ge2];delay(5);
}
/**按键扫描程序
voidkey(voidX
红灯时间增
if(Switch_add==O)
{_"
delay(5);〃按键消抖
if(Switch_add==O)
hh++;11=hh-yy;
if(hh>90)hh=90;
while(Switch_add==O);
/**红灯时间减**/
if(Switch_sub==O)
{_~delay(5);//按键消抖if(Switch_sub==O)
{_hh-;ll=hh-yy;if(hh<20)hh=20;while(Switch_sub==O);
voidmain()
{
init();
while
(1)
dxlnbh();//东西绿,南北红
dxynbh();〃东西黄‘南北红
dxhnbl();//东西红,南北绿dxhnby();〃东西红‘南北黄
}
voidint0()interrupt0//外部中断
{
key();
P2=0x11;P0=table[shi1];delay(5);
P2=0x22;P0=table[ge1];delay(5);
P2=0x44;P0=table[shi2];delay(5);
P2=0x88;P0=table[ge2];delay(5);
}
voidt0()interrupt1//定时器中断
{
TH0=(65536-50000)/256;〃重装初值
TL0=(65536-50000)%256;
w++;
}