嵌入式课程设计报告

课程设计(综合实验)报告

( 2013 -- 2014 年度第 1 学期)

名 称: 题 目: 院 系: 班 级: 学 号: 学生姓名: 指导教师: 设计周数:

成 绩:

日期: 年 月

嵌入式课程设计报告

一、 课程设计的目的与要求

1.1.目的

掌握嵌入式系统的基本原理,及其基于μC/OSII操作系统的实现方法。 本次设计使用 ADS工具来设计以实现相应功能。每秒钟采集一次AD数据,将10次的AD采样结果,写入到CAT24WC02,并读出结果,在数码管上轮流显示。

1.2.要求

需要基于uc/os操作系统实现题目要求,鼓励实现其他自己拟定的功能,要求难度不低于上述题目。

1.3.实验步骤

1.本实验使用实验教学系统的CPU板显示读出的数据。 2. 在PC机并口和实验箱的CPU板上的JTAG接口之间,连接SDT调试电缆。 3. 接入电源线缆,给系统上电。4. 打开SDT开发环境,对代码进行编译调试,编译通过后,首先启动JTAG 驱动程序,之后运行SDT的调试环境,装载实验程序。

二、设计正文

2.1.具体(实现功能)硬件参数

EDA实验室用实验开发板:1个蜂鸣器、八个七段数码管(用来显示双通道AD采样值)、两个电位器调节输入的电压值。

PC操作系统WINXP,ARM SDT2.5集成开发环境。

2.2.设计思想(理想状态下)

a、控制系统控制算法模型的建立(ASM图的建立):

2.4.程序代码

说明:本课设基于μC/OSII操作系统中仅一个任务实现所有功能,无需考虑多任务之间调度的配合,但也有执行效率高,占用CPU资源少的特点。

#include "config.h"

#define TASK_STK_SIZE 64

OS_STK TaskStartStk[TASK_STK_SIZE]; //初始化

#define ZLG7290 0x70 /* 定义器件地址 */

#define Glitter_COM 0x70

#define CAT24WC02 0xA0 /* 定义从要地址,忽略通用地址 */ #define BEEPCON 0x00000080 /* P0.7引脚控制B1,低电平蜂鸣 */

嵌入式课程设计报告

void TaskStart(void *data);

uint32 ADC_Data;

uint8 jishu;

uint8 pd;

uint8 count=0;

/****************************************************************************

* 名称:I2C_Init()

* 功能:主模式I2C初始化,包括初始化其中断为向量IRQ中断。

* 入口参数:fi2c 初始化I2C总线速率,最大值为400K

* 出口参数:无

****************************************************************************/

void I2C_Init(uint32 fi2c)

{ if(fi2c>400000) fi2c = 400000;

PINSEL0 = (PINSEL0&0xFFFFFF0F) | 0x50; // 设置I2C控制口有效

I2SCLH = (Fpclk/fi2c + 1) / 2; // 设置I2C时钟为fi2c

I2SCLL = (Fpclk/fi2c) / 2;

I2CONCLR = 0x2C;

I2CONSET = 0x40; // 使能主I2C

/* 设置I2C中断允许 */

VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断

VICVectCntl0 = 0x29; // I2C通道分配到IRQ slot 0,即优先级最高

VICVectAddr0 = (int)IRQ_I2C; // 设置I2C中断向量地址

VICIntEnable = 0x0200; // 使能I2C中断

}

int main (void)

{

OSInit();

OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0); OSStart();

return 0;

}

void TaskStart(void *pdata)

