单片机硬件实习报告格式电子122

  • 格式:docx
  • 大小:2.08 MB
  • 文档页数:11

序号: 20
学号: 12446220

C
H
A
N
G
Z

H
O
U
U

N

I
V
E
R

S
I
T
Y

实 习 报 告
实习课程名称: 单片机硬件实习
学 生 姓 名: 李思佳
学 院: 信息科学与工程学院 专 业 班 级: 电子122
校内指导教师: 苏 兵 专业技术职务: 副教授
实 习 地 点: 常州大学文约楼单片机实验室

实习时间: 2015 年 6 月 29 日  2015 年 7 月 10 日
一、 实习题目
交通灯控制设计

二、 实习目的
本次实习的目的在于加深对MCS-51单片机的理解,初步掌握单片机应用系
统的设计方法;掌握常用接口芯片的正确使用方法;强化单片机应用电路的设计
与分析能力;提高学生在单片机应用方面的实践技能;培育学生综合运用理论知
识解决问题的能力,力求实现理论结合实际,学以至用的原则

三、 实习任务及内容
设计内容:
利用双色LED显示电路,和四位静态数码管显示电路模拟十字路口交通信号
灯。4位LED数码管显示时间,双显示红绿灯状态。熟悉交通信号灯控制逻辑。
设计一个十字路口的交通灯色LED灯控制电路,要求南北方向和东西方向两个交
叉路口的车辆交替运行。每次绿灯变红灯时,要求黄灯先亮3S,才能变换运行车
辆。东西方向、南北方向车道除了有红、黄、绿灯指示外,每一种灯亮的时间都
用数码管显示器进行显示(采用倒计时的方法)。考虑到特殊车辆情况,设置紧
急转换开头。

设计目标:
1.进一步掌握键盘显示电路的编程方法。
2.进一步掌握定时器和中断的使用和编程方法。
四、 电路图设计
1、数码管显示部分
采用四位一体共阴数码管,分别显示西和北的剩余时间,A到G
为码段控制端口,1到4为片选端口。数码段显示部分通过74LS245
接单片机管脚的P0口,片选部分由P2.0到P2.1提供,具体的共阴数
码管见图。其中P2.1控制北边和西边剩余时间的十位数的显示;P2.0
控制北边和西边剩余时间的个位数的显示。
2晶体管显示部分
由于对称性,设计时只设计了西北两个方向。由红黄绿按要求显
示。用P1端口作为输出端口,用P1.2到P1.7端口分别控制西和北
两组灯的状态,低电平点亮,具体端口功能如下:
P1.2控制北边红灯的亮灭;
P1.3控制北边黄灯的亮灭;
P1.4控制北边绿灯的亮灭;
P1.5控制东边红灯的亮灭;
P1.6控制东边黄灯的亮灭;
P1.7 控制东边绿灯的亮灭。
五、 设计方案

开始
设置定时常数12
开外中断 初始状态,东西南北均为红灯 状态1南北绿灯,东西红灯,四个方向LED数码管开始倒计时。 状态2南北数码管时间为3s时,南北黄灯亮3s,东西仍为红灯。 状态3东西绿灯通车,南北红灯,四个方向LED开始倒计时。 状态4东西数码管时间为3s时,东西黄灯亮3s,南北仍为红灯。 中断入口 保护现场 东西南北都亮红灯并清
除LED数码管数字显示。

恢复现场
中断返回
六、 硬件电路设计
单片机实验箱实际电路运行情况:

状态1
状态2
状态 3

状态 4
中断状态

七、 系统调试
首先,我们想实现的功能是红绿黄灯交替,采用mcs-51单片机的功能,由
于汇编语言较为复杂,所以我们采用了较为简单的C语言来编程,红绿黄灯的变
化也较为简单,所以就很快就实现了功能,但是我们发现在实际情况中,红灯到
绿灯的过程中是不需要经过黄灯的,这就要求红灯和绿灯计时时间分开,红灯和
绿灯发生变化是倒计时到0时,自动跳转的,所以我们将绿灯的计时提前3s进
入0,然后进入黄灯倒计时,在黄灯倒计时结束时,红灯计时也结束,进入下一
个状态。第二部分就是数码管,由于不清楚数码管的接口地址,我们花了很多时
间测试,在之后的调试中便没有遇到太大的问题。最后实现了红绿灯交替,绿灯
变红灯之间黄灯亮3s,并且由数码管显示倒计时。至此,所有功能都已实现。
八、 实习总结
此次课程设计我一共花了差不多两周的时间,其中差不多有一周时间里
面我是在重新学习关于单片机的知识的。此次课程设计难的地方就是对程序
的编写难,很多地方都不怎么懂,所以我是看了蛮多的视频之后才开始编写
程序的。在编写的过程中运用到了蛮多老师以前讲的知识,中断,定时器,
延迟程序,函数声明,位声明等,很的新东西。同时经过两周的学习我也学
会了不少东西。
至于软件设计与调试,我觉得它主要考验你的思维逻辑能力及你对指令的熟
悉程度。可以说再整个软件设计过程中,我不仅学会了延时的两种方法,即软件
延时和硬件延时,还掌握数码管的两种显示方式(即动态显示与静态显示)及其
如何选择。当然,通过几次反复调试过程,使得我对C程序指令有了更深刻的理
解。
这次课程设计,我经过自己的努力和通过老师指导和同学的指点,最后终于
把它完成了,我同时也学会了更多,比如中断,数码管动态显示,计数器等。在
不懂的地方我们要虚心向别人请教,只有这样我们才能够学会更多,丰富我自己
的知识。

九、 参考文献
1、单片机原理与应用第二版.赵德安编著.机械工业出版社.

附录
C语言代码:
#include
#include
#define uchar unsigned char
#define uint unsigned int

uchar num,t;
sbit dula=P2^7; //段选跟位选
sbit wela=P2^6;
sbit dula1=P2^5;
sbit wela1=P2^4;
sbit dula2=P2^3;
sbit wela2=P2^2;
sbit dula3=P2^1;
sbit wela3=P2^0;

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴
数码管
void display(uchar b,uchar a);
void delay();

void delay(uint xms) //xms等于几就延迟几毫秒
{
uint i,j;
for(i=xms;i>0;i--)
for(j=112;j>0;j--)
;
}

uchar code sz[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90};

void display(uchar b,uchar a) //动态显示部分
{
uint i;

for(i=100;i>0;i--)
{
dula2=1;
wela2=1;

P0=sz[b];
wela=0;
delay(2);
wela=1;

wela1=0;
delay(2);
wela1=1;

P0=sz[a];
dula=0;
delay(2);
dula=1;

dula1=0;
delay(2);
dula1=1;

}
}

void circle12s()
{
uint a,b;
num=12;

TMOD=0x01;
while((num--)-4)
{
b=num/10;
a=num%10;
display(b,a);
delay(50);
}
}

void circle3()
{
uint a,b;
num=4;
TMOD=0x01;
while(num--)
{
b=num/10;
a=num%10;
display(0,a);
delay(100);
}
}

void main()
{
EA=1;//全局中断打开
EX0=1;//INT0中断开启
IT0=0;//低电平触发
while(1)
{
P1=0xbd;
circle12s();

P1=0x7d;
circle3();

P1=0xdb;
circle12s();

P1=0xd7;
circle3();

}
}

void danger()interrupt 0
{
P1=0xdd;
P0=sz[0];

dula2=1;
wela2=1;

wela=0;
delay(2);
wela=1;

wela1=0;
delay(2);
wela1=1;

dula=0;
delay(2);
dula=1;

dula1=0;
delay(2);
dula1=1;
}