开放性试验报告_单片机实验板制作与调试

开放性试验报告

单片机实验板制作与调试

  班    级:      电科10XX班     

  姓    名:        XXX            

  学    号:     20094836XXXX     

  指导教师:        徐晓光        
一、实验目的

(1)、学生根据所学课堂理论知识,深入理解本实验电路的工作原理;熟练使用示波器、万用表等实验仪器仪表;完成对实验电路的测量与调试工作。

(2)、学习单片机程序的C语言编写、编译和下载。要学习C语言程序的编写方法,软件与硬件配合,完成编程工作。

(3)、培养学生在电路板工作出现问题时,独立发现故障、解决问题的能力。

二、实验原理

Ø  产品特性:

高性能、低功耗的8位AVR微处理器

先进的RISC结构

l  130条指令_大多数指令执行时问为单个时钟周期

l  32个8位通用工作寄存器

l  全静态工作

l  工作于16 MHz时性能高达16 MIPS

l  只需两个时钟周期的硬件乘法器

非易失性程序和数据存储器

l  8K字节的系统内可编程Flash

      擦写寿命:10,000次

l  具有独立锁定位的可选BOOT代码区

   通过片上Boot程序实现系统内编程

   真正的同时读写操作

l  512字节的EEPROM

    擦写寿命:100,000次

l  1K字节的片内SRAM

l  可以对锁定位进行编程以实现用户程序的加密

Ø   外设特点

ü  – 两个具有独立预分频器8 位定时器/ 计数器, 其中之一有比较功能

ü  – 一个具有预分频器、比较功能和捕捉功能的16 位定时器/ 计数器

ü  – 具有独立振荡器的实时计数器RTC

ü  – 三通道PWM

ü  – TQFP与MLF 封装的8 路ADC

ü  8 路10 位ADC

ü  – PDIP封装的6 路ADC

ü  8 路10 位ADC

ü  – 面向字节的两线接口

ü  – 两个可编程的串行USART

ü  – 可工作于主机/ 从机模式的SPI 串行接口

ü  – 具有独立片内振荡器的可编程看门狗定时器

ü  – 片内模拟比较器

特殊的处理器特点

– 上电复位以及可编程的掉电检测

– 片内经过标定的RC 振荡器

– 片内/ 片外中断源

– 5种睡眠模式: 空闲模式、ADC 噪声抑制模式、省电模式、掉电模式及Standby 模式

Ø  I/O 和封装

l  – 23个可编程的I/O 口

l  – 28引脚PDIP 封装,32 引脚TQFP 封装,32 引脚MLF 封装

引脚配置

I/O 端口介绍

1、作为通用数字I/O使用时,所有AVR I/0端口都具有真正的读-修改-写功能。这意味着用SBI或CBI指令改变某些管脚的方向(或者是端口电平、禁止/使能上拉电阻)时不无意的改变其他管脚的方向(或者是端口电平、禁止/使能上拉电阻)。输出缓冲器具有对称的驻动能力,可以输出或吸收大电流、直接驱动LED。所有的端口引脚都具有与电压无关的上拉电阻。并有保护二极管与Vcc和地相连,如下图所示。

2、每个端口都有三个I/O 存储器地址:数据寄存器 – PORTx、 数据方向寄存器 – DDRx 和端口输入引脚– PINx。数据寄存器和数据方向寄存器为读/ 写寄存器,而端口输入引脚为只读寄存器。但是需要特别注意的是,对PINx 寄存器某一位写入逻辑"1“ 将造成数据寄存器相应位的数据发生"0“ 与“1“ 的交替变化。当寄存器SFIOR 的上拉禁止位PUD 置位时所有端口引脚的上拉电阻都被禁止。

3、作为通用数字I/O 时的端口,多数端口引脚是与第二功能复用的,如P 53“ 端口的第二功能”使能某些引脚的第二功能不会影响其他属于同一端口的引脚用于通用数字I/O 目的。

I/O引脚等效原理图

三、avr单片机试验板组装与焊接

该avr单片机试验板采用贴片工艺,大部分元件为贴片封装。

SMD贴片元件的特点:

(1)  元件体积小。(2)焊接时需要使用专用的工具。

SMD集成电路的手工焊接方法:

(1)将集成电路与PCB上的焊盘仔细对齐,焊住角上的一个引脚将集成电路固定。

(2)检查集成电路与PCB上焊盘的对准情况,如果存在偏差,则焊开该引脚、调整位置,直至集成电路的全部引脚都和PCB上焊盘完全对准。

(3)如果在出现集成电路焊错等情况下,需要从PCB上拆下集成电路,就应当使用热风台,将集成电路全部引脚同时加热后,用镊子小心地从PCB上取下集成电路。