{

uint8 j;

uint16 AdData;

uint8 key;

uint8 disp_buf[8];

uint8 data_buf[2];

uint8 data_buf1[2];

pdata = pdata; /* 避免编译警告 */

TargetInit(); /* 目标板初始化 */

PINSEL0 = 0x20000000; // 设置管脚连接,使用I2C口

PINSEL1 = 0x01040000; //设置P0.27 P0.28为AIN0功能

I2C_Init(30000); // I2C配置及端口初始化

/* 进行ADC模块设置,其中x<<n表示第n位设置为x(若x超过一位,则向高位顺延) */

ADCR = (1 << 0) | // SEL = 1 ,选择通道0 ((Fpclk / 1000000 - 1) << 8) | // CLKDIV = Fpclk / 1000000 - 1 ,即转换时钟为1MHz

(0 << 16) | // BURST = 0 ,软件控制转换操作

(0 << 17) | // CLKS = 0 ,使用11clock转换

(1 << 21) | // PDN = 1 , 正常工作模式(非掉电转换模式)

(0 << 22) | // TEST1:0 = 00 ,正常工作模式(非测试模式)

(1 << 24) | // START = 1 ,直接启动ADC转换

(0 << 27); // EDGE = 0 (CAP/MAT引脚下降沿触发ADC转换)

while(count<10)

{

ADCR = (ADCR&0xFFFFFF00)|0x01|(1 << 24); // 切换通道并进行第一次转换

while( (ADDR&0x80000000)==0 ); // 等待转换结束

ADCR = ADCR | (1 << 24); // 再次启运转换

while( (ADDR&0x80000000)==0 );

ADC_Data = ADDR; // 读取ADC结果

ADC_Data = (ADC_Data>>6) & 0x3FF;

ADC_Data = ADC_Data * 3300;

ADC_Data = ADC_Data / 1024;

data_buf[1]= ADC_Data & (0xFF);

data_buf[0]= (ADC_Data>>8) & (0xFF);

ISendStr(CAT24WC02, 0x00,data_buf,2,0); // 在0x00地址处写入1字节数据

OSTimeDly(200);

IRcvStr(CAT24WC02, 0x00,data_buf1,2,0); // 在0x00地址处读出1字节数据

AdData=(data_buf1[0]<<8)+(data_buf1[1]);

disp_buf[7]=(AdData / 1000);

disp_buf[6]=AdData % 1000 / 100;

disp_buf[5]=AdData % 100 / 10;

disp_buf[4]=AdData % 10;

ADCR = (ADCR&0xFFFFFF00)|0x02|(1 << 24); // 切换通道并进行第一次转换

while( (ADDR&0x80000000)==0 ); // 等待转换结束 ADCR = ADCR | (1 << 24); // 再次启运转换 while( (ADDR&0x80000000)==0 );

ADC_Data = ADDR; // 读取ADC结果 ADC_Data = (ADC_Data>>6) & 0x3FF;

ADC_Data = ADC_Data * 3300;

ADC_Data = ADC_Data / 1024;

data_buf[1]= ADC_Data & (0xFF);

data_buf[0]= (ADC_Data>>8) & (0xFF);

ISendStr(CAT24WC02, 0x00,data_buf,2,0); // 在0x00地址处写入1字节数据

OSTimeDly(200);

IRcvStr(CAT24WC02, 0x00,data_buf1,2,0); // 在0x00地址处读出1字节数据

AdData=(data_buf1[0]<<8)+(data_buf1[1]);

disp_buf[3]=(AdData / 1000);

disp_buf[2]=AdData % 1000 / 100;

disp_buf[1]=AdData % 100 / 10;

disp_buf[0]=AdData % 10;

ZLG7290_SendBuf(disp_buf,8);

count++;

}

if(count==10)

{

IO0DIR = BEEPCON; // 设置I/O为输出

IO0CLR = BEEPCON; // BEEPCON = 0

OSTimeDly(200);

IO0SET = BEEPCON; //BEEPCON = 1

count++;

}

}

三、课程设计总结

经过十多天的设计工作,我基本完成了对嵌入式系统的要求,虽然还有很多不足需要完善,但最基本的部分完成的还是很不错的,基本实现了当时编写程序时的要求,不过其显示界面确有不足之处。记得刚选择这个题目时,我是茫然无措的,不知道从何下手,后来通过自己不断地坚持,通过网上查询资料。到图书馆借书学习,以及多次询问课设导师怎么做才好,才终于初见眉目。

十多天的课程设计,既是段站的也是漫长的,时间过得很快,但我在这十多天中学到的东西以及心灵的成长却是受益终生的。因为我懂得了知识是无边无际的。我们是金额都不能满足于已学到的知识,要谨记学海无涯。同时我还学会了独立思考,规划课设进度。最重要的是知道了坚持的重要意义,只要你勇于坚持不放弃,所有的力量都会来帮你。

四、参考文献

[1] ARM嵌入式系统基础教程(第2版)[M].北京航空航天大学出版社,2008.

 

第二篇:嵌入式课程设计报告之数据排序

嵌入式设计报告

题目: 数据排序过程演示

