嵌入式实训报告

中北大学

嵌入式实训周任务书

 20##-2012  学年第     学期

下达任务书日期: 20##年 5 月 22 日


中北大学

指导教师:   乔道迹       职称:      讲师         

               

2012 年 6 月 21 日

嵌入式实训报告

1.需求分析

数码相框是展示数码照片而非纸质照片的相框。数码摄影必然推动数码相框的发展,因为全世界打印的数码相片不到35%。数码相框通常直接插上相机的存储卡展示照片,当然更多的数码相框会提供内部存储空间以接外接存储卡功能。数码相框就是一个相框,不过它不再用放进相片的方式来展示,而是通过一个液晶的屏幕显示,它可以通过读卡器的接口从SD卡获取相片,并设置循环显示的方式,比普通的相框更灵活多变,也给现在日益使用的数码相片一个新的展示空间。数码相框是观看和分享数码照片的专用设备。其基本原理:外观采用普通相框的造型,把原来相框中间的照片部分换成液晶显示屏,配上电源,存储介质等,可以直接播放数码照片,使得同一个相框内可以循环播放照片,比普通相框的单一功能更有优势。数码相框由三大部件组成:LCD液晶屏、PCB电路板和外框。其中PCB电路板是数码相框的核心,因为它包含必须的软件。数码相框是时尚的电子消费品、也是家庭必备的装饰品。继承了数码的时尚和相框的温情,用途十分广泛。

随着社会的发展和物质水平的提高,人们对于精神世界的追求也得到大幅度的改善。迎合现在市场的所需,消费电子的设计新增了人性化的元素。该设计理念源于提高人们生活的幸福指数。在传统意义上,人们往往用冲印出来的相片记录生活中美好的瞬间。而伴着电子行业的发展,足以用数码形式将其取代,同时还可以将静态图片提升为动态的视频短片,携带方便,存储时间长远,满足于人们的需求,同时也是一种节约型、环保型的构想。

2.总体设计

主要步骤和方法

根据数字相框的主要特点和设计功能那个要求,我们将课设分为以下几个步骤:

2.1数码相框的软件总体设计

数字相框软件系统功能可以划分为四个模块:

1)图片浏览模块,可以通过按键控制选定某个图像或更新图像页(上一页、下一页)。

2)播放模块,对浏览界面选定的图片进行循环播放。

3)音乐播放模块,可设置播放背景音乐。

4)鼠标操作模块,实现使用鼠标操作。

2.2功能模块组织架构图

 

2.3人员组成以及分工

3.详细设计

3.1鼠标模块的设计原理

1.鼠标编程通讯协议

数据格式
 ㈠ MicroSoft 公司标准:
MICROSOFT FORMAT
字节 字元(B i t)
7 6 5 4 3 2 1 0
BYTE1 1 1 L R Y7 Y6 X7 X6
BYTE2 0 0 X5 X4 X3 X2 X1 X0
BYTE3 0 0 Y5 Y4 Y3 Y2 Y1 Y0
注释:
L = 左键状态
R = 右键状态 1 = 按下
0 = 释放
X0-X7 = X 距离
Y0-Y7 = Y 距离 X7或Y7为±符号位
串口特性:波特率 = 1200 Baud,8 位数据,无校验位,2 停止位。
㈡ MOUSE SYSTEM 公司标准:
MOUSE SYSTEM FORMAT
字节 字元(B i t)
7 6 5 4 3 2 1 0
BYTE1 1 0 0 0 0 L M R
BYTE2 X7 X6 X5 X4 X3 X2 X1 X0
BYTE3 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0
BYTE4 X7 X6 X5 X4 X3 X2 X1 X0
BYTE5 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0
注释:
L = 左键状态
R = 右键状态
M = 中间键状态 1 = 按下
0 = 释放
X0-X7 = X 距离
Y0-Y7 = Y 距离 X7或Y7为±符号位
串口特性:波特率 = 1200 Baud,8 位数据,无校验位,2 停止位。
    ㈢ IBM 公司 PS/2 MOUSE 标准:
PS/2 MOUSE FORMAT
字节 字元(B i t)
7 6 5 4 3 2 1 0
BYTE1 YV XV YS XS 1 0 R L
BYTE2 X7 X6 X5 X4 X3 X2 X1 X0
BYTE3 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0
注释:
L = 左键状态
R = 右键状态 1 = 按下
0 = 释放
X0-X7 = X 距离
Y0-Y7 = Y 距离 X7或Y7为±符号位
XS,YS = ±符号位 1--- 反向移动
XV,YV = 溢出位 1---- X Y 数据溢出

