51单片机c语言交通灯设计报告文档格式.docx
《51单片机c语言交通灯设计报告文档格式.docx》由会员分享,可在线阅读,更多相关《51单片机c语言交通灯设计报告文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
DIR为H时,由A传向B。
(3)两位共阴数码管
16脚和11脚对应A、15脚和10脚对应B、3脚和8脚对应C、2脚和6脚对应D、1脚和5脚对应E、18脚和12脚对应F、17脚7脚对应G、4脚和9脚对应DP。
公共脚为14脚和13脚,分别对应左边和右边显示的数字。
三、系统硬件电路设计
(1)时钟电路设计
如图所示,采用部时钟产生方式,在XTAL1和XTAL2两端跨接晶体或瓷振荡器,与部反相器构成稳定的自击震荡。
其发出的时钟脉冲直接送入片定时控制部件。
(2)复位电路设计
如上图所示,采用上电+按钮电平复位方式,当按下按钮时,RST管脚高电平触发。
为保证复位可靠,RC时间常数应大于两个机器周期,电容取10uf,电阻取1000欧。
(3)灯控制电路设计
如上图所示,交通灯状态显示电路由东西南北四个方向各三个LED灯组成,分别显示四个方向上红、黄、绿三个状态,用以指示十字路口各方向车辆的行驶。
通过软件编程,可使路口交通变化情况为:
南北方向和东西方向两条交叉道路上的车辆交替运行,主干道每次通行时间都设为30秒。
在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道;
黄灯亮时每秒闪亮一次。
(4)按键控制电路设计
开关控制由7个连接到单片机的控制按钮组成。
通过软件编程,使得各个开关的功能如上图所示,基本满足了交通灯的需要。
四、元件清单及实物图
1、程序清单
名称
规格
数量
单片机
AT89S52
1
排阻
9脚10K
1
晶振
11.0592MHz
发光二极管
GREEN
3
RED
YELLOW
数码管
两位共阴
2
电阻
1K
电阻
10K
6
按键
8
电解电容
10uF
独石电容
22pF
电源插头
排座
20脚
排座
40脚
双排针
2.54间距
单排针
排线
15cm
16根
实验板
10*15cm
2、原理图
五、实验心得
这次交通灯的制作是我学会了不少的东西,首先是proteus和keil的使用。
单片机程序的编写和原理图的仿真都是在这两个软件的运行下才可以进行的。
这个实验最重要的是让我对51系列的单片机有了更深层次的了解,这一学期开接触单片机的时候觉得这是一门极其高深的课程,老师讲的什么基本完全不懂,课后看仍旧是一头雾水。
通过交通灯的学习和制作,对单片机有了初步的了解,知道了它的组成、工作原理等等。
在软件编写这一块,开始时遇到了很大的难题,因为两百行的程序,哪怕有一个错误,修改起来也不是十分方便。
时常没有心思去寻找和改正错误,所以软件这一块花了很大的一部分时间。
几次调试后总算出现“0warning”和“0error”的字样。
焊接也是比较麻烦,由于万能板买小了,再加上需要连接的线有很多根,所以首先必须考虑到元器件的排布问题,尽量让自己的焊接的时候方便一点。
借鉴别人的经验,数码管和排阻之间用排线相连接,很大程度上节省焊接的时间,并且让板子看起来更加整洁、美观。
除了学会很多东西以为,也发现了自己的不足。
由于自己在这一方面只是的短缺,所以很多问题都需要查阅资料或者向别的同学请教。
比如说proteus和keil的使用方法,都是看着别人操作几遍之后才慢慢学会。
还有在焊接这一方面也存在着很大问题。
由于焊接在万能板反面,所以有时候会把单片机的引脚看错,然后用吸枪慢慢清理。
这不仅浪费时间而且还可能破坏万能板。
在焊接过程中还出现短路问题,一不小心锡丝用多了就有可能造成两个点之间的短路问题,这一点说明了焊接能力还有待提升。
实验的结果是成功的,模拟出了交通灯的功能,各个按键的功能也和模拟时一致,看着数字的跳动自己信息也感到十分开心。
虽然想过在这个交通灯里加入一些额外的功能,但终究由于自己知识的局限性而放弃,有点遗憾,不过能够学到东西就好。
此次试验增长了自己的单片机知识外也让我知道实践和理论学习的差别。
实践过程中学到的知识自己记得会更加牢固一些,不容易忘记。
总的来说,单片机的制作让我收获不小。
附1源程序代码
#include<
reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
uchardatabuf[4];
uchardatasec_dx=20;
//东西数默认
uchardatasec_nb=30;
//南北默认值
uchardataset_timedx=20;
uchardataset_timenb=30;
intn;
uchardatab;
//定时器中断次数
sbitk1=P1^6;
//定义5组开关
sbitk2=P1^7;
sbitk3=P2^7;
sbitk4=P3^0;
sbitk5=P3^1;
sbitYellow_nb=P2^5;
//南北黄灯标志
sbitYellow_dx=P2^2;
//东西黄灯标志
sbitGreen_nb=P2^4;
sbitGreen_dx=P2^1;
sbitBuzz=P3^7;
bitBuzzer_Indicate;
bittime=0;
//灯状态循环标志
bitset=1;
//调时方向切换键标志
ucharcodetable[11]={//共阴极字型码
0x3f,//--0
0x06,//--1
0x5b,//--2
0x4f,//--3
0x66,//--4
0x6d,//--5
0x7d,//--6
0x07,//--7
0x7f,//--8
0x6f,//--9
0x00//--NULL
};
//函数的声明部分
voiddelay(intms);
//延时子程序
voidkey();
//按键扫描子程序
voidkey_to1();
//键处理子程序
voidkey_to2();
voidkey_to3();
voiddisplay();
//显示子程序
voidlogo();
//开机LOGO
voidBuzzer();
//主程序
voidmain()
{
TMOD=0X01;
TH0=0XD8;
TL0=0XF0;
EA=1;
ET0=1;
TR0=1;
EX0=1;
EX1=1;
logo();
P2=0Xc3;
//开始默认状态,东西绿灯,南北黄灯
sec_nb=sec_dx+5;
while
(1)
{
key();
//调用按键扫描程序
display();
//调用显示程序
Buzzer();
}
}
//函数的定义部分
voidkey()//按键扫描子程序
if(k1!
=1)
{
delay(10);
if(k1!
{
while(k1!
{
key_to1();
for(n=0;
n<
40;
n++)
{display();
}
}
}
if(k2!
if(k2!
while(k2!
key_to2();
if(k3!
TR0=1;
//启动定时器
Buzzer_Indicate=0;
sec_nb=set_timenb;
//从中断回复,仍显示设置过的数值
sec_dx=set_timedx;
if(time==0)
{P2=0X99;
sec_nb=sec_dx+5;
else{P2=0xC3;
sec_dx=sec_nb+5;
if(k4!
delay(5);
if(k4!
{
while(k4!
=1);
set=!
set;
if(k5!
delay(5);
while(k5!
=1)
key_to3();
voiddisplay()//显示子程序
{
buf[1]=sec_dx/10;
//第1位东西秒十位
buf[2]=sec_dx%10;
//第2位东西秒个位
buf[3]=sec_nb/10;
//第3位南北秒十位
buf[0]=sec_nb%10;
//第4位南北秒个位
P1=0xff;
//初始灯为灭的
P0=0x00;
P1=0xfe;
//片选LCD1
P0=table[buf[1]];
delay
(1);
P1=0xff;
P1=0xfd;
//片选LCD2
P0=table[buf[2]];
delay
(1);
P1=0Xfb;
//片选LCD3
P0=table[buf[3]];
P1=0xff;
P1=0Xf7;
P0=table[buf[0]];
//片选LCD4
voidtime0(void)interrupt1using1//定时中断子程序
b++;
if(b==19)//定时器中断次数
{b=0;
sec_dx--;
sec_nb--;
if(sec_nb<
=5&
&
time==0)//东西黄灯闪
{Green_dx=0;
Yellow_dx=!
Yellow_dx;
}
if(sec_dx<
time==1)//南北黄灯闪
{Green_nb=0;
Yellow_nb=!
Yellow_nb;
}
if(sec_dx==0&
sec_nb==5)
sec_dx=5;
if(sec_nb==0&
sec_dx==5)
sec_nb=5;
if(time==0&
sec_nb==0)
{P2=0x99;
time=!
time;
sec_nb=set_timenb;
sec_dx=set_timenb+5;
if(time==1&
sec_dx==0)
{P2=0Xc3;
sec_dx=set_timedx;
sec_nb=set_timedx+5;
}
voidkey_to1()//键盘处理子程序之+
TR0=0;
//关定时器
if(set==0)
set_timenb++;
//南北加1S
else
set_timedx++;
//东西加1S
if(set_timenb==100)
set_timenb=1;
if(set_timedx==100)
set_timedx=1;
//加到100置1
sec_nb=set_timenb;
//设置的数值赋给东西南北
sec_dx=set_timedx;
voidkey_to2()//键盘处理子程序之-
set_timenb--;
//南北减1S
set_timedx--;
//东西减1S
if(set_timenb==0)
set_timenb=99;
if(set_timedx==0)
set_timedx=99;
//减到1重置99
voidkey_to3()//键盘处理之紧急车通行
P2=0Xc9;
sec_dx=00;
sec_nb=00;
Buzzer_Indicate=1;
voidint0(void)interrupt0using1//只允许东西通行
Buzzer_Indicate=0;
voidint1(void)interrupt2using1//只允许南北通行
P2=0X99;
voidlogo()//开机的Logo"
----"
{for(n=0;
50;
P0=0x40;
P1=0Xf7;
P1=0xff;
voidBuzzer()
if(Buzzer_Indicate==1)
Buzz=!
Buzz;
elseBuzz=0;
voiddelay(intms)//延时子程序
uintj,k;
for(j=0;
j<
ms;
j++)
for(k=0;
k<
124;
k++);
附2原理图