(4)在集成电路全部引脚都和PCB上焊盘完全对准的条件下,使用防静电恒温尖头烙铁和细的焊锡丝,在放大镜配合下,逐一地对集成电路的引脚进行焊接。

(5)如果集成电路在焊接过程中出现相邻引脚焊接相连的情况,需要通过一定的操作把相连的引脚分离开。

(6)焊接的检查

四、原理图:

五、avr单片机试验板的调试

对此次avr单片机试验板的设计,能够利用mega8单片机的各种内部资源,配合外围电实现多种应用功能。除I/O应用之外,还包括ADC、串行通信等功能。所以avr单片机试验板上除贴片封装的mega8芯片外,还设计有I/O口的引出插座,RS232串行通信接口芯片,移位寄存器芯片等元件。熟练使用示波器、万用表等实验仪器仪表;完成对实验电路的测量与调试工作。测量内容包括电路工作点参数、各点工作波形等。当实测结果与理论预测值存在较大差异时,应当分析、查找故障,并采取措施加以解决。直到问题被发现、错误被改正,达到与理论预测相符的满意结果为止。

ü  调试工作还包括单片机程序的编写与调试:要求焊接制作的试验板在配合一块LED点阵板时,能够完成LED点阵板上汉字显示的任务。

在ICCAVR开发环境下

1、新建一个project

2、add *.c文件

3、编写*.c文件程序

 (部分程序)

void delay_y(void)
{
asm("nop");asm("nop");asm("nop");
}
void delay(unsignedint z)
{
unsignedint i;
  for(i=z;i>0;i--)
  ;
}
void delay1(unsignedint z)
{
unsignedint i,j;
for(i=z;i>0;i--){for(j=1000;j>0;j--);}
}
void delay2(unsignedint z)
{
unsignedint i,j,k;
for(i=z;i>0;i--){for(j=1000;j>0;j--)for(k=1000;k>0;k--);}
}
unsignedint data(unsignedint z)
{
unsignedint ijk;
ijk=0x00;
if ((z&0x01)==0x01) ijk|=0x80;//0000,0001
if ((z&0x02)==0x02) ijk|=0x40;//0000,0010
if ((z&0x04)==0x04) ijk|=0x20;//0000,0100
if ((z&0x08)==0x08) ijk|=0x10;//0000,1000
if ((z&0x10)==0x10) ijk|=0x08;//0001,0000
if ((z&0x20)==0x20) ijk|=0x04;//0010,0000
if ((z&0x40)==0x40) ijk|=0x02;//0100,0000
if ((z&0x80)==0x80) ijk|=0x01;//1000,0000
return ijk;
}

(主程序部分)

void main(void)
{
DDRB = 0xFF;
DDRC = 0xFF;//1111,1111
DDRD = 0xFF;//1111,1111
Init_time();
/*
*/
//N=0;//0011,0001
 while(1)
   {
if(N==0)display(x1);
if(N==1) display(x2);
if(N==2) display(x3);
if(N==3) display(x4);
if(N==4) display(x5);
if(N==5) display(x6);
if(N==6) display(x7);
  }
}

4、make projrct生成*.hex文件

将单片机程序(即:生成的*.hex文件)下载到试验板上,进行整机功能调试。直至电路板在软硬件配合下,完成设计的工作任务为止。

注意:在电路调试中特别应当注意以下几点:

①电路板的焊接质量要有保证。

②单片机程序的C语言编写、编译和下载。要学习C语言程序的编写方法,注意软件与硬件配合,完成编程工作。

③要在电路板工作出现问题时,如何独立发现故障、解决问题。

六、实验心得:

单片机开放性实验给人印象最深的就是smd贴片元件的焊接,这个过程需要特别细心,大大提高了我的动手能力,单片机试验板很多元件都是贴片焊接,所以很大部分时间都需要小心的焊接,这对我的动手努力有很大的帮助。另外,实验过程中出现的种种问题都让我一点点的加深了对avr单片机内容的熟悉程度,积累了有关单片机的知识。

七、参考资料

(1)童诗白 模拟电子技术,高等教育出版社,2003。

(2)徐晓光 数字逻辑与数字电路,机械工业出版社,2008。

(3)沈文 avr单片机C语言开发入门指导,清华大学出版社,2003

(4)avr mega8单片机数据手册

(5)谭浩强 C程序设计,清华大学出版社,2010

 

第二篇:单片机实验2实验报告

实验二 交通灯程序设计

谢鑫  20100740123

一  实验题目

交通灯控制系统设计

二   实验目的

1、学会用8051单片机开发简单的计算机控制系统;

2、学会用汇编语言和C语言开发系统软件;