2.鼠标的操作方式

 1.初始化鼠标驱动程序:
 例如:中断号INT33h    功能16h   子功能17h
 中断号:用于请求服务
 功能号:用于确定用户期望获取哪种服务
 子功能号:进一步指定所希望的服务
 调用寄存器:设置被调用的服务功能所要求的参数
 返回寄存器:返回服务功能执行结果

2.设置图形鼠标光标的形状

中断33h的功能9h设置图形模式下的鼠标光标的形状,并定义光标里的一个点为热点。光标由16 x 16位的视频掩码和16 x 16位的光标掩码组成。

3. 取得或设置鼠标光标的位置

中断33h的功能4h用于设置鼠标光标位置,功能3h则用于报告光标的位置.AX存放功能号,CX被赋予X坐标,DX被赋予Y坐标。

4. 定义不显示鼠标光标的屏幕区域
中断33h的功能10h定义屏幕的一个区域,当鼠标进入该区域时会自动关掉。进入时,CX存放被保护域的左列号,SI存放右列号;DX存放首行号,DI存放末行号。
5.监视鼠标按钮
中断33h的功能5h和6h报告鼠标按钮的信息。这两项功能都在AX返回一个按钮状态字节,报告按钮2个或3个当前状态。此状态字节由中断21h的功能3h返回。它报告鼠标光标的位置。
3.1.2 关于鼠标的算法

PID控制软件算法

  对该交流变频调速系统建模,首先取电压输入为一个随机值,再测得其转速值。取两个数值构成一个数据对,然后对大量数据对用Matlab仿真求得其幅频特性和相频特性,并且对其幅频特性和相频特性进行相似的拟合。根据拟合的曲线可以近似求得其传递函数为:

按此在新窗口浏览图片

  使用神经网络PID自适应控制对系统进行Matlab的仿真测试,效果令人满意。但因其输入层、隐含层、输出层的多阶矩阵运算使得单片机的运算时间大幅度增加,造成时间上的不确定因素增大;同比使用增量型PID控制,尽管后者需调整3个控制参数,但同样可使精度达到预期的效果,运算时间也大幅度下降,为此选用增量型PID算法作为控制算法。

  增量式数字PID的控制算法为:

按此在新窗口浏览图片

  其中kp为比列系数,ki为积分系数,kd为微分系数;e(k)为当前位移增量与上一次位移增量的变化量; 同理,e(k-1)、e(k-2)各为往前时间间隔的位移变化量。

利用单片机串行中断接收功能,可在PC机上实时在线调节PID的kp、ki、kd参数。

4.实训周的总结

通过此次课程设计,使我更加扎实的掌握了有关Linux技术方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终这次课程设计终于顺利完成了。在设计中遇到了很多问题,最后在老师的指导下和同学的合作下,终于得到解决。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事。课程设计是一门专业课,给我很多专业知识以及专业技能上的提升,同时,设计让我感触很深。使我对抽象的理论有了具体的认识。通过这次课程设计,我掌握了关于linux的很多知识还自学鼠标的工作原理,并会实现较为简单的鼠标模块设计等等,通过查询资料,也了解了数码相框的构造及原理。我认为,在这次设计的过程中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在实验课上,我们学会了很多学习的方法,而这是日后最实用的。回顾起此课程设计,至今我仍感慨颇多,从理论到实践,学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。 在实验过程中,也对团队精神的进行了考察,让我们在合作起来更加默契,只有互相之间默契融洽的配合才能换来最终完美的结果。此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。

附件:本人设计的功能模块的源程序以及整体原理图

1.鼠标模块的源程序

#include<stdio.h>

#include<string.h>

#include<fcntl.h>

#include<stdlib.h>

#include<unistd.h>

typedef struct

{

    int dx;                                              //*鼠标左右移

    int dy;                                              //*鼠标上下移

    int dz;                                                    //*滚轮

    char button;                                         //*鼠标左右键

}  mouse_event;

int get_m_info(int fd,mouse_event *p)

{

    int n = 0;

    char buf[8];

    n = read(fd,buf,3);

    if(n>0)                             /*1:lefy key    *2:right key*/

                                   /*3:middle key   *0:no button key*/

    {

       p->dx = buf[1];

       p->dy = -buf[2];

       p->button = (buf[0]&0x07);             /*获取x,y滚轮的增量值*/

    }

    return n;

}

int get_mouse(void)                             

