北邮小学期AVR单片机模拟电梯系统实验报告 - 副本

时间:2024.3.31

小学期单片机实验报告

姓名:

班级:

学号: 

班内序号:

时间:

基于AVR单片机的模拟电梯系统制作

目录

基于AVR单片机的模拟电梯系统制作................................................................................ 2

1.简介.............................................................................................................................. 3

1.1课题名称.............................................................................................................. 3

1.2摘要..................................................................................................................... 3

2.前期准备....................................................................................................................... 3

2.1流水灯................................................................................................................. 3

2.1.1 功能.......................................................................................................... 3

2.1.2 程序代码................................................................................................... 3

2.2蜂鸣器/按键蜂鸣器.............................................................................................. 4

2.2.1 功能.......................................................................................................... 4

2.2.2 程序代码................................................................................................... 4

2.3 秒表计时器......................................................................................................... 6

2.3.1 功能.......................................................................................................... 6

2.3.2 程序代码................................................................................................... 6

2.4流水灯与60秒秒表计时器.................................................................................... 8

2.4.1 功能.......................................................................................................... 8

2.4.2 程序代码................................................................................................... 8

3.设计过程..................................................................................................................... 11

3.1设计流程............................................................................................................ 11

3.2 实验元器件....................................................................................................... 11

3.3实验程序主要流程图.......................................................................................... 12

3.4实验原理及原理图.............................................................................................. 13

3.4.1实验原理.................................................................................................. 13

3.4.2 原理图..................................................................................................... 13

3.4.3各模块的设计与详解:............................................................................. 13

4.程序源代码及程序分析................................................................................................ 15

5.实验结果..................................................................................................................... 22

5.1  操作过程......................................................................................................... 22

6.排错过程..................................................................................................................... 24

7.心得体会..................................................................................................................... 25

8.参考文献..................................................................................................................... 26

9.意见与建议.................................................................................................................. 26

1.简介

1.1课题名称

基于AVR单片机的模拟电梯系统

1.2摘要

本实验设计制作一个基于单片机Atmega16的模拟电梯系统。此单片机模拟电梯用红色和绿色发光二极管分别来指示电梯当前是处于上升状态还是下降状态,用数码管显示当前是处于哪一层,能够通过键盘控制实现电梯的上下运行来到达指定楼层,此外,在出现意外情况时可以通过按键实现电梯的紧急停止及恢复运行。

键词:单片机,键盘扫描,按键检测,电机的正反转,数码管显示,蜂鸣器,模拟电梯

2.前期准备

在之前的学习中我们从未学习单片机,所以在确定选题前需要一定的学习和练习。我们小组一共练习了3个工程:流水灯、按键蜂鸣器和秒表计时器,学会了使用AVR studio工作环境和WINAVR(GCC)编译器,并在板子上写入程序。学会了I/O端口初始化、输入输出操作,通过端口控制LED序列、8段数码管、蜂鸣器,中断和定时的使用。

2.1流水灯

 2.1.1 功能

             学会I/O端口的初始化及通过端口控制LED,使得LED呈现流水灯效果,我们小组用的PB端口作为控制LED的端口,并且由于人眼频率和单片机频率的关系加了延迟函数,使得流水灯每个状态保持1s

2.1.2 程序代码

#include <avr/io.h>

int main(void)

{

    char temp;          //用来存储当前A端口的输出

    unsigned int i,k;   //循环变量

    DDRA=0xff;          //将A端口设为输出

    PORTA=0b00000001;   //初始化A端口,从接入PA0的LED灯亮

    while(1)           

    {

       temp = PORTA;

       PORTA=PORTA<<1;

       if(temp&0b10000000)       //若接入7的LED灯亮

       {

           PORTA=PORTA | 0b00000001;//则点亮接入PA0的LED灯

       }//即实现流水灯循环

       for(i=0;i<50;i++)        //延时,约1秒钟

       {

           for(k=0;k<1000;k++);

       }

    }

}

2.2蜂鸣器/按键蜂鸣器

  2.2.1 功能

        按键蜂鸣器主要为了了解按键的使用,并且学会中断的应用

  2.2.2 程序代码

