红绿灯课程设计报告.docx
《红绿灯课程设计报告.docx》由会员分享,可在线阅读,更多相关《红绿灯课程设计报告.docx(11页珍藏版)》请在冰豆网上搜索。
红绿灯课程设计报告
北华航天工业学院
单片机课程设计报告
设计课题:
十字路口交通灯控制
专业班级:
B11203
学生姓名:
赵雪志
指导教师:
王晓
设计时间:
2013-6-11
1设计任务
利用单片机设计一个十字路口交通灯控制器
设计要求:
利用单片机的定时器产生秒信号,控制十字路口的红、绿、黄灯交替点亮和熄灭,并且用6只LED数码管显示十字路口两个方向的剩余时间。
要求能用按键设置两个方向的通行时间(绿、红灯点亮的时间)和暂缓通行时间(黄灯点亮的时间)。
系统的工作应符合一般交通灯控制的要求。
2硬件设计与系统总体方案图
2.1
AT89C52单片机简介
AT89C52是一种低功耗、高性能CMOS8位微控制器。
片上Flash
允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥
有灵巧的8位CPU和在系统可编程Flash,使得AT89C52为众多嵌入
式控制应用系统提供高灵活、超有效的解决方案。
AT89C52具有以下
标准功能:
8K字节Flash,256字节RAM,32位I/O口线,看门狗
定时器,2个数据指针,三个16位定时器/计数器,一个6位向量2
级中断结构,全双工串行口,片内晶振及时钟电路。
空闲模式下,
CPU停止工作,允许RAM、定时器计数器、串口、中断继续工作。
鉴于以上的优点本系统采用AT89C52作为主控芯片,实现对整个系
统的控制。
2.2系统硬件电路设计
(1)显示灯开关
显示灯开关
(2)按键电路
(3)显示电路
(4)总电路图
3源程序
#include
#defineunitunsignedint//宏定义
#defineucharunsignedchar
sbitred=P1^0;//设置P1,控制三个发光二极管
sbityellow=P1^2;
sbitgreen=P1^4;
sbitbeep=P2^3;
sbitdula=P2^6;//设置位选接口
sbitwela=P2^7;//设置段选接口
sbitK1=P3^4;//设置独立键盘接口
sbitK2=P3^5;
sbitK3=P3^6;
sbitK4=P3^7;
ucharcodetable[]={//定义数码表
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
ucharR=10,Y=5,G=10,numl,nums,temp,flag,flag1,r1,r2,y1,y2,g1,g2;//定义变量
voidinit();//声明初始化程序
voiddisplay(ucharr1,ucharr2,uchary1,uchary2,ucharg1,ucharg2);//声明显示程序
voiddelay_1ms(unitz)//1ms延时程序
{
unitx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voiddelay(void);
voidmain()//主函数
{
init();
while
(1)
{
if(K1==0)
{
R--;
delay_1ms(5);
display(r1,r2,y1,y2,g1,g2);
while(!
K1);
}
display(r1,r2,y1,y2,g1,g2);
}
}
voidinit()//初始化函数
{
P1=0xff;//初始化P1
dula=1;//初始化数码管
P0=0x3f;
dula=0;
wela=1;
P0=0xc0;
wela=0;
TMOD=0x11;//设置定时计数方式
TH0=(65536-50000)/256;//设置初值
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//开定时器T0中断
ET1=1;//开定时器T1中断
TR0=1;//打开定时器T0
TR1=1;//打开定时器T1
}
voidtimer0()interrupt1//发光二极管中断服务子程序
{
TH0=(65536-50000)/256;//装入初值
TL0=(65536-50000)%256;
switch(temp)
{
case0:
numl++;//红灯
red=0;//打开红灯
yellow=1;
flag=0;//生成标志位
if(numl==200)
{
numl=0;
temp=1;
}
break;
case1:
numl++;//黄灯
yellow=0;
red=1;
beep=1;
flag=1;
if(numl==100)
{
numl=0;
temp=2;
}
break;
case2:
numl++;//绿灯
green=0;
yellow=1;
flag=2;
if(numl==200)
{
numl=0;
temp=3;
}
break;
case3:
numl++;//黄灯
yellow=0;
green=1;
flag=3;
if(numl==100)
{
numl=0;
temp=0;
}
break;
}
}
voidtimer1()interrupt3//数码管显示服务子程序
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
r1=R/10;//分别将R、Y、G个位和十位的值赋给数码管的六位显示
r2=R%10;
y1=Y/10;
y2=Y%10;
g1=G/10;
g2=G%10;
switch(flag)
{
case0:
nums++;
Y=5;
beep=!
beep;//红灯开始计时
if(nums==20)//每一秒减一
{
R--;
nums=0;
}
break;
case1:
nums++;//黄灯开始计时
R=10;
if(nums==20)
{
Y--;
nums=0;
}
break;
case2:
nums++;//绿灯开始计时
Y=5;
if(nums==20)
{
G--;
nums=0;
}
break;
case3:
nums++;//黄灯开始计时
G=10;
if(nums==20)
{
Y--;
nums=0;
}
break;
}
}
voiddisplay(ucharr1,ucharr2,uchary1,uchary2,ucharg1,ucharg2)//数码管显示程序
{
dula=1;
P0=table[r1];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay_1ms
(1);
dula=1;
P0=table[r2];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay_1ms
(1);
dula=1;
P0=table[y1];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay_1ms
(1);
dula=1;
P0=table[y2];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delay_1ms
(1);
dula=1;
P0=table[g1];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delay_1ms
(1);
dula=1;
P0=table[g2];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
delay_1ms
(1);
}
5课程设计体会
经过一个星期的课程设计,过程曲折可谓一语难尽。
在此期间我
们也失落过,也曾一度热情高涨。
从开始时满富盛激情到最后汗水背
后的复杂心情,点点滴滴无不令我回味无长。
通过这次课程设计,加强了我们动手、思考和解决问题的能力。
让我对单片机的理论有了更加深入的了解,同时在具体的制作过程中我们发现现在书本上的知识与实际的应用存在着不小的差距,书本上的知识很多都是理想化后的结论,忽略了很多实际的因素,或者涉及的不全面,可在实际的应用时这些是不能被忽略的,我们不得不考虑这方的问题,这让我们无法根据书上的理论就轻易得到预想中的结果,有时结果甚至很差别很大。
特别是电路完成后,所有的焊接都与我们设计的方案一样,但当我们接通电源是,所看到的结果与我们料想的完全不同,三盏灯都亮了,我们也都知道,任何实验都不可能一次就成功的,我们认真的去检查,可是检查了好久都没有任何发现,只知道单片机的IO口的输出与我们所输入的程序不相符合,我们逐步排查,最先检查LED灯电路的接法是否合理,然后检查时钟电路的晶振是否有问题,然后再检查复位电路是否完好,最后功夫不负有心人,我们把复位电路接地电阻断开后,就发现LED灯有规律的熄灭了,经过我们的认真检查,对位选控制位口的改正,最后电路基本上都实现了我预先设计的功能。
这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,难免会遇过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。