3、学会8051单片机开发环境wave或Keil uVision3软件的使用;

4、学会Proteus软件的使用方法,会用Proteus单片机系统进行仿真;

5、学会Protel软件的使用方法,会用Protel绘制电气原理图和印制板图;

6、熟悉七位数码管显示的使用方法;

7、了解交通灯控制系统的基本组成。

三   实验要求

交通灯处在十字路口上。它有红﹑黄﹑绿三种颜色的灯组成。红灯亮时道路上的车辆停止运行;黄灯是一种过渡用的信号灯,当它亮时,表示道路上的红绿色信号灯即将进行转换。下面拿东西南北四个方向来说明。当东西方向允许行车(或者左转)的时候,南北方向就禁止行车,即此时东西方向的绿灯亮红灯灭,而南北方向的绿灯灭红灯亮。反之当南北方向允许行车(或者左转)的时候,东西方向就禁止行车,即此时南北方向的绿灯亮红灯灭,而东西方向的绿灯灭红灯亮。交通灯配置示意图如图1所示。同时当有特殊的情况发生时,能手动控制各个方向的信号灯。设计任务就是将这一电路用单片机来实现具体的控制。

图1  十字路口交通灯配置示意图

设计内容与原理

为了在后面的分析中便于说明,将南北方向允许直行命名为状态1,南北方向允许左转命名为状态2,南北方向行车到东西方向行车的转换阶段命名为状态3,将东西方向允许直行命名为状态4,东西方向允许左转命名为状态5,东西方向行车到南北方向方向行车的转换阶段命名为状态6。

假定直行绿灯点亮的时间为25s,左转绿灯点亮的时间为20s,黄灯点亮的时间为5s,则对方红灯的点亮时间为50秒。黄灯每隔500ms亮一次,之后灭500ms(亮灭一次叫作闪烁一次),一共闪烁5次,持续5s。各个状态之间的变换情况如下:

文本框: 状态1   状态2   状态3   状态4   状态5   状态6   状态1

具体显示周期如下:

图2交通信号灯点亮时间图

设计电路中每个路口的控制信号灯应有四个,即绿灯两个、黄灯、红灯各一个,同时需要七段数码管一个。因此,本电路的设计中应用到绿灯八个,黄灯四个,红灯四个,七段数码管两个(东西方向相同,南北方向相同,为节省空间可省略一对)。

五 电路设计分析

根据前面的设计内容与原理分析,电路设计中应有控制模块(单片机电路)、显示模块(十六个信号灯和两个七段数码管)本电路的设计,将发光二极管作为16个信号灯的材料。电源将采用5V的直流电源。东西两个方向的绿灯是同时亮的,为了简化电路可以让这两个灯接同一个引脚。同理,东西方向的黄灯、红灯也可以分别接同一个引脚。南北方向同上。这样我们可以用一个8位口控制16盏信号灯。

各信号灯均是共阴极接法,LED负极均接地,正极通过保护电阻接单片机P1口。这样单片机引脚的输出一个高电平时,相应的信号灯就被点亮。七段数码管经过8位排阻RESPACK-8连接。

单片机中应包括复位电路和晶振电路。本设计中,采用上电复位形式,由于本系统应用的机器周期为lms,所以晶振选择为12MHz,根据调试电容选择30pF.

图3:复位电路

图4:晶振电路

六 硬件原理图

程序流程

本程序的程序流程图如图所示

心得体会

    这次系统实验历时一个月的时间,在这实验过程里我们巩固了从编程、软件使用到调试的专业知识,逻辑思维和动手能力都得到了很大的提高。

   要解决的主要问题就是程序的设计和仿真,虽然初期在设计和布局、编程时思路比较清晰,但是到了细节处,也出了不少问题,而且很难被检查出来,如在定时器使用方面出了一些错误。但是最后经过不断努力,还是写出来正确的代码。

   通过这次系统实验,对以前学过的知识进行了巩固,加深了理解,提高了应用的能力,而且提高了我们的发现、分析、解决问题的能力,同时提高了对专业的认识及兴趣,对于我们工科生来说,对以后就业很有帮助。

附录  程序代码:

#define    uchar  unsigned char

#define    uint   unsigned int

#include   <reg52.h>

/*****定义控制位**********************/

sbit   EW_LED2=P2^3; //东西数码管个位

sbit   EW_LED1=P2^2; //东西数码管十位

sbit   SN_LED2=P2^1; //南北数码管个位

sbit   SN_LED1=P2^0; //南北数码管十位_

sbit    SN_Yellow=P1^6;//南北黄灯

sbit    EW_Yellow=P1^2;//东西黄灯

sbit    EW_Red=P1^3;//东西红灯

