单片机实验报告综合

单片机原理及应用

实验报告

姓    名:         方恩山               

 学    号:     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、分析调试记录的内容和结果,找出程序中可能出错的地方,然后修改程序,继续调试、记录、分析,直到调试成功。

(四)实验调试过程中所遇到的问题、解决问题的思路和解决的方法。

四、实验后的经验教训总结。

相关推荐