黄志君  通信0607  06221066

谢克强  通信0607  06221026

指导老师:闻跃

                                         20##年5月11日

一、   设计题目:数据排序演示过程

用键盘随机输入6个数值为0-9的数字,用冒泡排序法将它们按从小到大的方式排序,并显示排序过程和最终结果。

二、        设计要求和目标

(1)在LCD屏幕上提示用户用矩阵键盘输入6个数字,输入过程显示在屏幕上,同时从左到右显示在扩展版的数码管上。输入完成后,屏幕提示按“确认”键开始排序过程。一定要输满6个数字才能排序;输入过程中若按“取消”键则清除所有输入结果,回到待机状态。

(2)当输入完6个数字,按下“确认”键后,程序开始排序;在排序过程中在数码管上显示中间结果,每当数字顺序发生变化时,显示在数码管上停留3秒或有按键按下后才进行下一步计算。

(3)排序结束后,在数码管上应该从左到右显示数值从小到大排列的6个数字,同时LED发光管闪烁表示排序完成。按取“消键”清除结果显示回到待机状态,提示下一次输入和排序操作过程。

(4)在排序过程中,若按下“取消”键,在LCD屏幕上提示是否要取消排序操作,按“确定”减中断排序,清除显示;按其他键继续排序过程。

(5)在屏幕上显示出排序的所有中间结果,统计位置交换次数。

(6) 用LCD屏幕上的图形菜单,让使用者在几种排序方法中选择一种进行排序过程演示。

三、排序算法说明

1、冒泡排序
已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。再比较a[3]与a[4],以此类推,最后比较a[n-1]与a[n]的值。这样处理一轮后,a[n]的值一定是这组数据中最大的。再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。再对a[1]~a[n-2]以相同方法处理一轮,以此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。
优点:稳定,比较次数已知;
缺点:慢,每次只能移动相邻两个数据,移动数据的次数多。

2、选择排序
已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[1]与a[3]的值,若a[1]大于a[3]则交换两者的值,否则不变。再比较a[1]与a[4],以此类推,最后比较a[1]与a[n]的值。这样处理一轮后,a[1]的值一定是这组数据中最小的。再将a[2]与a[3]~a[n]以相同方法比较一轮,则a[2]的值一定是a[2]~a[n]中最小的。再将a[3]与a[4]~a[n]以相同方法比较一轮,以此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。
优点:稳定,比较次数与冒泡排序一样,数据移动次数比冒泡排序少;
缺点:相对之下还是慢。

3、插入排序
已知一组升序排列数据a[1]、a[2]、……a[n],一组无序数据b[1]、b[2]、……b[m],需将二者合并成一个升序数列。首先比较b[1]与a[1]的值,若b[1]大于a[1],则跳过,比较b[1]与a[2]的值,若b[1]仍然大于a[2],则继续跳过,直到b[1]小于a数组中某一数据a[x],则将a[x]~a[n]分别向后移动一位,将b[1]插入到原来a[x]的位置这就完成了b[1]的插入。b[2]~b[m]用相同方法插入。(若无数组a,可将b[1]当作n=1的数组a)
优点:稳定,快;
缺点:比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量庞大的时候,但用链表可以解决这个问题。

4、希尔排序
已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。发现当n不大是,插入排序的效果很好。首先取一增量d(d<n),将a[1]、a[1+d]、a[1+2d]……列为第一组,a[2]、a[2+d]、a[2+2d]……列为第二组……,a[d]、a[2d]、a[3d]……列为最后一组以次类推,在各组内用插入排序,然后取d'<d,重复上述操作,直到d=1。
优点:快,数据移动少;
缺点:不稳定,d的取值是多少,应取多少个不同的值,都无法确切知道,只能凭经验来取。

四、  原理说明和模块

1、主要用到的模块

l  数据输入模块:主要完成要排序数据的输入;

l  LED显示模块:主要完成数据的输入以及排序过程在数码过程上的显示;

l  LCD显示模块:主要完成数据排序过程,操作提示等内容的显示;

l  扫描键盘模块:主要完成对键盘的扫描,通过得到不的按键转到相应的处理程序;

l  排序及主控制模块:主要完成数据排序以及显示控制;

l  延时及动态刷新模块:主要用来去除键盘抖动和刷新数码管显示.

2、程序各部分模块关系

