




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机原理及应用实验报告姓名:方恩山学号:631206040110专业:通信工程实验性质:设计性班级:2012级1班 指导教师:许强实验项目名称:万用交叉口交通灯控制器实验实验日期:16周-18周实验成绩:实验评定标准:1)实验报告是否按照规定格式A()B()C()2)实验内容及说明是否完整A()B()C()3)实验步骤及说明是否正确A()B()C()4)实验结果及分析是否合理A()B()C()实验目的通过仿真搭建和实物搭建相结合,万用交叉口交通灯控制器系统设计,并掌握C51编程操作。实验器材器材1.PC机一台2.Windows7OS3.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”→“NewProject”创建“trafficController”项目,并选择单片机型号为AT89C51。执行菜单命令“File”→“New”创建文件,输入源程序,保存为“trafficController.A51”。在“Project”栏的File项目管理窗口中右击文件组,选择“AddFilestoGroup‘SourceGroup1’”将源程序“trafficController.A51”添加到项目中。执行菜单命令“Project”→“OptionsforTarget‘Target1’”,在弹出的对话框中选择“Output”选项卡,选中“GreateHEXFile”。执行菜单命令“Project”→“BuildTarget”,编译源程序。如果编译成功,则在“OutputWindow”窗口中显示没有错误,并创建了“trafficController.HEX”文件。在proteus仿真平台上建立参考图系统,并将程序上载到虚拟芯片上运行。实验结果及分析仿真结果如下图1.东西方向通路,南北方向禁止通行2进行按钮切换时,交通切换到东西禁行,南北方向通行。3在进行道路转换的时候,黄灯亮起,有5s的间隔。实验代码1.ORG0000HLJMPMAINORG0030HMAIN:MOVDPTR,#7F00H;8155命令口地址MOVA,#03H;置8155PA、PB口为输出,PC口为输入MOVX@DPTR,AMOV7AH,#00MOV7BH,#01MOV7CH,#02MOV7DH,#03MOV7EH,#04MOV7FH,#05ML0:NOPLCALLDISPSJMPML0DISP:MOVR0,#7AH;置显示缓冲器指针初值MOVR3,#01H;置扫描模式初值DISPB1:MOVDPTR,#7F02H;8155PB口地址MOVA,#0h;熄灭所有LEDMOVX@DPTR,AMOVDPTR,#7F01H;8155PA口地址MOVA,@R0ADDA,#014HMOVCA,@A+PCMOVX@DPTR,AMOVA,R3MOVDPTR,#7F02HMOVX@DPTR,AACALLDELAYINCR0MOVA,R3JBACC.6,DISPB2RLAMOVR3,AAJMPDISPB1DISPB2:MOVR3,#01HRETSEGPT2:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H;段码表DB7FH,6FH,77H,7CH,39H,5EH,79H,71HDB00H,0D0H,09CHDELAY:MOVR4,#0FFHLOOP:DJNZR4,LOOPRET2.#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintuchartab[]={0x0C0,0x0F9,0x0A4,0x0B0};uchartab2[]={0x0FE,0x0FD,0x0FB,0x0F7};/*数码管显示代码*/ucharshow[]={0x0C0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,0x80,0x90,0x88,0x83,0x0C6,0x0A1,0x86,0x8E};ucharwetime1,wetime2,nstime1,nstime2,state;uinta,b,x,y,flag,counter,skey;ucharkeydata,disdata,keyd[4];voiddelay(uintnum)//延时程序{ uinti; for(i=0;i<num;i++){};}voidtimer()interrupt1//定时一秒{ TH0=(65536-50000)/256; TL0=(65536-50000)%256; counter++; if(counter==20){counter=0;flag=1;}}voiddispkey() //扫描键盘的方法{ uinti,sel; ucharxb,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);}voiddisplaykeyvalue()//显示键值函数{ inti=-1; while(1) { dispkey(); if(keydata!=0x88) { i++; switch(keydata) { case0x0CE:tab[i%4]=show[0];break; case0x0BE:tab[i%4]=show[1];break; case0x9E:tab[i%4]=show[2];break; case0x5E:skey=1;return;//启动交通灯 case0x0BD:tab[i%4]=show[3];break; case0x0AD:tab[i%4]=show[4];break; case0x8D:tab[i%4]=show[5];break; case0x4D:skey=2;return;//设定东西方向时间 case0x9B:tab[i%4]=show[6];break; case0x8B:tab[i%4]=show[7];break; case0x6B:tab[i%4]=show[8];break; case0x2B:skey=3;return;//设定南北方向时间 case0x57:tab[i%4]=show[9];break; case0x47:tab[i%4]=show[10];break;//时间加1 case0x27:tab[i%4]=show[11];break;//时间减1 case0x0E7:tab[i%4]=show[15];break;//返回键盘扫描 } } }}voidsettime()//设定交通灯时间函数{ intwetime=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;} }}voidtrafficlight()//交通灯函数{ uints=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)display
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论