sbit    SN_Red=P1^7;//南北红灯

sbit       Busy_Btton=P3^4;

bit     Flag_SN_Yellow; //南北黄灯标志位

bit     Flag_EW_Yellow;//东西黄灯标志位

char   Time_EW;//东西方向倒计时单元

char   Time_SN;//南北方向倒计时单元

uchar EW=50,SN=25,EWL=20,SNL=20; //程序初始化赋值

uchar EW1=50,SN1=25,EWL1=20,SNL1=20;//用于存放修改值的变量1-9段选码

uchar

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

uchar code S[8]={0X28,0X48,0X18,0X48,0X82,0X84,0X81,0X84};//交通信号灯控制代码

/**********************延时子程序************************/

void   Delay(uchar   a)

    {

        uchar  i;

        i=a;

        while(i--){;}

    }

/*****************显示子函数**************************/

void   Display(void)

    {

        char h,l;

        h=Time_EW/10;

        l=Time_EW%10;

        P0=table[l];

        EW_LED2=1;

        Delay(200);

        EW_LED2=0;

        P0=table[h];

        EW_LED1=1;

        Delay(200);

        EW_LED1=0;

        h=Time_SN/10;

        l=Time_SN%10;

        P0=table[l];

        SN_LED2=1;

        Delay(200);

        SN_LED2=0;

        P0=table[h];

        SN_LED1=1;

        Delay(200);

        SN_LED1=0;

       

}

/**********************T0中断服务程序*******************/

    void timer0(void)interrupt 1 using 1

{

    static uchar count;

    TH0=(65536-50000)/256;

    TL0=(65536-50000)%256;

    count++;

   

    if(count==10)

    {

      if(Flag_SN_Yellow==1) //南北黄灯标志位

      {SN_Yellow=~SN_Yellow;}

      if(Flag_EW_Yellow==1)  //东西黄灯标志位

      {EW_Yellow=~EW_Yellow;}

    }

    if(count==20)

    {

    Time_EW--;

    Time_SN--;

    if(Flag_SN_Yellow==1)//南北黄灯标志位

    {   Time_SN=Time_EW;

        {

        SN_Yellow=~SN_Yellow;}

            }

    if(Flag_EW_Yellow==1)//东西黄灯标志位

    {   Time_EW=Time_SN;

        {

        EW_Yellow=~EW_Yellow;

}

        }

    count=0;

    }

   

}

void   main(void)

{

    IT0=1; //INT0负跳变触发

    TMOD=0x01;//定时器工作于方式1

    TH0=(65536-50000)/256;//定时器赋初值

    TL0=(65536-50000)%256;

    EA=1; //开中断总允许

    ET0=1;//开定时中断

    EX0=1;//开外部INTO中断

    TR0=1;//启动定时

     while(1)

{               /*******状态1**********/

                Flag_EW_Yellow=0;     //EW关黄灯显示信号

                Time_EW=EW;  

                Time_SN=SN;      

                while(Time_SN>0)

                {P1=S[0]; //SN通行,EW红灯

                 Display();}

           

                /*******状态2**********/

                Flag_SN_Yellow=0; //SN关黄灯显示信号

                Time_SN=SNL;

                while(Time_SN>0)

                {P1=S[2];//SN左拐绿灯亮,EW红灯

                 Display();}

              /*******状态3**********/

                P1=0x00;

                while(Time_EW>0)

               {Flag_SN_Yellow=1;    //SN开黄灯信号位

              

                EW_Red=1;      //SN黄灯亮,等待停止信号,EW红灯

                 //SN_LED1=EW_LED1;

                  //SN_LED2=EW_LED2;

               Display();

                }

               /***********赋值**********/

                EW=EW1;

               SN=SN1;

                EWL=EWL1;

                SNL=SNL1;

            /*******状态4**********/

                Flag_SN_Yellow=0;  //SN关黄灯显示信号

                Time_EW=SN;

                Time_SN=EW;

                while(Time_EW>0)

                {P1=S[4]; //EW通行,SN红灯

                 Display();}

               

                /*******状态5**********/

                Flag_EW_Yellow=0;     //EW关黄灯显示信号

                Time_EW=EWL;

                while(Time_EW>0)

                {P1=S[6];//EW左拐绿灯亮,SN红灯

                 Display();}

                /*******状态6**********/

                P1=0X00;

                while(Time_SN>0)

               {Flag_EW_Yellow=1; //EN开黄灯信号位

                SN_Red=1;//EW黄灯亮,等待停止信号,SN红灯  

                Display();}

           

                /***********赋值**********/

                EW=EW1;

                SN=SN1;

                EWL=EWL1;

                SNL=SNL1;

            }

    }

相关推荐