3、操作说明

l  从键盘输入六个数,A键清除,重新输入

l  输入后提示选择排序方法

l  在排序过程中可以按A键可以取消当前排序

l  排序完成后LED灯闪,LCD提示排序完成,按任意键继续下一次排序过程.

4、流程图与各模块代码说明

五、源程序

1、主程序部分

#include "71x_lib.h"

#include "ledkey.h"

#include "lcdlib.h"

#include "rt_fp.h"

#include "stdlib.h"

#include "stdio.h"

#pragma import(__use_no_semihosting_swi)

#define EMI_BCON0             (*(volatile u16 *)0x6C000000)

#define EMI_BCON1             (*(volatile u16 *)0x6C000004)

#define EMI_BCON2             (*(volatile u16 *)0x6C000008)

#define EMI_BCON3             (*(volatile u16 *)0x6C00000C)

extern void _delay(u32);

void refresh(void);

void wait(void);

void lcd_disp(int,int,int);

void over(void);

//floating point supporting

void __rt_raise(int sig, int type)

{

    static int a,b;

    a=sig;

    b=type;

}

//char tch[64];

u32 pts[64]={10,0, 16,7, 30,4, 23,13, 27,25, 20,20,

            8,29, 10,20, 0,16, 11,13, 10,0}; //np=11, a star

u32 pts1[64];

int data[6];

int label=0;

void Main(void)