蜂鸣器: 

#include <avr/io.h>

int main(void)

{  

    unsigned int i,k; 

    DDRB|=(1<<3);      //对B端口的设置,使得PD3设置为输出

    PORTB &=~(1<<3);   //初始时蜂鸣器不响

    while(1)

    {

       PORTB ^=(1<<3);    //设置蜂鸣器每隔约一秒响一次

   

       for(i=0;i<50;i++)

       {

           for(k=0;k<1000;k++);

       }

    }

}

按键蜂鸣器:

#include<avr/io.h>

int main(void)

{

    DDRA &=~(1<<6);      //按钮6的设置

    PORTA |=(1<<6);

    DDRA &=~(1<<7);      //按钮7的设置

    PORTA |=(1<<7);

    DDRA &=~(1<<2);      //按钮2的设置

    PORTA |=(1<<2);

    DDRA &=~(1<<3);      //按钮3的设置

    PORTA |=(1<<3);

    DDRB |=(1<<3);       //蜂鸣器输出

    PORTB &=~(1<<3);

    DDRD =0xff;          //灯的输出

    while(1)

    {

       switch(PINA &0b11001100)

       {

           case 0b11001100:         //K1被按下

           {

              PORTD|=(1<<0);       //LED0发光

              break;

           }

           case 0b11000000:         //K2被按下

           {

              PORTD|=(1<<1);       //LED1发光

              break;

           }

           case 0b10001000:         //K3被按下

           {

              PORTD|=(1<<2);       //LED2发光

              break;

           }

           case 0b01001000:         //K4被按下

           {

              PORTB |=(1<<3);      //蜂鸣器鸣响

              break;

           }

           default:

           {

              PORTB &=~(1<<3);     //关蜂鸣器

              PORTD=0;             //关灯

              break;

           }

       }

    }

}

2.3 秒表计时器

  2.3.1 功能

        利用两位数码管,实现秒表计时的功能

  2.3.2 程序代码

#include <avr/io.h>

#include <avr/interrupt.h>

int table[]=                    //显示0—9的数组

{

    0x3f,

0x06,

0x5b,

0x4f,

0x66,

0x6d,

0x7d,

0x07,

0x7f,

0x6f};

int main(void)

{

    DDRA=0xff;

    DDRB=0xff;

    DDRD=0b11110111;

    PORTA=0b00000001;

    PORTD=(1<<3);               //设置中断

    PORTB=0b00001000;

    MCUCR|=(1 << ISC11);        //设置INT1下降沿触发中断

    GICR|=(1 << INT1);

    sei();

    unsigned int i,j,k,x,y;

    unsigned char temp;

    TCCR0|=(1<<CS01);

    while(1)

    {

       for(i=0;i<60;i++)

       {

           x=i/10,y=i%10;           //x为十位数,y为个位数

           PORTD=table[x];          //接入PD口的数码管显示十位数

           PORTB=table[y];          //接入PB口的数码管显示个位数

           temp=PORTA;              //流水灯的显示       

           PORTA=PORTA << 1;

           if(temp & (1<<7))

           {

              PORTA|=1;

           }

           TCNT0=55;

          

           for(k=0;k<3;k++)         //延时

           for(j=0;j<10000;j++)

           {

              while(!(TIFR & (1<<TOV0)));

              TCNT0=55;

           }

       }

    }

}

SIGNAL(SIG_INTERRUPT1)          //中断程序