{

    int fd;

    mouse_event  m_event;

    int press_c  = 0;

    fd = open("/dev/input/mice",O_RDWR|O_NONBLOCK);

    if(fd == -1)                               /*1:read mouse Success*/

    {

       perror("open mice");                 /*-1:error for read mouse*/

       exit(0);

    }

    while(1)

    {

       if (get_m_info(fd,&m_event)>0)

       {

           switch(m_event.button)

           {

              case 1 :

                  return 1;

                  break;

              case 2 :

                  return 2;

                  break;

              default :break;

           }

       }

       usleep(500);

    }

    close(fd);

    return 0;

}

2.整体原理图

对鼠标的按键信息分别按位描述如下:

每一位值的含意如下:

D0 左键的按键信息,1:按下;0:No

D1 右键的按键信息,1:按下;0:No

D2 滚轮的按键信息,1:按下;0:No

D4 鼠标的移动方向,X坐标方向,1:自右向左移动;0:相反方向

D5鼠标的移动方向,Y坐标方向,1:自上向下移动;0:相反方向

 

第二篇:嵌入式系统实训报告

嵌入式系统实训报告

专    业:电子信息工程技术

班    级: 电子092

姓    名:  郑升

学    号:  6313093206

              指导老师:    邬志锋

第一阶段  GPIO的控制

一、实训目的

1、掌握寄存器的使用

2、使用GPIO的控制方法点亮和熄灭LED

二、实训内容

控制LED的点亮,点亮L4,L6,熄灭L5、L7。

三、实训设备

一组设备为普通PC 、 嵌入式系统实验板

四、GPIO的使用

将管脚用作GPIO,需要先通过设置(PINSELx)将管脚连接到GPIO,然后再根据应用的实际使用方向设置(IOxDIR)为对应的输入/输出。如果GPIO用作输出,则通过操作IOxSET和IOxCLR两个寄存器来进行置位和清零操作;如果GPIO用过输入口,则通过读取IOxPIN的值来读取IO口的实际状态。如图1所示。

只有IOxSET/IOxCLR 中被写入1 的位对应的管脚才能设置为高/低电平,写入0 的位对应的管脚的状态不发生改变。但是,仅通过写IOxSET 或IOxCLR 寄存器是不可能使一个GPIO 口同时输出包含0 和1 的二进制数。

                             图1

五、程序代码

#include"includes.h"

int main(void)

{

   PINSEL0 = PINSEL0 & (~(3ul<<6));

   PINSEL2 = PINSEL2 & (~(13ul<<3));

   PINSEL0 = PINSEL0 & (~(3ul<<14));

   IO0DIR = IO0DIR | (1ul<<3);

   IO1DIR = IO0DIR | (1ul<<24);

   IO1DIR = IO0DIR | (1ul<<25);

   IO0DIR = IO0DIR | (1ul<<7);

   IO0CLR = (1ul<<3);

   IO0SET = (1ul<<24);

   IO0CLR = (1ul<<25);

   IO0SET = (1ul<<7);

   while(1)

   {

   }

}

               第二阶段  UART的使用

一、实训目的

1、掌握LPC21XX系列处理器UART的使用方法

2、掌握串口调试助手的使用

二、实训内容

使用串口调试助手控制LED的亮和灭,当收到0时,熄灭LED,否则点亮

三、实训设备

一组设备为:普通PC 、 嵌入式系统实验板

四、LPC21XXUART的使用

LPC21XX的UART使用的主要步骤如图2所示。其中前四步叫做初始化UART,一般放在一个初始化函数中完成。

                               图2

五、程序代码

#include"includes.h"

void Delay(unsigned int t)

{

       unsigned int i;

       while(t--)

       {    

i=3000;while(i--);

}          

}

void InitUART0(void)

{    

       PINSEL0 = (PINSEL0 & 0xfffffff0)| (0x01<<0) | (0x01<<2);

       U0LCR = 0x80;

       U0DLM = 0;

       U0DLL = 180;

       U0LCR = 0x03;

}

unsigned char UART0_RcvByte(void)

{    

       unsigned char rcv_data;

       while((U0LSR & 0x01) == 0);

       rcv_data = U0RBR;

    return(rcv_data);

}

int main(void)