{

    int i=0,j,n,k,tem1,tem2,method;

    int in_count,count=0,tmp,min,index,increment,d;

    char s[2]={0,0};

   

    #ifdef DEBUG

    debug();

    #endif

    EMI_BCON0 = 0x803D;

    EMI_BCON2 = 0x803D;

    EMI_BCON3 = 0x803D;

    GPIO_Config(GPIO2, 0x00FF, GPIO_AF_PP);   //enable CS0-CS3

    EMI_Config(0, EMI_ENABLE | EMI_WAITSTATE(3) | EMI_SIZE_16);    //enable bank 1 >=4 waits

    EMI_Config(1, EMI_ENABLE | EMI_WAITSTATE(2) | EMI_SIZE_16);    //enable bank 1 >=4 waits

    EMI_Config(3, EMI_ENABLE | EMI_WAITSTATE(3) | EMI_SIZE_16);    //enable bank 1 >=4 waits

    //config the gpio0,LED5~8

    GPIO_Config(GPIO0, 0x00F0, GPIO_OUT_PP);

    //turn on all 4 led lights

    GPIO_WordWrite(GPIO0, GPIO_WordRead(GPIO0) | (0x0f<<4));

    EnableLedKey();

    _fp_init();          //初始化浮点运算, 在rt_fp.h中声明

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

       SetLedDigit(i, 0);

      

    // LCD初始化

    LCD_Init();

// test 2-D graph

st0:gClearScreen(0);

    gSetColor(LCD_YELLOW);

    gSetBkColor(LCD_GREEN);

    gTextOut("数据排序过程演示",70,80);

    gTextOut("黄志君  06221066",70,150);

    gTextOut("谢克强  06221026",70,230);

    gTextOut("任课老师  闻跃",70,310);

    s[0]=0;

    s[1]=0;

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

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

       _delay(200);

   

st1:gClearScreen(0);   

    gTextOut("请您输入要排序的数据",45,70);

   

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

       data[i]=20;

       in_count=0;

   

    while(in_count<6)

    {

       refresh();

       n=GetKey();

       if(n<0){      //如果没有按键

           k=-1;      //清除上一次按键值

           continue;  //下一个循环

       }

       if(n==k)

           continue;  //若与上次按键相同,不做处理

       k=n;

       if(n>9&&n!=10)continue;

       gTextOut("如果需要重新输入请按 A",40,100);

       if(n==10) goto st1;

       else {

           data[in_count]=n;

           in_count++;

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

              lcd_disp(in_count,88,130);

           }

    }

   

    gSetColor(LCD_BLUE);

    gSetBkColor(LCD_WHITE);

    gTextOut("数据输入完毕",75,60);

    gTextOut("冒泡法排序请按1",70,90);

    gTextOut("选择法排序请按2",70,120);

    gTextOut("插入法排序请按3",70,150);

    gTextOut("希尔法排序请按4",70,180);

    gTextOut("若要取消操作按A",70,210);

   

   

    do

    {

       n=GetKey();

       if(n==10)

           {goto st0;}

       else if(n==1|n==2|n==3|n==4|n==5)

       {       method=n;

              break;

       }

              else refresh();

    }while(1);

gClearScreen(0);

/*冒泡法排序*/

if (method==1)

{

gTextOut("冒泡法排序开始,A 键退出排序",15,30);

gTextOut("您输入的原始数据为:",20,60);

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

    {

       s[0]=data[i]+48;

       gTextOut(s,10*i+155,60);

    }

   

gTextOut("以下是中间结果,其他任意键加速显示",2,90);

count=0;

for(i=0;i<6;i++)                 //冒泡法排序,外层循环

    for(j=0;j<6-i;j++)           //冒泡法排序,内层循环

    {

       if(data[j]>data[j+1])        //相邻比较若大则交换

           {

              wait();             //延时

              tmp=data[j];        //交换

              data[j]=data[j+1];

              data[j+1]=tmp;

              if(label==1)         //扫描程序发现取消键被按下

           {

              gTextOut("您确定要退出程序么?",50,250);

               gTextOut("按 A 退出程序,其他键继续",30,280);

               while(1)

            {

               refresh();      //动态刷新六位数码管显示,以保证数码管能动态显示交换的数据

               n=GetKey();    //获取按键值

               if(n<0)

             {          //如果没有按键

               k=-1;     //清除上一次按键值

               continue; //下一个循环

              }

               if(n==k)

               continue; //若与上次按键相同,不做处理

               k=n;

               if(n==10) goto st0;  //用户确定退出程序,返回待机状态

               else              //用户要求继续排序

              {

               gRectFill(0,150,240,320,0);//背景填充,清除语言提示

               label=0;

              _delay(50000);

              break;                //返回,继续排序

              }

            }

           }

              count++;                  //计数值加一

              if(count<=6)

                      lcd_disp(6,10,count*20+100);   //调用LCD显示程序,分栏显示

              else if(count>6&&count<=12)

                      lcd_disp(6,90,(count-6)*20+100);

              else lcd_disp(6,170,(count-12)*20+100);

            }

      

       

     }

}

if(count>9)

{

tem1=1;

tem2=count-10;

s[0]=tem1+48;

s[1]=tem2+48;

}

else

{

s[0]=count+48;

s[1]=0;

}

if(count>6) count=6;

gTextOut("排序结束,交换了",50,count*20+130);

gTextOut(s,160,count*20+130);

gTextOut("次。",180,count*20+130);

gTextOut("按任意键返回待机状态,再次排序",15,count*20+160);

over();

goto st0;

/*  选择法排序*/

if (method==2)

{

label=0;

gTextOut("选择法排序开始,A 键退出排序",15,30);

gTextOut("您输入的原始数据为:",20,60);

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

    {

       s[0]=data[i]+48;

       gTextOut(s,10*i+155,60);

    }

   

gTextOut("以下是中间结果,其他任意键加速显示",2,90);

count=0;

for(i=0;i<6;i++)                 //选择法排序,外层循环

{

    min=data[i];

    index=i;

    for(j=i+1;j<6;j++)           //选择法排序,内层循环

    {

       if(data[j]<min)        //找出本次循环中最小的数,标记位置

           {

              min=data[j];

              index=j;

           }

    }

    if(index!=i)              //找到当前最小的数

    {  

        wait();             //延时

       tmp=data[i];        //交换

       data[i]=data[index];

       data[index]=tmp;

       if(label==1)         //扫描程序发现取消键被按下

       {

           gTextOut("您确定要退出程序么?",50,250);

            gTextOut("按 A 退出程序,其他键继续",30,280);

            while(1)

           {

             refresh();      //动态刷新六位数码管显示,以保证数码管能动态显示交换的数据

             n=GetKey();    //获取按键值

             if(n<0)

           {            //如果没有按键

             k=-1;       //清除上一次按键值

             continue;   //下一个循环

            }

             if(n==k)

             continue;   //若与上次按键相同,不做处理

             k=n;

             if(n==10) goto st0;  //用户确定退出程序,返回待机状态

             else              //用户要求继续排序

            {

             gRectFill(0,150,240,320,0);//背景填充,清除语言提示

             label=0;

            _delay(50000);

            break;                //返回,继续排序

            }

           }

          }

        count++;                  //计数值加一

        lcd_disp(6,88,count*20+100);   //调用LCD显示程序

    }

}

gTextOut("排序结束,交换了",50,count*20+130);

gTextOut(s,160,count*20+130);

gTextOut("次。",180,count*20+130);

gTextOut("按任意键返回待机状态,再次排序",15,count*20+160);

over();

goto st0;

}

/*插入法排序*/

if (method==3)

{

gTextOut("插入法排序开始,A 键退出排序",15,30);

gTextOut("您输入的原始数据为:",20,60);

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

    {

       s[0]=data[i]+48;

       gTextOut(s,10*i+155,60);

    }

gTextOut("以下是中间结果,其他任意键加速显示",2,90);

count=0;

for(i=1;i<n;i++) 

{

  tmp=data[i];    //用tmp记录data[i]

  for(j=i-1;j>=0;j--)  //逐个向前寻找插入点

  {

   if(tmp>data[j])  //找到,跳出循环

    break;

   else     //没找到,将前一个数据后移

    data[j+1]=data[j];

  }

  data[j+1]=tmp;

}

if(label==1)         //扫描程序发现取消键被按下

       {

           gTextOut("您确定要退出程序么?",50,250);

            gTextOut("按 A 退出程序,其他键继续",30,280);

            while(1)

           {

             refresh();      //动态刷新六位数码管显示,以保证数码管能动态显示交换的数据

             n=GetKey();    //获取按键值

             if(n<0)

           {            //如果没有按键

             k=-1;       //清除上一次按键值

             continue;   //下一个循环

            }

             if(n==k)

             continue;   //若与上次按键相同,不做处理

             k=n;

             if(n==10) goto st0;  //用户确定退出程序,返回待机状态

             else              //用户要求继续排序

            {

             gRectFill(0,150,240,320,0);//背景填充,清除语言提示

             label=0;

            _delay(50000);

            break;                //返回,继续排序

            }

           }

          }

       count++;                  //计数值加一

        if(count<=6)

          lcd_disp(6,10,count*20+100);   //调用LCD显示程序,分栏显示

              else if(count>6&&count<=12)

                      lcd_disp(6,90,(count-6)*20+100);

              else lcd_disp(6,170,(count-12)*20+100);

}

/*希尔排序*/

if (method==4)

{

gTextOut("插入法排序开始,A 键退出排序",15,30);

gTextOut("您输入的原始数据为:",20,60);

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

    {

       s[0]=data[i]+48;

       gTextOut(s,10*i+155,60);

    }

gTextOut("以下是中间结果,其他任意键加速显示",2,90);

count=0;

increment=n; /* 增量初值,不妨设n>0 */

do {

      increment=increment/3+1; /* 求下一增量 */

     for(i=d+1;i<=n;i++) /* 将R[d+1..n]分别插入各组当前的有序区 */

       if(data[i]<data[i-d])

       {

         data[0]=data[i];j=i-d; /* R[0]只是暂存单元,不是哨兵 */

         do {/* 查找R[i]的插入位置 */

            data[j+d]=data[j];/* 后移记录 */

            j=j-d; /* 查找前一记录 */

         }while(j>0&&data[0]<data[j]);

         data[j+d]=data[0]; /* 插入R[i]到正确的位置上 */

       }

   }while(increment>1);

if(label==1)         //扫描程序发现取消键被按下

       {

           gTextOut("您确定要退出程序么?",50,250);

            gTextOut("按 A 退出程序,其他键继续",30,280);

            while(1)

           {

             refresh();      //动态刷新六位数码管显示,以保证数码管能动态显示交换的数据

             n=GetKey();    //获取按键值

             if(n<0)

           {            //如果没有按键

             k=-1;       //清除上一次按键值

             continue;   //下一个循环

            }

             if(n==k)

             continue;   //若与上次按键相同,不做处理

             k=n;

             if(n==10) goto st0;  //用户确定退出程序,返回待机状态

             else              //用户要求继续排序

            {

             gRectFill(0,150,240,320,0);//背景填充,清除语言提示

             label=0;

            _delay(50000);

            break;                //返回,继续排序

            }

           }

          }

       count++;                  //计数值加一

        if(count<=6)

                      lcd_disp(6,10,count*20+100);   //调用LCD显示程序,分栏显示

              else if(count>6&&count<=12)

                      lcd_disp(6,90,(count-6)*20+100);

              else lcd_disp(6,170,(count-12)*20+100);

}

}