{   int m=0;

    while(1)

    {      if(PIND & (1<<2))

       {   delay(10);

           while(1)

           {

m ++;

if(!(PIND & (1<<2)))

{

m ++;

break;

}

}

       }

        delay(500);

       if(m==2)

       {

           delay(100);

           break;

}

         

    }

   

2.4流水灯与60秒秒表计时器

 2.4.1 功能

             学会I/O端口的初始化及通过端口控制LED,使得LED呈现流水灯效果,此外,利用两个数码管,实现60秒秒表计时功能,可随时停止。

2.4.2 程序代码

#include <avr/io.h>

#include <avr/interrupt.h>

int main(void)

{

    char TEMP;

       DDRB=0xff;                                     //将B端口设为输出

   PORTB=0b11001100;                       //初始化B端口,最开始第一个灯亮

    while(1)                                          //主循环

       {

       TEMP=PORTB;

       PORTB=PORTB<<1;

       if(TEMP&0b10000000)

       {

       PORTB=PORTB|0b00000001;

       }

       for(i=0;i<100;i++)

           {

           for(j=0;j<1000;j++);

              }

       }

}

int main(void)

{

       char num[10]=                               

{                                 

    0b00111111,             //0

       0b00000110,              //1

       0b01011011,              //2

       0b01001111,              //3

       0b01100110,              //4

       0b01101101,              //5

       0b01111101,              //6

       0b00000111,              //7

       0b01111111,              //8

       0b01101111,              //9

};

       char shuma[10]=

       {

              0b10111111,

              0b10000110,

              0b01011111,

              0b11001111,

              0b11100110,

              0b11101111,

              0b11111101,

              0b10000111,

              0b11111111,

              0b11101111,

       };

          unsigned int a = 0,tag = 0;

          char temp;

          unsigned int i,j;

          DDRA=0xff;

              PORTA=0b10001100;

           DDRC&=~(1<<7);

           PORTC |=(1<<7);

     

          DDRB|=(1<<7);

          DDRD|=(1<<7)|(0<<2);

          PORTC &=~(1<<6);                                  //关数码管

       TCNT0 = 55;

          TCCR0 |= (1 << CS01);                                   //八分频

       DDRB=0xff;  //DDRD=0xff;

       DDRA|=0xf0;

      TCNT0=55;

          PORTD |= (1<<2);

MCUCR |= (1 << ISC01) | (0 << ISC00);

GICR |= (1 << INT0);

sei();

   while(1)

   {     

       /*    if(PINC&(1<<7))                                          //按键没被按下

                 {

                   if(a == 9)

                     {

                            tag = (tag + 1)%6;

                     }

                     a = (a+1)%10;

                     PORTD = num[a];

                     PORTB = num[tag];

                 }

                 Else                                                          //按键按下

                 {

                          PORTD = PORTD;                                   //保持原状态

                     PORTB = PORTB;

                 }

                               }*/

                 PORTA = 0b11000000;

              temp=PORTA;

              PORTA=PORTA<<1;

              if(temp&0b10000000)             //使最后一个等亮起后,又从第一个亮起

              {

                     PORTA=PORTA|0b00000001;

              }

                 for(i = 0;i <50000;i ++)

                     {

                            while(!(TIFR &(1 << TOV0)));

                            TCNT0=55;

                     }

       }

}

SIGNAL (SIG_INTERRUPT0)                           //中断程序

{

       PORTA = 0xff;

       for (int p = 0 ; p<10000 ; p++)

       PORTD |= (1<<2);

while(!(~(PORTD | 0b11111011)))

{  

}

}

3.设计过程

3.1设计流程

(1)了解AVR单片机原理及编程规则.

(2) 编写代码,然后接好电路,下载到单片机测试

(3) 所有部分完成后,进行整体测试,有错的话继续整改,无错直接下载测试

   

3.2 实验元器件

Atmeal16单片机 1块

JTAG下载器    1个

4X4矩阵键盘    1块

电机           1个

蜂鸣器         1个

数码显示管     1个

导线            若干

3.3实验程序主要流程图

 

运行结果及组员分工:

申宇飞:主要负责模拟电梯系统程序的编写

徐萌扬:主要负责硬件的连接和实物的制作

3.4实验原理及原理图

3.4.1实验原理

单片机识别按键按下的是哪个键,随之进行判断,如果需要进行移动,则驱动电机,在到达指定的楼层后停止,期间可以不断扫描输入,不断更新路线,被按下楼层有指示灯显示,到达该楼层后灯灭掉,蜂鸣器响一下。在电梯运动同时到达相应楼层时,数码管显示当前楼层,用红色和绿色发光二极管组成的箭头来指示电梯当前是处于上升状态还是下降状态。此外,如果按下按键,还可以实现电梯的紧急停止和恢复启动。

 3.4.2 原理图

3.4.3各模块的设计与详解:

3.4.3.1中央处理器MCU

        

                        中央处理器

    中央处理器用的是ATMega16,如图所示。

PA0~PA7用于连接键盘输入,PC0驱动蜂鸣器,PC1和PC7口设置为电机接入端口,PB0~PB7用于连接数码管显示器,PD2设置为中断按键,PD3~PD7为LED灯阵。

当PC1输出高电平PC7输出低电平时,电动机逆时针旋转;反之,电动机顺时针旋转。由此实现电梯上下行功能。

3.4.3.2 4x4键盘

                           图3

键盘与接PB口连接,见图3。

   键盘的工作原理: 按键设置在行、列线交点上,行、列线分别连接到按键开关的两端。行线通过上拉电阻接到+5V 电源上。无按键按下时,行线处于高电平的状态, 而当有按键按下时, 行线电平与此行线相连的列 线电平决定。将行列线值组合后即得到一个两位为0六位为1的八位二进制数。由此八位二进制数即可确定按键并设置相应数值。

4.程序源代码及程序分析

5.#include <avr/io.h>

#include <avr/interrupt.h>

#include <avr/signal.h>

#include <util/delay.h>

#define  uchar unsigned char

#define  uint  unsigned int

int w_counter = 0,d_counter = 0;   //计数按键次数

int direction ;  //  标志上下坡

int floor_now =1;  //当前楼层号

int floor_go =0;   //紧接着要去的楼层号

int floor_wait[6]={0,0,0,0,0,0};  //有人等着的楼层号

int floor_des[6]={0,0,0,0,0,0};  //目的楼层号

uchar key,key_temp;  //键盘输入;存key以判断输入

char data[10]=

{

   0b00111111,//0

   0b00000110,//1

   0b01011011,//2

   0b01001111,//3

   0b01100110,//4

   0b01101101,//5

   0b01111101,//6

   0b00000111,//7

   0b01111111,//8

   0b01101111,//9 

};

void alarm();               //蜂鸣器控制函数

void light(int direction);                //上下行亮灯函数

void keyscan()                              //4*4键盘的扫描

{

          uchar cord_h,cord_l,cord;

          DDRB=0x0f;

          PORTB=0xf0;            //行线输出全为0

          delay(1);

          cord_h = PINB & 0xf0;      //读入行线值

          if(cord_h!=0xf0)       //先检测有无按键按下

          {

             //delay(10);         //去抖

                   if(cord_h!=0xf0)

           {

                   DDRB = 0xf0;

                   PORTB = 0x0f;  //输出当前列线值

                   delay(1);

             cord_l = PINB & 0x0f;  //读入列线值

                   cord = cord_l | cord_h;//键盘最后组合码值

                   switch(cord)

                   {

                            case 0b11101110:floor_wait[1] = 1;PORTD |= 0b00000001;break;//1 外部

                            case 0b11011110:floor_wait[2] = 2;PORTD |= 0b00000010;break;//2

                            case 0b10111110:floor_wait[3] = 3;PORTD |= 0b00000100;break;//3

                            case 0b01111110:floor_wait[4] = 4;PORTD |= 0b00001000;break;//4

                            case 0b11101101:floor_wait[5] = 5;PORTD |= 0b00010000;break;//5

                            case 0b11011101:floor_wait[0] = 6;PORTD |= 0b00100000;break;//6

                            case 0b10111011:floor_des[1] = 1;PORTD |= 0b00000001;break;//1 内部

                            case 0b01111011:floor_des[2] = 2;PORTD |= 0b00000010;break;//2

                            case 0b11100111:floor_des[3] = 3;PORTD |= 0b00000100;break;//3

                            case 0b11010111:floor_des[4] = 4;PORTD |= 0b00001000;break;//4

                            case 0b10110111:floor_des[5] = 5;PORTD |= 0b00010000;break;//5

                            case 0b01110111:floor_des[0] = 6;PORTD |= 0b00100000;break;//6             

                            default: break;//键盘对应的楼层号的设置,记录等待楼层号

                   }

            }

           }

}

void delay(int ms)                       //延时函数     

{

    int i,j;

         for(i=0;i<ms;i++)

         {

                 for(j=0;j<111;j++);

     }

}

void toNext(int fn,int fg)   //去往下一次

{

         int dis = fn - fg;

         //floor_now = fg;

         PORTA = data[floor_now];

         if((dis == 0)||(fg == 0))       

         {

                   PORTD &= 0b00111111;

                   delay(500);

         }

         else if(dis > 0)               //去的楼在当前楼的下面

         {

                   direction = 0;

                   downstair(dis);

         }

         else if(dis < 0)  //去的楼在当前楼的上面

         {

                   direction = 1;

                   upstair(-dis);

         }

}

void upstair(int dis)   //上楼

{

         light(2);

         int div = abs(dis);

         light(direction);

         while(div>0)

         {

                   clean(floor_now,floor_wait,floor_des);

                   for(int k=0;k<6;k++)

                   {

                            if((floor_des[k] != 0) || (floor_wait[k] != 0))

                            {

                                     if(k == 0){PORTD |=0b00100000;}

                                     else{PORTD |= (1<<(k -1));}

                            }

                            else

                            {

                                     if(k == 0){PORTD &= 0b11011111;}

                                     else{PORTD &= ~(1<<(k -1));   }

                            }

                   }

                   PORTD |= 0b10000000;

                   PORTD &= 0b10111111;

                   for(int i=0;i<1500;i++)

                   {

                            keyscan();

                            while(1)

                            {

                                     if(!(PINC & 0b00000010))  //按下

                                     {

                                               while(!(PINC & 0b00000010))

                                               {

                                                        PORTD &= 0b00111111;

                                                        alarm();

                                               }

                                               PORTD &= 0b10111111;

                                               PORTD |= 0b10000000;

                                               break;

                                     }

                                     else{PORTD &= 0b10111111;PORTD |= 0b10000000;break;}

                                     //if(PINC & 0b00000010)

                                     //{PORTD &= 0b00111111;break;}

                            }

                   }

                   div--;

                   floor_now++;

                   PORTA = data[floor_now];

                   //clean(floor_now,floor_wait,floor_des);

                   if((floor_wait[floor_now] != 0)||(floor_des[floor_now] != 0))

                   {

                            PORTD &= 0b00111111;

                            alarm();

                            delay(500);

                            clean(floor_now,floor_wait,floor_des);

                   }

                   clean(floor_now,floor_wait,floor_des);

         }

}

                  

void downstair(int dis)   //下楼

{

         light(2);

         int div = abs(dis);

         light(direction);

         while(div>0)

         {

                   clean(floor_now,floor_wait,floor_des);

                   for(int k=0;k<6;k++)

                   {

                            if((floor_des[k] != 0) || (floor_wait[k] != 0))

                            {

                                     if(k == 0){PORTD |=0b00100000;}

                                     else{PORTD |= (1<<(k -1));}

                            }

                            else

                            {

                                     if(k == 0){PORTD &= 0b11011111;}

                                     else{PORTD &= ~(1<<(k -1));   }

                            }

                   }

                   PORTD |= 0b01000000;

                   PORTD &= 0b01111111;

                   for(int i=0;i<1500;i++)

                   {

                            PORTD &= 0b01111111;

                            keyscan();

                            while(1)

                            {

                                     if(!(PINC & 0b00000010))  //按下

                                     {

                                               while(!(PINC & 0b00000010))

                                               {

                                                        PORTD &= 0b00111111;

                                                        alarm();

                                               }

                                               PORTD &= 0b01111111;

                                               PORTD |= 0b01000000;

                                               break;

                                     }

                                     else{PORTD &= 0b01111111;PORTD |= 0b01000000;break;}

                                     //if(PINC & 0b00000010)

                                     //{PORTD &= 0b00111111;break;}

                            }

    

                   }

                   div--;

                   floor_now--;

                   PORTA = data[floor_now];

                   //clean(floor_now,floor_wait,floor_des);

                   if((floor_wait[floor_now] != 0)||(floor_des[floor_now] != 0))

                   {

                            PORTD &= 0b00111111;

                            alarm();

                            delay(500);

                            clean(floor_now,floor_wait,floor_des);

                   }

                   clean(floor_now,floor_wait,floor_des);

         }

}

int compare(int fn,int fw[],int fd)  //求最短距离,给floor_go

{

         for(int i=0;i<6;i++)

         {

                   if(fw[i] != 0)

                   {

                            if(fd == 0)

                            {

                                     return fw[i];

                            }

                            else if(((fw[i] > fd) && (fw[i] < fn)) || ((fw[i] < fd) && (fw[i] > fn)))

                            {

                                     return fw[i];

                            }

                            else

                            {

                                     return fd;

                            }

                   }

         }

         return fd;

}

void clean(int fn,int fw[],int fd[])   //楼层到达后,消去等待

{

         for(int i= 0;i<=5;i++)

         {

                   if(fn == fw[i])

                   {fw[i] = 0;}

                   if(fn == fd[i])

                   {fd[i] = 0;}

         }

}

        

int main(void)

{

         while(1)

         {

                   DDRA = 0xff;

                  DDRD = 0b11111111;

                   PORTA = data[floor_now];

                   //PORTD = 0b00000000;

                   DDRC = 0b11111111;

                PORTC = 0b00111110;

                   keyscan();

                   clean(floor_now,floor_wait,floor_des);

                   for(int k=0;k<6;k++)

                   {

                            if((floor_des[k] != 0) || (floor_wait[k] != 0))

                            {

                                      if(k == 0){PORTD |=0b00100000;}

                                     else{PORTD |= (1<<(k -1));}

                            }

                            else

                            {

                                     if(k == 0){PORTD &= 0b11011111;}

                                     else{PORTD &= ~(1<<(k -1));   }

                            }

                   }

                           

                   for(int i=0;i<=5;i++)  

                   {

                            for(int j=0;j<6;j++)

                            {                             

                                     while((floor_des[i] != 0) || (floor_wait[j] != 0))

                                     {

                                               clean(floor_now,floor_wait,floor_des);

                                               floor_go = compare(floor_now,floor_wait,floor_des[i]);        

                                               toNext(floor_now,floor_go);  

                                               clean(floor_now,floor_wait,floor_des);

                                       }

                              }

                   }

                                    

         }

}

void alarm()             //蜂鸣器控制函数

{

         PORTC |= (1 << 0);

         _delay_ms(50);

         PORTC &= ~(1 << 0);

}

void light(direction)

{

         if(direction == 0)

         {

                   PORTC |= (1 << 6);

         }

         else if(direction == 1)

         {

                   PORTC |= (1 << 7);

         }

         else {PORTC &= 0b00000010;}

}

                           

实验结果

5.1  操作过程

1)将程序下载到板子上后,数码管默认显示1层,电梯处于停止状态,发光二极管不亮。