{

       unsigned char rcv_data;

       PINSEL0 = PINSEL0 & (~(3ul<<6));

       IO0DIR = IO0DIR | (1ul<<3);

       InitUART0();

       while(1)

       {

           rcv_data = UART0_RcvByte()-'0';       

           if(rcv_data==0)

         {    

                 IO0SET =1ul<<3;

IO0SET =1ul<<7;

IO1SET =1ul<<24;

IO1SET =1ul<<25;

               }  

              else

{

IO0CLR =1ul<<3;

IO0CLR =1ul<<7;

IO1CLR =1ul<<24;

IO1CLR =1ul<<25;   

}

       }               

}

第三阶段  中断系统的使用

一、实训目的

1、理解LPC21XX系列处理器的中断系统

2、掌握中断的概念和LPC21XX中断系统的程序编写方法

二、实训内容

使用中断的方法接收UART发送过来的数据,然后再控制LED的亮和灭,当收到0时,熄灭LED,否则点亮。PC端使用的是串口调试助手。

三、实训设备

一组设备为:普通PC 、 嵌入式系统实验板

四、中断的使用

中断使用流程步骤如图3所示。

图3

五、程序代码

#include "includes.h"

unsigned int Getsome;

void InitUART0(void)

{

       PINSEL0 = (PINSEL0 & 0xfffffff0)| (0x01<<0) | (0x01<<2);

       U0LCR = 0x80;

       U0DLM = 0;

       U0DLL = 180;

       U0LCR = 0x03;

       U0IER = U0IER & 0xfe | 0x01;

}

void InitVIC(void)

{

   VICIntSelect = VICIntSelect & (~(1ul<<6));

       VICVectCntl2 = 0x20 | 0x06;

       VICVectAddr2 = (unsigned int)UART0_RcvByte;

       VICIntEnable = 1<<0x06;

}

void __irq UART0_RcvByte(void)

{

       unsigned char IIR;

       IIR = U0IIR;

       if((IIR&0x01)==0)

       {

              IIR = IIR & 0x0e;

              if((IIR==0x04)||(IIR==0x0c))

              {

                     while(U0LSR & 0x01)

                     {

                            Getsome = U0RBR; 

                            if(Getsome=='0')

                            {

                            IO1SET = 1ul<<7;

  IO0SET = 1ul<<3;

IO1SET = 1ul<<24;

IO0SET = 1ul<<25;

                            }

                            else

                            {

                                IO1CLR = 1ul<<7;

IO0CLR = 1ul<<3;

IO1CLR = 1ul<<24;

IO0CLR = 1ul<<25; }

                         }

                  }

           }

       VICVectAddr = 0;

}

int main(void)

{

       LongDelay = 1;

       PINSEL0 = PINSEL0 & (~(3ul<<6)) & (~(7ul<<14));

       IO0DIR = IO0DIR | (1ul<<3) | (1ul<<7);  

       PINSEL1 = PINSEL1 & (~(24ul<<16)) & (~(25ul<<18));

       IO1DIR = IO1DIR | (1ul<<24) | (1ul<<25);  

       InitUART0();

       InitVIC();

       while(1);

}

              第四阶段  定时器的使用

一、实训目的

1、理解LPC21XX系列处理器的定时器

2、掌握LPC21XX系列处理器的定时器的结构

二、实训内容

1、使用查询的模式,用定时器控制LED实现1S周期的闪亮

2、使用中断的模式,用定时器控制LED实现0.5S周期的闪亮

三、实训设备

一组设备为:普通PC 、嵌入式系统实验板

四、定时器的使用

查询模式的定时器使用流程如图4所示,中断模式的定时器使用流程如图5所示。

   图4

   图5

五、程序代码

查询模式:

#include"includes.h"

int main(void)

{

       PINSEL0 = PINSEL0 & (~(3ul<<6));

       PINSEL2 = PINSEL2 & (~(1ul<<3));

       PINSEL0 = PINSEL0 & (~(3ul<<14));

       IO0DIR = IO0DIR | (1ul<<3);

       IO1DIR = IO1DIR | (1ul<<24);

       IO1DIR = IO1DIR | (1ul<<25);

       IO0DIR = IO0DIR | (1ul<<7);

       T0PR = 13823;

       while(1)

       {

              T0TCR = 1<<1;

              IO0CLR = 1ul<<3;

              IO1CLR = 1ul<<24;

              IO1CLR = 1ul<<25;

              IO0CLR = 1ul<<7;

              T0TCR = 1<<0;

              while(T0TC<1000);

              T0TCR = 1<<1;

              IO0SET = 1ul<<3;

              IO1SET = 1ul<<24;

              IO1SET = 1ul<<25;

              IO0SET = 1ul<<7;

              T0TCR = 1<<0;

              while(T0TC<1000);  

       }

}