2、子程序部分

/*延时子程序*/

void wait(void)

{

    int i,n,k;

    for(i=0;i<80;i++)   //循环用来延时

    {

       refresh();      //刷新数码管显示,使数码管可以动态显示

       n=GetKey();     //获取按键值

       if(n<0){k=-1;    

           continue;  }

       if(n==k)

           continue; 

       k=n;

       if(n==10)      //取消键被按下,修改标志位

       {   label=1;

           return; } //返回 

   else           //用户不想取消排序,操作继续进行

           return;   

    }

    return;

}

/*LED动态显示程序*/

void refresh(void)         

{

    int i=0;

    for(i=0;i<6;i++)        //将排序中间过程数据显示

    {

       LedCodeDisp(5-i,data[i]);

       _delay(200);

       SetLedDigit(5-i,0);

    }

}

/*lcd显示子程序*/

void lcd_disp(int n,int m,int pos)

{  

    int i;

    char s[10];

    for(i=0;i<n;i++)        //将排序中间结果在LCD上分行显示

    {

       s[0]=data[i]+48;

       gTextOut(s,10*i+m,pos);

    }

}

   

/*排序结束后处理函数*/

void over(void)           

{

   int i,k,n=0;

   int temp=0;

   

    while(1)

    {   

        GPIO_WordWrite(GPIO0, 0xffff);  //使LED全亮

        for(i=0;i<10;i++)               //延时

          {

              refresh();

             

             n=GetKey();              //获取按键信息

             if(n<0){      

                k=-1;   

                continue;   

                    }

             if(n==k)

                continue;   

             else                     //有键按下,修改标志位,跳出循环

                {

                  temp=1;

                  k=n;

                  break;

                }

          }

         

        if(temp==1) goto ov;          //标志位是1说明有键按下回到待机状态

       GPIO_WordWrite(GPIO0, 0xff0f);//使LED灭灯

        for(i=0;i<10;i++)             //延时,查询按键

          {

              refresh();

             

              n=GetKey();

             if(n<0){      

             k=-1;      

             continue;  

                    }

             if(n==k)

                continue;   

             else

                {

                  temp=1;

                  k=n;

                   break;

                }

          }

ov:      if(temp==1) break;         //有键按下,返回主程序

    }

}