2)在键盘上按下相应的楼层,电梯会移动到相应楼层,在电梯移动过程中,期间可以不断按下楼层,相应楼层指示灯亮,电梯根据最新路线行走,发光二极管会根据上行还是下行亮不同颜色的灯,在电梯到达对应楼层,数码管会不断更新显示当前的楼层号。

3)按下按键,电梯会紧急停止,放开按键,电梯恢复正常运行模式。

  5.2  实验结果

 

6.排错过程

1)下载程序到单片机上时总是不能自动下载驱动程序,搜索相应的下载包,手动下载驱动,然后安装成功;

2)流水灯实验时灯亮的过快,是延时的问题,经过调整延时得以实现1秒亮一个的功能;

3)秒表计时器中,为了利用上中断,并同时显示流水灯,因此需要把数码管的小数点位空出来,接入中断;

5)置0和置1的语句写错,对&,|的理解不深。将第3位置0/1的正确的写法是:PORTx &= ~(1<<3);PORTx |= (1<<3);

6)忘记用DDRx将相应端口设置成输入或者输出。

7)定时器时晶振不是16兆赫兹。按照先定义初始值为55,达到255溢出时按照16兆的频率应为1ms,但事实上循环1000次远小于1s。改正调试循环值使时间达到1s

9)即使是作用于不同位置的局部变量同名时会产生一些问题,调用的函数里面的局部变量和主函数的局部变量名相同下载后有时会报错。为了避免,除了循环变量i、j,其他变量都尽量不重名。

