单片机原理及应用
实验报告
姓 名: 方恩山
学 号: 631206040110
专 业: 通 信 工 程
实验性质: 设 计 性
班 级: 2012 级 1 班
指导教师: 许 强
实验项目名称: 万用交叉口交通灯控制器实验
实验日期: 16周 - 18周 实验成绩:
实验评定标准:
一、 实验目的
通过仿真搭建和实物搭建相结合,万用交叉口交通灯控制器系统设计,并掌握C51编程操作。
二、 实验器材
一)器材
1.PC机一台
2.Windows 7 OS
3.Proteus仿真软件
4.keil软件
二)材料
单片机AT89C51(1片) 数码管 (1 个) LED发光二级管 ( 12个) 按钮(16 个) 晶振11.0592MHZ( 1 个) 电容 大于20pF,小于50pF (2 个) 电解电容 10uF ( 1 个) 电容 1uf ( 4 个) 电阻 10K ( 1 个) 电阻 300 (8 个)
三、 实验内容
模拟控制就是以红、绿、黄色4 组12 个发光二极管表示交通信号灯。每组灯有两位数码倒倒计时显示。假设一个十字路口为东西南北走向。初始状态0为东西红灯,南北红灯。然后转状态1,东西方向的绿灯亮,东西方向可通车,而南北方向的红灯亮,南北方向的车禁止通行。过一段时间转状态2,东西绿灯灭后,黄灯亮,延时几秒,南北仍然红灯。再转状态3,南北方向的绿灯亮,南北方向可以通车,而东西方向的红灯亮,东西方向禁止车辆通行。过一段时间转状态4,南北绿灯灭后亮黄灯,延时几秒,东西方向仍然红灯亮。最后循环至状态1。
用Proteus仿真软件搭建仿真硬件电路图。验证编制软件。
四、 实验步骤
打开Keil程序,执行菜单命令“Project”→“New Project”创建“trafficController”项目,并选择单片机型号为AT89C51。执行菜单命令“File”→“New”创建文件,输入源程序,保存为“trafficController.A51”。在“Project”栏的File项目管理窗口中右击文件组,选择“Add Files to Group ‘Source Group1’”将源程序“trafficController.A51”添加到项目中。
执行菜单命令“Project”→“Options for Target ‘Target 1’”,在弹出的对话框中选择“Output”选项卡,选中“Greate HEX File”。执行菜单命令“Project”→“Build Target”,编译源程序。如果编译成功,则在“Output Window”窗口中显示没有错误,并创建了“trafficController.HEX”文件。在proteus仿真平台上建立参考图系统,并将程序上载到虚拟芯片上运行。
五、 实验结果及分析
仿真结果如下图
1.东西方向通路,南北方向禁止通行
2进行按钮切换时,交通切换到东西禁行,南北方向通行。
3在进行道路转换的时候,黄灯亮起,有5s的间隔。
实验代码
1.
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV DPTR,#7F00H ;8155命令口地址
MOV A,#03H ;置8155PA、PB口为输出,PC口为输入
MOVX @DPTR,A
MOV 7AH,#00
MOV 7BH,#01
MOV 7CH,#02
MOV 7DH,#03
MOV 7EH,#04
MOV 7FH,#05
ML0: NOP
LCALL DISP
SJMP ML0
DISP:MOV R0,#7AH ;置显示缓冲器指针初值
MOV R3,#01H ;置扫描模式初值
DISPB1:MOV DPTR,#7F02H ;8155PB口地址
MOV A,#0h ;熄灭所有LED
MOVX @DPTR,A
MOV DPTR,#7F01H ;8155PA口地址
MOV A,@R0
ADD A,#014H
MOVC A,@A+PC
MOVX @DPTR,A
MOV A,R3
MOV DPTR,#7F02H
MOVX @DPTR,A
ACALL DELAY
INC R0
MOV A,R3
JB ACC.6,DISPB2
RL A
MOV R3,A
AJMP DISPB1
DISPB2:MOV R3,#01H
RET
SEGPT2:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;段码表
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
DB 00H,0D0H,09CH
DELAY:MOV R4,#0FFH
LOOP: DJNZ R4,LOOP
RET
2.
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar tab[]={0x0C0,0x0F9,0x0A4,0x0B0};
uchar tab2[]={0x0FE,0x0FD,0x0FB,0x0F7};
/*数码管显示代码*/
uchar show[]={0x0C0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,0x80,0x90,0x88,0x83,0x0C6,0x0A1,0x86,0x8E};
uchar wetime1,wetime2,nstime1,nstime2,state;
uint a,b,x,y,flag,counter,skey;
uchar keydata,disdata,keyd[4];
void delay(uint num)//延时程序
{
uint i;
for(i=0;i<num;i++){};
}
void timer() interrupt 1 //定时一秒
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
counter++;
if(counter==20){counter=0;flag=1;}
}
void dispkey() //扫描键盘的方法
{
uint i,sel;
uchar xb,yb;
sel=0;
for(i=0;i<4;i++)
{
P0=0x0FF;//消影,消除显示重影
P2=tab2[i];
P0=tab[i];
xb=P2;
yb=tab2[i];
keyd[i]=xb;
if(sel==0)
{
if(keyd[i]>>4!=0x0F)
{
keyd[i]+=yb<<4;
keydata=keyd[i];
while(keyd[i]>>4!=0x0F)
{
xb=P2;
keyd[i]=xb;
}
sel=1;
}
else
{
keyd[i]=0x88;
keydata=keyd[i];
}
}
}
delay(500);
}
void displaykeyvalue() //显示键值函数
{
int i=-1;
while(1)
{
dispkey();
if(keydata!=0x88)
{
i++;
switch(keydata)
{
case 0x0CE:tab[i%4]=show[0];break;
case 0x0BE:tab[i%4]=show[1];break;
case 0x9E:tab[i%4]=show[2];break;
case 0x5E:skey=1;return;//启动交通灯
case 0x0BD:tab[i%4]=show[3];break;
case 0x0AD:tab[i%4]=show[4];break;
case 0x8D:tab[i%4]=show[5];break;
case 0x4D:skey=2;return;//设定东西方向时间
case 0x9B:tab[i%4]=show[6];break;
case 0x8B:tab[i%4]=show[7];break;
case 0x6B:tab[i%4]=show[8];break;
case 0x2B:skey=3;return;//设定南北方向时间
case 0x57:tab[i%4]=show[9];break;
case 0x47:tab[i%4]=show[10];break;//时间加1
case 0x27:tab[i%4]=show[11];break;//时间减1
case 0x0E7:tab[i%4]=show[15];break;//返回键盘扫描
}
}
}
}
void settime()//设定交通灯时间函数
{
int wetime=wetime2,nstime=nstime1;
while(1)
{
dispkey();
if(skey==2)//设置南北方向红灯时间
{
if(keydata==0x47){nstime++;if(nstime>99)nstime=0;}
if(keydata==0x27){nstime--;if(nstime<0)nstime=0;}
a=nstime/10;
b=nstime%10;
tab[0]=show[a];
tab[1]=show[b];
nstime1=nstime;
wetime1=nstime-3;
}
if(skey==3)//设置东西方向红灯时间
{
if(keydata==0x47){wetime++;if(wetime>99)wetime=0;}
if(keydata==0x27){wetime--;if(wetime<0)wetime=0;}
a=wetime/10;
b=wetime%10;
tab[2]=show[a];
tab[3]=show[b];
wetime2=wetime;
nstime2=wetime-5;
}
if(keydata==0x5E){skey=1;return;}
}
}
void trafficlight()//交通灯函数
{
uint s=0,count=0,disnum1,disnum2;
if(skey==1)
while(1)
{
dispkey();
if(keydata==0x4D){skey=2;settime();}
if(keydata==0x2D){skey=3;settime();}
if(flag==1)
{
count++;
if(state==1)//状态1
{
P1=0x21;
disnum1=nstime1-count;
disnum2=wetime1-count;
}
if(state==2)//状态2
{
if(s==0){P1=0x11;s=1;}
else {P1=0x01;s=0;}
disnum1=4-count;
disnum2=4-count;
}
if(state==3)//状态3
{
P1=0x0C;
disnum1=nstime2-count;
disnum2=wetime2-count;
}
if(state==4)//状态4
{
if(s==0){P1=0x0A;s=1;}
else {P1=0x08;s=0;}
disnum1=6-count;
disnum2=6-count;
}
/******显示倒计时******/
a=disnum1/10;
b=disnum1%10;
x=disnum2/10;
y=disnum2%10;
tab[0]=show[a];
tab[1]=show[b];
tab[2]=show[x];
tab[3]=show[y];
/*******状态转换*******/
if(state==1&&disnum2==1)
{state=2;count=0;}
if(state==2&&disnum1==0)
{state=3;count=0;}
if(state==3&&disnum1==1)
{state=4;count=0;}
if(state==4&&disnum2==0)
{state=1;count=0;}
flag=0;
}
if(keydata==0x0E7)displaykeyvalue();
}
}
void main()//主函数
{
state=1;
TMOD=0x01;
ET0=1;
TR0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
P1=0x00;
nstime1=15;
wetime1=nstime1-3;
nstime2=20;
wetime2=25;
while(1)
{
displaykeyvalue();
trafficlight();
settime();
}
}
六、实验体会
在本次综合性,先用protues先设计好电路图,,又通过查找资料和翻阅单片机C程序书本,确定了本次实验所需的C程序。通过程序的编译和链接,最后进行仿真,便可以打达到实验的要求。本次实验我利用单片机AT89C51设计简单的计算机控制系统,掌握单片机AT89C51的P接口的功能和扩展芯片的使用,以及中断响应。控制七段数码管显示倒计时间。井然有序的循环转换地控制东西,南北的交通状况。当产生中断时,东西要强行转换成南北时,单片机经过处理对中断响应完成转换。
通过本次实验我更加了解了所用单片机的引脚以及功能;对单片机8255的扩展功能,以及按键的使用也有了更深刻的理解。虽然在实验的工程中难免有许多专业知识的不足,但是通过和老师要同学的交流还有网络的帮助,还是可以克服许多的困难,这让我明白了一个道理,团队合作真的是很重要的
单片机综合实验报告格式
(在所做过的实验内容里挑选一个自己最有收获,最有感想的实验内容) 综合实验报告标题(可与实验名称不同)
一、实验目的和要求。
二、实验仪器设备。
三、实验设计及调试:
(一)实验内容。
(二)实验电路:画出与实验内容有关的简单实验电路。
(三)实验设计及调试步骤:
(1)对实验内容和实验电路进行分析,理出完成实验的设计思路。(2)列出程序设计所需的特殊标志位、堆栈sp、内部ram、工作寄存器等资源的分配列表,分配列表时注意考虑资源在程序执行过程可能会出现冲突的问题。
(3)画出程序设计流程图,包括主程序和各子程序流程图。
(4)根据(2)、(3)的内容写出实验程序。
(5)调试程序(可以使用模拟仿真器)。
a、根据程序确定调试目的,即调试时所需观察的内容结果。
b、根据各调试目的分别选择调试所需的方法,如单步、断点等命令,分别列出各调试方法中所需要关注记录的内容。
c、调试程序,按各种调试方法记录相应的内容。
d、分析调试记录的内容和结果,找出程序中可能出错的地方,然后修改程序,继续调试、记录、分析,直到调试成功。
(四)实验调试过程中所遇到的问题、解决问题的思路和解决的方法。
四、实验后的经验教训总结。
通信与信息工程学院20xx20xx学年第二学期实验报告课程名称单片机原理及应用专业班级学号学生姓名指导教师日期20xx年4月15日…
单片机原理及应用实验报告姓名方恩山学号63120xx40110专业通信工程实验性质设计性班级20xx级1班指导教师许强实验项目名称…
目录一实验一1二实验二7三实验三11四实验四15实验一定时计数器验证实验一实验目的熟悉定时计数器T0的特点学会合理选择定时方式并能…
滨江学院微机原理与接口技术综合实验报告题目:简易电子琴设计学号:学生姓名:XXX院系:滨江学院专业:指导教师:二OXX年月日【摘要…
目录广西大学行健文理学院单片机应用综合实验报告题目基于STC89S52单片机开发板的功能设计与应用学部班级姓名学号指导教师撰写日期…
编号实验报告姓名学号实验班级实验时间实验报告总份片数12份片实验教师学院1实验一开发软件使用与调试方法一实验目的学习KEIL的使用…
成绩重庆邮电大学自动化学院综合实验报告题目51系列单片机闭环温度控制学生姓名蒋运和班级0841004学号20xx213316同组人…
微机原理与单片机接口技术实验报告册河南理工大学电气学院专业班级学号姓名1目录实验一流水灯实验3一实验目的3二实验实现的功能3三系统…
基于单片机的温度数据采集系统实验报告班级电技姓名田波平学号指导老师仲老师101班10120xx108题目基于单片机的温度数据采集系…
单片机实验报告报告人xxx学号20xx211812班号20xx211407指导老师姚燕20xx0615实验一仿真软件的使用以及跑马…