5、报告总结

黄志君:这个实验是我们最大的一次实验,准备时间也长,但是基于对嵌入式了解的程度,做这个报告应当说是一些收获的

1、对于平台的使用更熟悉,各模块的使用有了进一步的了解。

2、做这个实验的时候,我们需要不断的对老师平时的内容进行回顾和利用,所以对于嵌入式的学习是一个很好的巩固

3、在实验的过程中,一个最深的感触是自己所撑屋的知识还很不足够,学习到的东西还很少,开始选题的时候,在网上找过一些资料,也试着想利用这次机会来做一次,但是后来我们还是放弃了,因为这有很多未知的东西,这对于我们的实验结果有很大影响。

4、虽然说是做的硬件,但是这次发现对于软件的编程能力要求交不低,所以以后需要更进一步的加强自己的编程能力的学习,为自己以后的实践能力有进一步的提高作准备。

谢克强:在编写程序及调试的初级阶段,由于对ARM系统不是很熟悉,一些函数的功能及参数应用有些吃力。对头文件的某些函数不了解,也带来比较大的困难。经过仔细阅读说明文档,网上、书上查找相关资料,进行了一些函数定义的重新编辑,有些函数在修改或重新定义之后,更加符合此程序的要求。

在本实演中,我们运用了冒泡法排序、选择法排序、希尔法排序、插入法排序。这些算法有的是通过查阅相关资料得来的,我们还需在语言算法方面加强。在课上主要听老师讲内容,自己练习的也主要是软件的使用,真正要自己做出一个作品来还是费了不小的力。本实验的各个部分如果分开来看,难度并不是很大。关键是在了解ARM系统的基础上,将各个部分组合起来。现在咨询发达,各种资料很多,但是将各种相关有用的资料搜集、整合,再加上自己的理解和创造东西也是一种当今学习工作需要的能力

 

相关推荐