10)第二次按下按键时电梯无法恢复正常运行,是因为中断程序没有退出,需要设计计数变量才能退出。

11)4*4键盘的使用要分清行线和列线,不同种类的键盘编程不同。8个端口将4个置为输入,4个置为输出。

12)设定外部中断时,用上升/下降沿出发时,使用低电平触发中断。

13)使用低电平触发时,中断使用的PD2,PD3口需设置下拉电阻。

7.心得体会

这学期的单片机实验课程已经结束了,虽然做的实验比较简单,但单片机对我来说毕竟是一个从未接触过的东西,所以我通过实验课还是学到了很多知识。

单片机实验课是为了更好的学习和使用单片机而开设的一门课程。单片机在实际生活中的应用非常广泛,尤其是在工业控制、网络通信、模块化系统和汽车电子等领域。因此,单片机课程是电子信息类专业学生的必修课之一。由此,可以看出单片机课程对于我们这类专业的学生的重要性。

单片机课是一门实践性很强的课程,仅有课堂上理论知识的学习,对运用好单片机是完全不够的,必须亲自做实验,从实验中吸取教训,总结经验,增加实战经验,加深对单片机的理解,更好的运用单片机。单片机实验课的目的就是为学生提供做实验的机会,让学生能够从几个简单的实验中学会单片机开发的过程和单片机的实际运用。

