课程设计(综合实验)报告
( 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系统的基础上,将各个部分组合起来。现在咨询发达,各种资料很多,但是将各种相关有用的资料搜集、整合,再加上自己的理解和创造东西也是一种当今学习工作需要的能力
福建工程学院嵌入式系统课程设计报告书题目基于S3C2440设备驱动及其界面设计班级姓名学号指导老师陈靖张平均李光炀2目录一设计课题…
福州大学课程设计任务书课程嵌入式课程设计题目姓名李仁煌学号011000610系别电机电器专业电气工程与自动化年级20xx起讫日期2…
嵌入式系统课程设计报告基于ARM的楼宇对讲系统设计摘要采用模块化设计方法设计出一款基于ARM微控制芯片和Linux操作系统的楼宇对…
嵌入式系统开发课程设计专周报告题目:具有日历功能的电子时钟系别及专业:计算机工程系计算机应用技术班级:10511学生姓名:XXX指…
课程设计综合实验报告20xx20xx年度第1学期名称题目院系班级学号学生姓名指导教师设计周数成绩日期年月日一课程设计的目的与要求1…
福建工程学院嵌入式系统课程设计报告书题目基于S3C2440设备驱动及其界面设计班级姓名学号指导老师陈靖张平均李光炀2目录一设计课题…
湖南科技大学计算机科学与工程学院嵌入式系统设计与开发实验报告书题目远程温光数据监测系统班级12级计算机一班姓名刘政材学号120xx…
课程设计报告基于ARM的嵌入式电子点菜系统班学姓级号名09061320xx061316叶尔多斯海拉提20xx年10月1题目基于AR…
中南大学嵌入式系统实验设计报告指导老师吴志虎李志民设计者连金涛专业班级测控0801班学号0909081012时间20xx年6月1实…
XXXX课程设计报告课程名称嵌入式系统设计题目专业班级学生姓名学生学号指导老师二一三年一月八日目录1概述111背景112设计目标2…
嵌入式系统课程设计报告基于ARM的楼宇对讲系统设计摘要采用模块化设计方法设计出一款基于ARM微控制芯片和Linux操作系统的楼宇对…