中断的模式:

#include"includes.h"

unsigned char LEDState;

void InitTimer0(void)

{

   T0PR = 13823;

   T0MCR = 1<<6 | 1<<7;;

   T0MR2 = 500;

   T0TCR = 1<<1;

   T0TCR = 1<<0;

}

void __irq Timer0Match(void)

{

   if(T0IR & 0x04)

   {

      T0IR = 0x04;

          if(LEDState==0)

          {

             IO0CLR = 1ul<<3;

                LEDState = !LEDState;

          }

else

         {

            IO0SET = 1ul<<3;

               LEDState = 0;

         }

   }

   VICVectAddr = 0;

}

void InitVIC(void)

{

   VICIntSelect = 0x0;

   VICVectCntl0 = 0x20 | 0x04;

   VICVectAddr0 = (unsigned int)Timer0Match;

   VICIntEnable = 1ul<<4;

}

int main(void)

{

   MEMMAP = 0x2;

   LEDState = 0;

   PINSEL0 = PINSEL0 & (~(3ul<<6));

   IO0DIR = IO0DIR | (1ul<<3);

   InitTimer0();

   InitVIC();

   while(1)

   {     

   }

           第五阶段  LED亮度的PC控制

一、实训目的

1、掌握程序联合调试的能力

2、掌握定时器产生PMW信号的方法

3、掌握中断系统的复杂使用

二、实训内容

对LED亮度分成10级显示,当接收到字符“0”时,亮度为最低,即熄灭,接收到字符“1”时,显示为1级亮度,当接收到“9”时,亮度最大。各级亮度自行定义,能区分即可。

三、实训设备

一组设备为:普通PC 、嵌入式系统实验板

四、程序流程图

 

等待中断

                                图6

五、程序代码               

#include"includes.h"

#include"Key.h"

void __irq Timer0Match(void)

{

   unsigned char ir = T0IR;

   if(ir&0x02)

   {

      IO0CLR = 1ul<<3;

      T0IR = 1<<1;

   }

   VICVectAddr = 0;

}

int main(void)

{

   unsigned char keyin;

   PINSEL0 = PINSEL0 & (~(3ul<<6));

   IO0DIR = IO0DIR | (1ul<<3);

   IO0CLR = 1ul<<3;

   T0PR =  1382;

   T0MR1 = 1000;

   T0MCR = 1ul<<0 | 1ul<<1 | 1ul<<3;

   T0TCR = 1ul<<1;

   T0TCR = 1ul<<0;

   VICIntSelect = VICIntSelect & (~(1ul<<4));

   VICVectCntl6 = 0x20 | 0x04;

   VICVectAddr6 = (unsigned int)Timer0Match;

   VICIntEnable = 1ul<<4;

   Key_Init();

   while(1)

   {

      keyin = Key();

      switch(keyin)

         {

           case 1:T0MR1=875;

               break;

               case 2:T0MR1=750;

               break;

               case 3:T0MR1=625;

               break;

               case 4:T0MR1=500;

               break;

               case 5:T0MR1=375;

               break;

               case 6:T0MR1=250;

               break;

               case 7:T0MR1=125;

               break;

               case 8:T0MR1=0;

               break;

               default:break;

         }

   }

}

第六阶段  LED亮度的自动控制

一、实训目的

1、掌握程序联合调试的能力

2、掌握LPC21XX系列AD的使用

3、掌握闭环系统的控制方法

二、实训内容

使用一个光敏电阻做光传感器,当外界光亮度发生变化时,LED的亮度能随之发生相应的变化,以保持足够的对比度。光越强,LED亮度越高,光越低,LED越暗。

三、实训设备

一组设备为:普通PC 、嵌入式系统实验板

四、程序流程图

 

             

等待定时器中断

图7

五、程序说明

该实训是通过光敏电阻来调节LED灯的亮度的,PLC通光敏电阻的电压的变化值来采集变化的数据的,当PLC得到电压的变化数据之后,通过判断数据的变化范围,来设置产生PWM的中断匹配值或通过一条对应公式直接改变产生PWM的中断匹配值。这里更改匹配值的中断函数与之前做过的类似。

实训心得

在这次的实训中也遇到很多的困难,常常会因为这些那些小小的编程错误而使得程序无法照常运行,但是通过回忆以前做过的实验,并与其他同学交流,最终可以说还是解决了问题。不过,正是因为这些困难的存在,让我发现了自己哪方面存在的知识比较薄弱,这利于以后有针对性地进行补充知识。

相关推荐