单片机实验课让我将课堂上学到的理论知识运用到实验当中去,在实验中发现问题,解决问题,提高了自己的实际操作能力,加深了对理论知识的理解。下面是我在实验当中遇到的一些问题和体会。

首先,自己在实验课上对视频讲解的东西没有很好的领会。一开始自己觉得视频讲的电路和原理自己都懂,代码只需要照着视频里稍微修改一下就可以,就没有仔细看视频资料,但是当自己去编写程序和修改程序就发现自己对单片机以及电路的工作原理并不是很了解,使得自己在修改程序,使其实现不同功能时遇到较多的问题。于是,只能认真的从头开始看视频资料,进一步理解原理。

其次,自己对c++的运用不是很熟。其实这次的练习实验可以参考视频里的做,但是在做电梯的实验时,就发现根本没有这方面的资料,于是只能自己一点点去编写,其间出现了不少逻辑错误,都是自己最后慢慢的调试过来,实验中大部分时间就是花在编写程序来实现其功能上,自己在编写程序之前并没有完全弄清楚各个功能之间的逻辑关系,就是按照一个功能一个功能的独立编写,然后再往一块攒,出现问题再检查错误,这样就浪费了很多时间在修改时间上。

再者,中断问题的烦恼,主要是中断无法在第二次按下按键时跳出,最后通过添加计数变量,中断才得以跳出。

此外,还有就是连接电路时过于马虎,开始做练习实验和模拟电梯系统的实验时,一开始都出现了程序编写正常,用别人的实验板写入都可以正常实现功能,而自己的实验板却完全没有反应的问题,最后经过对导线的挨个检查,才发现是有的导线插接的并不牢靠,造成电路中有断路出现,才造成实验的失败。

最后,还有一个问题,就是自己分析问题的能力的欠缺。我对实验中遇到的问题不能及时分析并找出解决的办法,有时候只能靠询问同学来解决困难。这也提醒自己,只有多加强锻炼,才能不断提高这方面的能力。

单片机实验课学生人数众多,课程资源有限,只有一个老师指导,老师是非常辛苦的。所以还是要感谢一下老师的辛勤指导。这么多的学生,众口难调,老师只能满足大多数学生的需求,老师在这个过程中付出的辛勤劳动我们大家是有目共睹的,在这里,要向老师表示敬意。

8.参考文献

1.  AVR单片机技术文档cn_mega16-16L.pdf

2.  AVR单片机原理及应用.pdf

3.  AVR单片机软硬件设计视频教程-入门篇-第一讲-单片机及其开发工具简介

4.  AVR单片机软硬件设计视频教程-入门篇-第四讲-C语言的流水灯验证

5.  AVR单片机软硬件设计视频教程-入门篇-第五讲-按键与数码管的程序设计

6.  AVR单片机软硬件设计视频教程-入门篇-第六讲-中断与定时器

7.  百度文库—4*4键盘的使用

8.  百度文库-电机的正反转

9.意见与建议

希望老师下次能够讲解一下中断部分,在开始的时候有些不太清楚中断的原理。

更多相关推荐:
单片机最小系统实验报告

长沙学院电子工艺实习报告姓名潘舟学号20xx044211系别电子与通信工程时间专业电子信息工程指导老师龙英刘辉王新辉刘亮马凌云目录1引言2目的3任务4要求5主要原理图6主要程序7程序实现的功能8系统调试9总结目...

单片机最小系统实验报告

单片机原理及应用技术设计课题系别专业学号姓名指导老师课程设计报告20xx年6月单片机最小系统流水灯的设计一单片机简介由于单片机技术在各个领域正得到越来越广泛的应用世界上许多记成电路生产家相继推出各种类型的单片机...

单片机最小系统实训报告

单片机最小系统实训报告一实训目的1掌握并理解单片机最小系统的原理及制作牢记最小系统中各元器件的参数及各元器的作用2掌握单片机芯片内部的组成及存储机构3理解常用指令的功能和使用方法4掌握单片机的中断源中断控制寄存...

单片机最小系统设计报告

单片机最小系统设计报告摘要基于AT89C51为核心制作的单片机最小系统含有单片机工作的最基本组成单元电源电路复位电路和振荡电路另外还有蜂鸣器电路八段数码管显示电路LED电路和RS232串口电路以及用于扩展功能的...

单片机最小系统PCB设计 protel 实验报告

福州大学至诚学院电子线路印刷版PCB设计CAD实践报告题目单片机最小系统PCB设计姓名学号系别信息工程专业电子信息工程年级20xx年12月31日单片机最小系统PCB设计1实验目的11熟悉PROTEL的基本操作1...

单片机最小系统设计报告

单片机最小系统设计报告1学校湖南科技大学学院信息与电气工程学院班级09级电子一班姓名田坎2目录1设计11主要芯片简介111HD7279芯片5112MAX232芯片5113DS1302芯片611424C02芯片6...

单片机最小系统实训报告

单片机最小系统实训报告一实训目的1掌握并理解单片机最小系统的原理和制作熟悉电子元件的参数以及应用2熟悉PCB板的工业制作流程并且要求会使用protel软件绘制相应的PCB图3复习使用keil51软件编写相应程序...

单片机最小系统PCB设计_protel_实验报告

单片机最小系统PCB设计一实验目的1熟悉PROTEL的基本操作2掌握用PROTEL绘制原理图的基本方法3掌握用PROTEL制作PCB板的方法4设计一个小型的单片机系统二实验环境1WINDOWSXP环境2PROT...

单片机最小系统实训报告

单片机最小系统实训报告一实训目的1掌握并理解单片机最小系统的原理和制作熟悉电子元件的参数以及应用2熟悉PCB板的工业制作流程并且要求会使用protel软件绘制相应的PCB图3复习使用keil51软件编写相应程序...

protel课程设计实验报告--单片机最小系统的设计

工程应用软件上机学院专业班级学号姓名时间实训报告机电工程学院测控技术与仪器目录1任务22所用设备23设计过程231原理图的绘制2311单片机89C51芯片的绘制2312按键电路3313复位电路3314晶振电路4...

单片机实验报告

单片机实验报告学院信息工程学院专业班级生物医学工程111班姓名学号南昌大学实验报告实验一IO口输入输出实验学生姓名学号班级生医111班实验类型验证综合设计创新实验日期20xx1126实验成绩一实验目的掌握单片机...

单片机实验报告

单片机实验报告学生姓名学号专业指导教师学院信息与电气工程学院20xx年11月单片机实验报告实验一MCS51指令系统实验数据排序1实验目的熟悉MCS51指令系统掌握程序设计方法加深对内部存储器读写的认识熟悉仿真开...

单片机最小系统实验报告(14篇)