北京科技大学 嵌入式课程设计报告(精选7篇)
《嵌入式系统》课程设计
报告书
题目:
基于S3C2440设备驱动及其界面设计
班级:
姓名:
学号:
指导老师:
陈靖,张平均,李光炀
目录
一、设计课题...............................................................................................................................4
二、设计目的...............................................................................................................................4
三、设计任务及要求...................................................................................................................4
四、设计内容...............................................................................................................................5
五、操作界面的生成...................................................................................................................7
六、操作界面调试.......................................................................................................................9
七、设计总结.............................................................................................................................10
八、设计参考书.........................................................................................................................12
九、附件(程序).....................................................................................................................13
一、设计课题
基于S3C2440的设备驱动及其界面设计
二、设计目的:
1.进一步巩固嵌入式系统的基本知识; 2.掌握嵌入式应用系统的基本结构; 3.掌握嵌入式系统开发环境建立和使用;
4.掌握嵌入式系统基本驱动、应用程序的设计调试和编译移植方法; 5.学会查阅有关专业资料及设计手册; 6.MiniGUI界面编程。
三、设计任务及要求:
1.掌握嵌入式系统开发环境建立和使用;
2.掌握嵌入式系统基本驱动、应用程序的设计调试和编译移植方法;
3、MiniGUI在PC上的安装、移植
4、Linux基本输入输出驱动程序设计编译与移植
5、基于MiniGUI的基本输入输出应用编程编译与移植
6、编写设计说明书(方案的确定、设计环节的考虑及必要说明等)及设备的使用说明;
7、绘制有关图纸.四、设计内容:
1、基础知识准备
1)讲解设计任务;2)熟悉ubuntu的使用;3)熟悉TQ2440试验系统的使用;4)掌握嵌入式系统开发环境建立和使用;
5)掌握嵌入式系统基本驱动、应用程序的设计调试和编译移植方法.2、界面设计环境构建:MiniGUI在PC上的安装、移植
2.1、MiniGUI在pc机上安装和运行
建立工作目录:mkdir /minigui-free
cd /minigui-free mkdir /src 复制源文件包到工作目录:cp /mnt/hgfs/D/src/* /minigui-free 解压文件到/minigui-free:
tar zxvf libminigui-1.6.10.tar.gz tar zxvf minigui-res-1.6.10.tar.gz tar zxvf mg-samples-1.6.10.tar.gz
2.2、MiniGUI库安装
(2)将libcross.sh考到minigui的lib库的解压文件夹中(3)将rescross.sh 考到minigui的res资源解压文件夹中(4)将samplecorss.sh 考到sample例子解压文件夹中(5)依次运行libcross.sh,rescross.sh,samplecorss.sh(6)到nfsroot的,目录下,将libreduce.sh考到这个目录下,运行libreduce.sh 2.3、安装qvfb(1)解压qvfb1.1.tar.gz(2)./configure(3)make(4)make install 2.4、配置MiniGUI.cfg vi /etc/MiniGUI.cfg 修改如下部分为 [system] # GAL engine and default options gal_engine=fbcon
defaultmode=800x480-16bpp # IAL engine ial_engine=fbcon mdev=/dev/mouse mtype=IMPS2 [fbcon] 6
defaultmode=800x480-16bpp [qvfb] defaultmode=800x480-16bpp display=0 1.5运行MiniGUI例子程序(1)打开qvfb:qvfb &(2)运行helloword:
五、操作界面的生成
1、操作界面面执行文件的生成
1).在/minigui-free/mg-samples-1.6.10/src/修改源文件treeview.c 2).再次运行samplecorss.sh,生成执行文件treeview
2、利用nfs进行挂载
1).将本地PC机的网络方式设置成为桥接
2).查看/etc/exports下可以挂载的目录
3).启动服务/etc/init.d/nfs-kernel-server restart 4).查看本机和ARM上的IP地址,设置在同一网段,然后ping,使其能够互通。5).在超级终端上,进行操作
Mount-o nolock,rsize=1024,wsize=1024 本机IP:/ /mnt
将虚拟机和ARM进行挂载,可以查看到虚拟机根目录下的文件。
3、在超级终端上将需要的文件从虚拟机上复制到ARM机上
1).重新烧写文件系统镜像文件
2).挂载成功后,将/mnt/minigui-free/nfsroot/lib/*复制到/usr/lib/ 3).将/mnt/minigui-free/nfsroot/usr/local/lib/*复制到/usr/local/lib/ 4).将/mnt/etc/MiniGUI.cfg复制到/etc/ 8
5).将/mnt/minigui-free/mg-samples-1.6.10/src/*复制到/usr/minigui/
4、在超级终端上运行执行文件
1).进入/usr/minigui/运行treeview文件 2).可以再操作界面上现实我们所设计的界面
六、操作界面调试
1、点击LED1LED2LED3LED4,分别控制四盏led灯的亮暗,调试界面如下:
2、输入频率值,点击START键控制四盏led灯闪烁,调试界面如下:
七、设计总结
1、设计过程中遇到的问题
错误1:
InitGUI: Can not initialize colors of window element!InitGUI failure when using /usr/local/etc/MiniGUI.cfg as cfg file.解决方法:正确配置MiniGUI.cfg文件 错误2:
Permission denied 解决方法:权限不够,使用root用户登录。错误3:
编译出错未找到jpeg,png等
解决方法:安装zlib,png,jpeg库。
错误4:
出现符号未找到等编译错误 解决方法:make clean 后在make 错误5:
在minigui创建和移植的过程中,出现lib库编译不成功的现象,这是由于minigui是基于qt3的,因此需要添加qt3所在路径至配置文件。错误:6 在开发板上添加鼠标设备后,提示视频采集失败,这是因为/etc下的配置文件MiniGUI.cfg中对外设控制范围的控制过大,银将其修改为与界面统一大小800*480.错误:7 在执行led灯控制程序之前应该首先停止开发板上原有的流水灯进程led-player。错误:8 运行执行程序treeview后界面上出现两个光标,此时应该在/etc/init.d下的rcS文件中停用qt3的光标。
2、心得体会
本学期为期两周的嵌入式课程设计在不知不觉中结束了,虽说这次课程设计时间不是很长,但是感觉自己收获颇丰,不仅学习到了一些新知识,回顾了以前的一些快要遗忘的知识点,而且使自己的学习目标更加明确,学习方法更加完善,也体会到软件开发的趣味,更加清楚地认识到了自己在软件开发及学习上的一些不足之处。
两周的课程设计,在计算机这个博大深奥的领域我感觉自己还有好多东西要学,还有好多的东西不懂!嵌入式软件开发应用广泛而且前景很好,目前正处于人才紧缺的关口,嵌入式技术在未来能够得到更加广泛的应用。学好嵌入式,C语言很重要,所以感觉自己有必要在学习、积累一下这方面的知识。很多东西的学习不是一帆风顺也是比较耗时的,嵌入式也不例外,要想学好还必须下大力气,还必须坚持。这次的课程设计让我明确了一点:嵌入式开发对于提升我们的系统知识有很大的帮助,尤其是操作系统的知识。嵌入式
系统开发对于我们的知识面要求非常的广,且要有一定的深度。这次的课程设计因为是一个有针对性的训练,所以记的会非常牢固。跟平时上课不太一样,平时上完理论课很少有时间上机进行时间或者隔几天才上机练习,等到上机时一些东西可能遗忘了,比较耗费时间。在课上,有老师在前面演示我们感觉看得懂或感觉没问题,可轮到我们独立完成的时候,因为实际操作的少,其中的问题就来了!我很感谢学校特别是学院老师有实训这样的安排,把我们这一学期学的东西系统的集中的进行训练,让我们深刻明确的体验了一下软件开发的流程!还要感谢给我们实训的楚老师,感觉楚老师能力很强,也很有耐心,即使老师讲了很多遍的问题,我们不会,老师还是会走进我们给我们耐心的指导,还给我们讲一些学习计算机的方法,一些软件开发需要注意的细节,让我们知道自己在哪方面不足,需要加强,也让我们了解到哪些需要认真的学习,那些是重点,不是没有方向的乱学一通,什么也学不好!经过这次的实训,我真真确确的感受到了计算机在我们生活中工作中的运用,这些软件、程序能让我们提高工作的效率,更直观更便捷的切入主题。当然,在学习的过程中并不是一帆风顺的,在这之中,因为要操作的东西很多,有时错一步,后面的结果就无法显示,而自己的计算机水平还有待提高,根本检查不出来是哪里出了错!这时候,老师都会耐心的过来帮助我!在平时我们就需要好好的查阅书籍或者上网搜集相关资料去解决问题。
短短两周的课程设计很快结束了,我发现我对计算机这个专业、对嵌入式技术、对Linux都有了新的认识。通过这次的实训,我了解到,要真真正正的掌握计算机程序还不是一件简单容易的事儿,但真正掌握后,它带给我们的将是无穷的便捷与科技,我喜欢高端便捷的生活。我希望我能做计算机这个万能机器人的主人而不是奴隶,我会努力加油的!感谢学校,感谢老师给我的帮助,让我的思想、技能又上了一个台阶!感谢!加油!
八、设计参考书
1、《嵌入式系统接口设计与Linux驱动程序开发》
2、《ARM9嵌入式LINUX系统构建与应用》
4、MiniGUI编程手册
5、Linux应用程序编程
九、附件(程序)
#include
#include
/*包括 MiniGUI 常用的宏以及数据类型的定义*/ #include
/*包含了
MiniGUI
绘图函数的接口定义*/ #include
/*包含了
libminigui 中所有内建控件的接口定义*/ #include
/*包含了许多UNIX系统服务的函数原型*/ #include
/*提供对I/O控制的函数*/
#define ID_LED1 101
/*定义各个控件与定时器的ID号*/ #define ID_LED2 102 #define ID_LED3 103 #define ID_LED4 104 #define ID_TEXT1 105 #define ID_TEXT2 106 #define ID_START 107 #define ID_STOP 108 #define ID_COMBOBOX 109 #define ID_TIMER 110
static int a,b,c,d=0;
/*定义LED灯的初始值*/ static int fd_led;
/*定义文件描述符*/
HWND hMainWnd;
/*定义主窗口句柄*/
static void draw_circular(HWND hdig,int x,int y,int r,int which)
/*自定义一个画圆函数,x、y、r、which分别表示圆心坐标、半径、颜色*/ {
HDC hdc;
/*定义设备上下文句柄*/ int color;color=((which==0)?PIXEL_green:PIXEL_red);
hdc=BeginPaint(hdig);
/*获得设备上下文句柄*/ SetBrushColor(hdc,color);
/*设置画刷颜色*/ FillCircle(hdc,x,y,r);
/*调用园填充函数*/ EndPaint(hdig,hdc);
/*释放设备上下文句柄*/ }
static DLGTEMPLATE DlgInitProgress=
/*定义对话框模板.用static类型数据,使该数据的定义只在所在文件中有效,以免因为名字空间污染造成潜在的编译或连接错误*/ {
WS_BORDER|WS_CAPTION,/*对话框风格,WS_BORDER创建有边框的窗口 ,WS_CAPTION创建含标题栏的主窗口*/
WS_EX_NONE,/*对话框扩展风格,WS_EX_NONE表示无扩展风格*/
0,0,800,480,/*对话框位置,左上角坐标(0,0),800、480分别为宽和高*/
“MY_LED_CONTROL”,/*对话框标题*/
0,/*对话框图标*/
0,/*对话框菜单*/
9,/*对话框中控件个数。这个必须要匹配*/
NULL,/*pointer to control array*/
0
/*附加值*/ };
static CTRLDATA CtrlInitData[]=
/*控件数组*/ {
{
“static”,/*控件类型*/
WS_VISIBLE|SS_SIMPLE,/*控件风格,WS_VISIBLE创建初始可见的窗口,SS_SIMPLE显示单行文本*/
100,270,150,40,/*控件位置*/
ID_TEXT1,/*控件ID*/
“Please input frequency”,/*控件内容*/
0,/*附加值*/
WS_EX_NONE
/*控件扩展风格*/
}, { “static”, WS_VISIBLE|SS_SIMPLE, 605,270,150,40, ID_TEXT2, “HZ”, 0, WS_EX_NONE
}, {
“button”, WS_VISIBLE|WS_TABSTOP, 135,160,80,60, ID_LED1, “LED1”, 0, WS_EX_NONE
}, {
“button”, WS_VISIBLE|WS_TABSTOP, 285,160,80,60, ID_LED2, “LED2”, 0, WS_EX_NONE
}, {
“button”, WS_VISIBLE|WS_TABSTOP, 435,160,80,60, ID_LED3, “LED3”, 0,/*WS_TABSTOP支持Tab键*/
WS_EX_NONE
}, {
“button”,WS_VISIBLE|WS_TABSTOP,585,160,80,60,ID_LED4,“LED4”,0,WS_EX_NONE
}, {
“button”,WS_VISIBLE|WS_TABSTOP,285,360,80,60,ID_START,“START”,0,WS_EX_NONE
}, {
“button”,WS_VISIBLE|WS_TABSTOP,435,360,80,60,ID_STOP,“STOP”,0,WS_EX_NONE
}, {
CTRL_COMBOBOX,WS_VISIBLE|WS_TABSTOP|CBS_AUTOSPIN|CBS_AUTOLOOP,/*CBS_AUTOSPIN创建旋钮数字框,CBS_AUTOLOOP框中的数字将自动循 环显示*/
435,270,80,40,ID_COMBOBOX,“0”,/*旋钮数字框初始值*/
0,WS_EX_NONE
} };
static int DialogBoxProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)/*对话框过程函数,用来接收和处理所有发送到该窗口的消息*/ {
int number;
/*用来存从旋钮数字框获得的数值*/
static int t=0;
int num;
/*存放定时时间*/
switch(message)
{
case MSG_INITDIALOG:
/*用户在定义自己的对话框回调函数时,需要处理
MSG_INITDIALOG消息,该消息是在MiniGUI根据对话框模板建立对话框以及 控件之后,发送到对话框回调函数的。*/
SendDlgItemMessage(hWnd, ID_COMBOBOX, CB_SETSPINRANGE, 0, 10000);
/*设置旋钮数字框的最大小值*/
return 1;
case MSG_PAINT:/*重绘消息*/
draw_circular(hWnd,175,90,30,1);
draw_circular(hWnd,325,90,30,1);
draw_circular(hWnd,475,90,30,1);
draw_circular(hWnd,625,90,30,1);
printf(“*************************init draw_circular******************************n”);
case MSG_TIMER:t++;
/*定时器消息,这里完成LED灯的闪烁*/
if(t%2!=0)
{
ioctl(fd_led, 0,0);
ioctl(fd_led, 0, 1);
ioctl(fd_led, 0, 2);
ioctl(fd_led, 0, 3);printf(“*************************time red******************************n”);
draw_circular(hWnd,175,90,30,1);
draw_circular(hWnd,325,90,30,1);
draw_circular(hWnd,475,90,30,1);
draw_circular(hWnd,625,90,30,1);
break;
}
else
{
ioctl(fd_led, 1,0);
ioctl(fd_led, 1, 1);
ioctl(fd_led, 1, 2);
ioctl(fd_led, 1, 3);printf(“*************************time green******************************n”);
draw_circular(hWnd,175,90,30,0);
draw_circular(hWnd,325,90,30,0);
draw_circular(hWnd,475,90,30,0);
draw_circular(hWnd,625,90,30,0);
break;
}
case MSG_COMMAND: /*击键消息*/
switch(wParam)
{
case ID_LED1:a++;
/*控制LED灯亮暗*/
if(a%2!=0)
{
ioctl(fd_led,0,0);
draw_circular(hWnd,175,90,30,1);
}
else
{ /
ioctl(fd_led,1,0);
draw_circular(hWnd,175,90,30,0);
}
printf(“******************led1********************************n”);
break;
case ID_LED2:b++;
if(b%2!=0)
{
ioctl(fd_led,0,1);
draw_circular(hWnd,325,90,30,1);
}
else
{
ioctl(fd_led,1,1);
draw_circular(hWnd,325,90,30,0);
}
printf(“*******************led2********************************n”);
break;
case ID_LED3:c++;
if(c%2!=0)
{
ioctl(fd_led,0,2);
draw_circular(hWnd,475,90,30,1);
}
else
{
ioctl(fd_led,1,2);
draw_circular(hWnd,475,90,30,0);
}
printf(“*******************led3********************************n”);
break;
case ID_LED4:d++;
if(d%2!=0)
{
ioctl(fd_led,0,3);
draw_circular(hWnd,625,90,30,1);
printf(“*******************led33********************************n”);
}
else
{
ioctl(fd_led,1,3);
draw_circular(hWnd,625,90,30,0);
}
printf(“*******************led4********************************n”);
break;
case ID_START:printf(“*******************start1*********************n”);
number=SendMessage(GetDlgItem(hWnd,ID_COMBOBOX), CB_GETSPINVALUE, 0, 0);/*获取旋钮数字框的数值*/
printf(“**********%d*******************n”,number);
printf(“*******************start2*********************n”);
if(number!=0)
{
printf(“*******************start3*********************n”);
num=(int)(1000*(1.0/number));
/*将频率转换为时间*/
printf(“*******************start4*********************n”);
}
else
{
printf(“*******************start5*********************n”);
num=1000;
}
printf(“*******************start6*********************n”);
printf(“*******************start7*********************n”);
printf(“*******************start8*********************n”);
SetTimer(hWnd,ID_TIMER,num);/*创建定时器,时间为num*10ms*/ printf(“*************************SetTimer OK******************************n”);
SendMessage(hWnd,BM_CLICK,0,0);
/*发送点击信息*/ printf(“*************************SendMessage OK******************************n”);
//for(i=0;i++;i<10000)
/*当初用for循环时无法进入循环,也许是因为消息本身有循环机制,用for循环太多也许冲突,所以后来用了定时器*/
//{
//
printf(“********%d**********n,i”);
//
ioctl(fd_led, 1,0);//
ioctl(fd_led, 1, 1);//
ioctl(fd_led, 1, 2);//
ioctl(fd_led, 1, 3);
//
draw_circular(hWnd,175,90,30,0);
//
draw_circular(hWnd,325,90,30,0);
//
draw_circular(hWnd,475,90,30,0);
//
draw_circular(hWnd,625,90,30,0);
printf(“*******************start9*********************n”);
// usleep(number);
//usleep(num);
//
ioctl(fd_led, 0,0);//
ioctl(fd_led, 0, 1);//
ioctl(fd_led,0, 2);//
ioctl(fd_led, 0, 3);
// draw_circular(hWnd,175,90,30,1);
// draw_circular(hWnd,325,90,30,1);
// draw_circular(hWnd,475,90,30,1);
// draw_circular(hWnd,625,90,30,1);
// printf(“*******************start10*********************n”);
//usleep(number);
//usleep(num);
// }
printf(“*******************start********************************n”);
break;
case ID_STOP:
KillTimer(hWnd,ID_TIMER);/*关闭定时器。下面的表示灯灭*/
ioctl(fd_led, 0,0);
ioctl(fd_led, 0, 1);
ioctl(fd_led, 0, 2);
ioctl(fd_led, 0, 3);
draw_circular(hWnd,175,90,30,1);
draw_circular(hWnd,325,90,30,1);
draw_circular(hWnd,475,90,30,1);
draw_circular(hWnd,625,90,30,1);
printf(“**************stop******************n”);
break;
}
}
return(DefaultDialogProc(hWnd,message,wParam,lParam));
/*对话框的缺省消息处理由 DefaultDialogProc 函数完成*/ }
static void InitDialogBox(HWND hWnd){ DlgInitProgress.controls=CtrlInitData;
/*将对话框模板结构和控件结构数组关联起来*/ DialogBoxIndirectParam(&DlgInitProgress,hWnd,DialogBoxProc,0L);/*创建对话框*/
printf(“*************create dialog**********************n”);}
/*****************************************************************
主窗口的过程函数
static int LedWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam){
HDC hdc;
switch(message)
{
case MSG_PAINT:
hdc = BeginPaint(hWnd);
TextOut(hdc, 60, 60, “My leds control!”);
EndPaint(hWnd, hdc);
return 0;
case MSG_CLOSE:
DestroyMainWindow(hWnd);
PostQuitMessage(hWnd);
return 0;
}
return DefaultMainWinProc(hWnd, message, wParam, lParam);
}
*********************************************************************/ int MiniGUIMain(int argc, const char* argv[])
{
// MSG Msg;
// MAINWINCREATE CreateInfo;/*描述主窗口的属性*/
#ifdef _MGRM_PROCESSES
JoinLayer(NAME_DEF_LAYER , “led” , 0 , 0);
/*选择PROCESSES模式*/
#endif
printf(“****************into main*********************n”);
fd_led=open(“/dev/GPIO-Control”,0);
/*打开驱动设备*/
if(fd_led < 0)
{
perror(“open device led”);
exit(1);
}
ioctl(fd_led, 0, 0);
/*初始灯灭*/
ioctl(fd_led, 0, 1);
ioctl(fd_led, 0, 2);
ioctl(fd_led, 0, 3);
InitDialogBox(HWND_DESKTOP);
close(fd_led);/*********************************************************** CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;/窗口风格/
CreateInfo.dwExStyle=WS_EX_NONE;
/窗口扩展风格/
CreateInfo.spCaption=“MY_LED_CONTROL_WIN”;
/窗口标题/
CreateInfo.hMenu=0;
/菜单/
CreateInfo.hCursor= GetSystemCursor(0);
/光标/
CreateInfo.hIcon=0;
/图标/
CreateInfo.MainWindowProc=LedWinProc;
/设置主窗口的窗口函数,所用发往该窗口的消息由该函数处理/
CreateInfo.lx=0;
/窗口位置/
CreateInfo.ty = 0;
CreateInfo.rx = 240;
CreateInfo.by = 180;
CreateInfo.iBkColor=COLOR_lightwhite;
/设置背景颜色/
CreateInfo.dwAddData=0;
/附加数值/
CreateInfo.hHosting=HWND_DESKTOP;
/设置窗口的托管窗口为桌面窗口/
hMainWnd = CreateMainWindow(&CreateInfo);
/创建主窗口,返回创建窗口的句柄/
if(hMainWnd == HWND_INVALID)
return-1;
ShowWindow(hMainWnd,SW_SHOWNORMAL);
/显示窗口的显示方式/
while(GetMessage(&Msg, hMainWnd))/获取主窗口的句柄,指向MSG结构指针/
{
TranslateMessage(&Msg);
/将击键消息转换为MSG_CHAR消息,然后直接发送到窗口的过程函数/
DispatchMessage(&Msg);
/获取消息的目标窗口的窗口过程,然后直接调用 该窗口过程函数对消息进行处理/
}
MainWindowThreadCleanup(hMainWnd);/清除主窗口所使用消息队列的系统资源/ *****************************************************************************/
return 0;
}
关键词:嵌入式系统,课程群,网络教学平台
在现代教育技术发展的大背景下,计算机网络辅助教学已经成为传统教学的有力补充。然而,早期计算机网络辅助教学只针对某一门课程,而近几年网络教学平台开始关注课程群的建设[1,2]。
近年来,随着物联网技术的推广以及各类消费电子产品的快速发展,社会急需具有嵌入式系统开发能力的专业技术人才。为此,很多高校开设了嵌入式系统课程群,并从不同角度积极开展课程群建设[3,4,5,6,7],以提高嵌入式系统课程群的教学效果,但嵌入式系统课程群网络辅助教学平台尚不多见。
江苏科技大学电子信息学院顺应社会发展需求,在电子信息工程专业中设立嵌入式系统方向,开设多门嵌入式系统核心课程形成课程群,培养学生的嵌入式系统应用开发能力,但我校嵌入式系统核心课程基本为32学时,学生在有限的学时内难以充分掌握相关知识和技能。为提高我校嵌入式系统方向的培养成效,帮助学生认识课程群知识体系,更好地掌握嵌入式系统基础知识和基本技能,本文设计了一个适合我校嵌入式系统课程群的网络辅助教学平台,在提供嵌入式系统课程群相关教学资料的基础上,充分发挥网络的互联互通优势,随时实现师生之间、学生之间的互动交流,与课堂教学相辅相成。
1 辅助教学平台总体结构设计
本文所设计的嵌入式系统课程群网络教学平台结构如图1所示,分为前台和后台管理两大部分,其中前台面向学生,具体体现为网站栏目,分为五大栏目:嵌入式概述、理论教学、实践教学、自我测试和互动平台,每个栏目再细分若干子栏目。后台管理实现对后台数据库的管理,包括用户库的管理、资料库的管理、互动平台涉及的动态数据库管理等。本文主要考虑前台功能的设计。
为充分发挥本教学平台资源共享、及时互动的功能,采用Php技术和Mysql数据库技术相结合进行系统设计。
2 网络辅助教学平台功能设计
(1)嵌入式概述
通过概述,让学生了解什么是嵌入式系统,并且对相关核心课程的内容及相互之间的关系有所了解。
①认识嵌入式:利用身边的实例,如手机、空调、网络机顶盒等,让学生对嵌入式系统有个初步的认识。
②课程群简介:由于嵌入式系统课程群涉及的课程比较多,其中包含若干电子信息工程专业的基础课程,为此,本栏目主要向学生介绍我校嵌入式系统课程群核心课程的主要内容及相互关系,具体包括《单片机原理及应用》、《嵌入式系统基础》、《DSP原理及应用》、《FPGA系统设计》、《嵌入式软件开发基础》、《嵌入式操作系统》、《嵌入式系统应用》等课程,帮助学生从整体上了解嵌入式系统课程群。
(2)理论教学
提供我校嵌入式系统课程群核心课程的理论教学相关要求和教学资料,分为三个子栏目。
①教学大纲:提供各门核心课程的教学大纲,让学生通过教学大纲的阅读深入了解不同课程的教学目标、教学内容和要求,为学生的自主学习提供引导。
②教学课件:提供各门课程课件的在线学习和下载,便于学生预习和复习,让学生课堂上有更多的时间听教师的讲解,避免因忙于抄课件而跟不上教师的节奏。由于担任同一门课教学的教师可能不止一位,而每位教师都有自己的特色,因此,本栏目尽可能多的提供不同任课教师的课件。
此外,为了便于教师不断完善课件,在每一门课程的课件下方提供留言交流,学生可以对课件的内容和演示形式进行评价,并且提供建议。
③教学视频:提供嵌入式系统课程群各门核心课程教学视频的在线学习和下载,包括本校教师的教学视频和外校教师的教学视频,学生可以自主选择需要巩固学习的内容,通过教学视频进一步延伸课堂讲授教学。
(3)实践教学
嵌入式系统课程具有较强的实践性,强调培养学生的动手能力,因此如何引导学生掌握基本操作技能对于后续的深入学习以及实际的项目开发具有极其重要的作用。但从目前的情况看,由于实践课时少,难以保证每个学生都得到充分的训练。本栏目主要从三个子栏目入手为学生的实践操作提供预习、复习和训练的机会。
①实践大纲:提供各门核心课程课内实验的实验大纲或者课程设计大纲,让学生通过大纲了解不同课程实践操作所要掌握的基本技能。
②实践指导:提供各门核心课程课内实验的指导书或者课程设计指导书,为学生的实践操作提供必要的理论和技术指导,帮助学生掌握必要的操作步骤和方法。学生可以根据自己的具体情况,对实践指导提出建议。
③实践视频:提供各门核心课程课内实验的演示教学视频或者课程设计演示教学视频,帮助学生进一步学习实践操作的步骤和方法。
(4)自我测试
①理论题库:提供各门核心课程相关基础知识和基础理论的试题以及参考答案,供学生自我测试。
②实践练习:在完成基本实践操作的基础上,为巩固学生的动手能力,各门课程分别提供更加深入的实践操作练习,并提供必要的指导,如实践的步骤、实施流程等。同时,针对一些动手能力较强的学生,则以项目的形式给出具有综合性质的具体实践要求,由学生独立完成,帮助学生整合各门课程的基本技能。
(5)互动平台
主要实现师生之间、学生之间相互的学习交流,包括三个子栏目,均采用实名制。
①资料交流:教学平台中提供的资料主要来自于教师,但教师提供的资料毕竟是有限的,学生在学习过程中可能会获得其他学校的教学资料、与嵌入式系统相关的培训资料等,学生都可以提交到系统中,供教师和学生使用。为规范管理,所有提交的资料都要经过网站管理员的审核才能成功发布。
②在线答疑:采用即时通讯的方式实现在线答疑,由老师提前发布在线答疑时间公告,学生在指定时间内登录即可与老师进行即时交流。
③交流讨论:以BBS的形式对课程学习及项目开发中存在的问题进行讨论,每门核心课程作为一个板块,以及实践板块和项目开发板块,其中课程板块主要对相应课程的学习中存在的问题进行交流讨论;实践板块对实践过程遇到的疑问进行交流讨论;而项目开发板块则主要提供给学有余力的同学以及参加实际项目开发的同学。在讨论中,可以由一位用户(学生或者老师)发起话题,其他用户(老师或者学生)都可以给出自己的看法,充分体现百家争鸣的学习氛围。
3 结束语
本文初步建立了江苏科技大学嵌入式系统课程群网络辅助教学平台,并在学校内部试用,取得了一定的效果,尤其解决了师生之间的互动问题,但远远没有达到预期目标。如何进一步优化网络辅助教学平台结构和管理模式、整合嵌入式系统课程群教学资源,以充分发挥网络辅助教学平台的作用还有待于深入研究。
参考文献
[1]赵彦.Java课程群网络教学平台的构建[J].实验室研究与探索,2015,34(1):199-204.
[2]蒋雯音,杨芬红,励朗杰.基于Moodle的专业课程群集成网络教学平台研究[J].中国教育信息化,2013(9):53-55.
[3]陈乃金,周鸣争.“嵌入式系统”课程群的改革与实践[J].长春大学学报,2013,23(8):1044-1046.
[4]郑广海,曲英伟.嵌入式系统课程群实践教学优化整合与知识融合的研究[J].软件工程师,2015,18(6):58-60.
[5]姚文卿,董良威,韩益锋.应用型本科院校“嵌入式应用”课程群建设模式的探讨[J].考试周刊,2014,(37):157-158.
[6]孙静.面向能力培养的嵌入式系统课程群建设研究[J].电脑与电信,2013(11):63-64.
与往届相比,本届大赛的参赛作品呈现出多元化、结合时事、贴近生活等特点,增强现实技术在竞赛作品中的应用也越来越多。据大赛组委会秘书长、上海交通大学徐国治教授介绍,本届大赛的参赛队伍和参与人数均创下新高,共有来自9个国家和地区、76所高校的165支参赛队报名参赛。经过专家组的认真评审,评选出一等奖13个队,二等奖27个队,三等奖60个队。本届大赛开创性的采用了英特尔凌动处理器平台作为大赛指定的设计平台。
本届比赛的参赛作品中也涌现了大量密切结合行业热点及市场需求的创新设计,如应用增强现实技术的“幻境漫步者”、“具有触觉反馈机制的增强显示体验平台”、“Improving Exercise Bike Experience with Google Street View and Virtual Reality”等:涉及计算机视觉领域的研究热点“便携式三维重建系统”:以及面向办公行业的“基于云渲染的移动3D网络视频会议系统”等。
英特尔中国执行董事戈峻表示:“创新人才的培养是创新经济发展的保障。英特尔还将不断利用自身的优势,通过开展一系列端对端、全方位和开放式的教育项目,以教育推动创新,为中国的产业创新和发展做出贡献。”
(老虎)
村田建上海电磁兼容实验中心提升客户服务水平
目前,村田(中国)投资有限公司在上海投资建设的村田电磁兼容实验中心(又称:MURATA EMC-LAB)顺利落成,并正式启用。
据村田(中国)投资有限公司董事兼总裁竹村善人介绍,该实验中心位于上海市闸北区永和路181号,占地面积约399m2,总建筑面积约1,787m2。在实验中心总共拥有的四层楼中,建立了一间半电波暗室、一间全电波暗室和一间电磁屏蔽室,总投资约为10.2亿日元。
竹村善人特别强调,村田早在1988年起就建立了电波暗室,长期以来一直致力于解决电磁波干扰问题,在解决方案方面积累了很多经验,这也是其他公司不可复制的资源,在上海电磁兼容实验中心也是村田在日本以外首次建立的。
村田制作所EMI事业部部长间所新一先生表示,在中国建立这样一间电磁兼容实验中心,完全是市场的需求。从电子产品的发展趋势来看,正朝着高性能化和多功能化的发展,同时各个电子设备的工作环境也发生着改变。而这些显著的变化,导致了噪声环境的复杂性和多样性。这就显示出了噪声抑制越来越重要的作用。此前,村田公司已经收到了很多客户关于噪声抑制的需求,说明中国用户对噪声抑制关注程度也越来越高。
对于中国既庞大又重要的市场,村田公司希望能够在当地更直接地为客户提供更好地服务,这也是村田第一次在日本以外的地方提供电波暗室并提供服务,从现在开始在上海提供跟日本一样的噪声技术支持和噪声解决方案,这就意味着村田在提供电子元器件同时,又能提供先进的噪声解决方案。
单片机应用课程设计 专业: 电气工程及自动化 班级: 0906 学号: 09142063 姓名: 李健 日期: 2011-11-09 1
题目:北京交通大学海滨学院课程设计总结报告
一、单片机应用系统的设计过程:
1.1单片机应用系统
典型的单片机应用系统除主机外,还包括有:
1)
前向通道(即输入部分):数字量、开关量、模拟量信号(A/D)的输入。2)
后向通道(输出部分):数字量、开关量、模拟量信号(D/A)的输出。
3)
人机对话通道,即人机交互部分:键盘、显示器、打印机、看门狗(监视)电路等.4)
单片机应用系统组成:
1.2 单片机应用系统的设计 设计过程包括以下几部分: 1)总体方案的设计 2)硬件系统设计 3)软件系统设计 4)系统仿真调试 5)运行维护。
这5个部分不是孤立的,而是相互关联、相互依靠、互相制约的。
1.3 单片机应用系统的设计过程 ⑴.总体方案的设计
1)根据市场需求, 进行分析, 提出本项目的任务。2)熟悉和了解控制对象,确定合理可行的技术指标.3)确定系统功能具体实现形式, 选择出适合该项目,能迅速开发出性能价格比高的应用系统的单片机。
4)合理地划分硬件和软件两部分的功能要求。
5)确定总体方案,拟定设计任务书。按照软件工程的思想,列出各子系统的任务书, 以及软件、硬件及它们之间的接口标准、技术要求。
⑵.硬件系统设计 1)根据功能要求, 选择系统的CPU、存储器、I/O接口以及传感器、继电器、显示器、键盘等元器件。
2)原理图和PCB板(印制电路板)的设计。使用专门的EDA(电子设计自动化)工具软件(如Protel)。它们有强大的自动设计能力, 高速有效的编辑功能, 使得设计过程简便高效。3)制版和组装设计完成后,交付制版生产厂家。在PCB板和元器件齐套时,焊接组装。4)硬件调试利用电子仪器及编写测试程序,进行硬件调试。
⑶.软件系统设计
根据总体方案提出的要求和具体的硬件电路,设计出实现应用系统功能要求的控制程序。1)选择软件的开发环境,确定设计使用的编程语言 2)根据任务的要求,建立一个好的数学模型。
3)采用模块化程序设计方法。提高效率,保证可靠性。
4)软件设计开始,把软件要实现的功能结合硬件进行具体的定义。5)根据功能实现过程, 画出程序主流程图。6)编写程序。实现系统功能及抗干扰的要求。7)软件模拟仿真。调试。⑷.系统仿真调试
应用系统测试工作包括:
1)功能测评。根据技术指标要求, 逐项测试。完成功能测试, 指标测量, 追踪程序执行, 分析执行时间等。
2)系统优化。如硬件电路去除冗余器件,提升性能指标,降低功耗等。软件程序存储空间、循环优化等。
3)可靠性测试。检验其抗干扰能力、可靠性等。
系统仿真调试要在集成开发环境中完成。
软件仿真中, 在虚拟硬件平台上验证程序的正确性.硬件仿真通过仿真器、开发系统、ICE设备等,借助示波器、逻辑分析仪等电子测量仪器,对开发的目标系统进行实时在线仿真。
⑸.系统运行维护
1)应用系统在仿真调试环境中成功后, 确定硬件和软件基本正确,将程序代码固化到单片机的程序存储器中。独立运行该应用系统。
2)
在系统独立运行中,随时观察系统,有时需要对其进行改进。如果运行正常,就可以投入正常的工作中。
3)
一般来说,在连续工作的过程中,有可能出现调试中没有遇到的问题,需要设计人员进一步改进。经过一定时间的监护,系统运行正常,单片机应用系统的开发工作胜利完成。
二、89C51单片机系统的硬件电路设计
2.1 硬件系统设计过程
1)根据功能要求, 选择系统的CPU、存储器、I/O接口以及传感器、继电器、显示器、键盘等元器件。
2)原理图和PCB板(印制电路板)的设计。使用专门的EDA(电子设计自动化)工具软件(如Protel)。
3)制版和组装设计完成后,交付制版生产厂家。在PCB板和元器件齐套时,焊接组装。4)硬件调试 利用电子仪器及编写测试程序,进行硬件调试 5)89C51基本硬件系统的设计
为使硬件设计尽可能合理,应重点考虑以下几点。
1.尽可能采用功能强的芯片
1)单片机的选型。随着集成电路技术的飞速发展,许多外围部件都已集成在芯片内,本身就是一个系统,这样可以省去许多外围部件的扩展工作,设计工作大大简化。2)优先选用片内带有闪烁存储器的产品。例如,使用ATMEL公司的89C51/89C52/ 89C55,PHILIPS公司的89C58(内有32KB的闪烁存储器),可省去扩展单片机程序存储器的工作,减少芯片数量,缩小体积。
3)考虑EPROM空间和RAM空间。目前EPROM容量越来越大,一般尽量选用容量大的EPROM。89C51内部的RAM单元有限,当需增强软件数据处理功能时,往往觉得不足,这就要求系统配置外部RAM,如6264(8KB),62256(32KB)芯片等。
4)对I/O端口的考虑。在样机研制出来进行现场试用时,往往会发现一些被忽视的问题,而这些问题是不能单靠软件措施来解决的。如有些新的信号需要采集,就必须增加输入检测端;有些物理量需要控制,就必须增加输出端。如果在硬件设计之初就多设计出一些I/O端口,这些问题就会迎刃而解了。
5)预留A/D和D/A通道。和I/O端口同样的原因,留出一些A/D和D/A通道将来可能会解决大问题。2.以软代硬
原则上,只要软件能做到且能满足性能要求,就不用硬件。硬件多了不但增加成本,而且系统故障率也会提高。以软带硬的实质,是以时间换空间,软件执行过程需要消耗时间,因此这种代替带来的问题就是实时性下降。在实时性要求不高的场合,以软代硬是很合算的。3.工艺设计
包括机箱、面板、配线、接插件等。必须考虑到安装、调试、维修的方便。另外,硬 件抗干扰措施也必须在硬件设计时一并考虑进去。
复位电路
时钟电路 89C51外部扩展电路:
89C51电源电路等
三、89C51单片机系统的软件设计和调试
在进行应用系统的总体设计时,软件设计和硬件设计应统一考虑,相互结合进行。当系统的电路设计定型后,软件的任务也就明确了。
一般来说,软件的功能分为两大类。
一类是执行软件,它能完成各种实质性的功能,如测量、计算、显示、打印、输出控制等;
另一类是监控软件,它是专门用来协调各执行模块和操作者的关系,在系统软件中充当组织调度的角色。设计人员在进行程序设计时应从以下几个方面加以考虑:(1)根据软件功能要求,将系统软件分成若干相对独立的部分,设计出合理的软件总体结构,使其清晰、简洁、流程合理。
(2)各功能程序实行模块化、子程序化。既便于调试、链接,又便于移植、修改。(3)在编写应用软件之前,应绘制出程序流程图。多花一些时间来设计程序流程图,就可以节约几倍于源程序的编辑和调试时间。
(4)要合理分配系统资源,包括ROM、RAM、定时器/计数器、中断源等。其中最关键的是片内RAM分配。对AT89C51来讲,片内RAM指00H~7FH单元,这128个字节的功能不完全相同,分配时应充分发挥其特长,做到物尽其用。
3.1 汇编语言程序设计过程
汇编语言程序设计是面向过程设计的典型方法。
汇编语言程序设计分为以下几个步骤: 1.分析任务
首先,根据任务的要求,进行全面的分析,以便对任务有一个整体的概念。通过分析,明确要求:本项任务要解决的问题是什么;工作过程是怎么样的;现在的条件有哪些;对运行结果的要求、包括扩运行结果的进度和运算速度等。
单片机的应用项目都是软件和硬件紧密结合在一起的,因此,根据任务的要求,合理地设计硬件电路,合理地分配软件和硬件锁担负的工作。对于总体的需求,还要考虑系统的可靠性,时间精度的安排及成本等。
在分析任务的基础上提出硬件的电路和软件的设计方案。2.确定方案和算法
在对任务的分析和对硬件电路了解的基础上开始软件的设计。首先要找出问题的规律性,归纳出数学模型,可能会有不同的算法,对此进行分析、比较,找出最合适的算法。可以直接或间接利用一些已有的计算方法和程序设计方法。如果没有现成的算法和程序可借鉴,那就需要自己摸索,建立符合任务要求的软件方案和算法。3.画出程序流程图
程序流程图是使用一些图形,符号和带方向的线段等,吧程序设计的过程、解决问题的先后顺序直观地描述出来的一种方法。4.编写程序
根据流程图中描述的各部分的功能,编写出具体的程序。然后,按照流程图中各部分之间的关系整理出全部程序。
在编写程序之前,要合理地确定存储器中存储空间的分配及各种单元的安排。编写过程中,在指令的使用上,要尽量节省存储器数据存放单元、使程序缩短、使程序执行速度最快,并以此为原则。5.调试程序
程序编写完毕,经历过汇编过程,没有语法错误以后,要进行上机调试,这样才能检查出程序是否有逻辑上的错误、是否满足系统功能的要求。
单片机应用系统调的试一般需要借助开发器、仿真器等硬件和软件来进行,这些工具给程序的调试提供了直观、方便的环境、有很大帮助。3.2 汇编语言程序的调试 ⑴ Keil C51开发环境
⑵ Keil C51开发调试过程 1)新建源程序文件
Keil C51软件的工作界面中游一个源程序编辑窗口,可以在其中编辑、输入和编写汇编语言或C语言的源程序,并建立和保存一个汇编或C语言源程序文件,该文件为扩展名.ASM 或.C 文件。2)新建项目文件
在Keil C51开发环境中,新建一个项目文件,该文件扩展名为.UV2的文件。把要调试的源程序文件添加到该项目中。
从器件库中选择一个所使用的器件,针对目标硬件设置工作选项。3)编译(Build)项目
对项目进行编译,直达没有错误并生成目标文件.HEX 的目标文件为止。4)调试程序(Debug)
利用Keil C51集成开发环境中的调试工具,对目标程序进行调试,排错。5)固化程序
应用系统调试完成后,可以将目标程序固化到单片机中德程序存储器ROM中,结束开发工作。程序的固化可以通过专门的编程器来完成,也可以通过专门的程序下载接口来实现。
3.3 汇编语言程序的调试实例 以一个程序为例说明开发调试过程: 1.新建源程序文件
2.新建项目文件,进行参数选项和环境的设置。3.将源程序文件添加到该项目(Project)中。4.编译链接程序
5.调试程序 点击按钮 Use Simulator 纯软件仿真
, 进入调试环境
Use:Keil Monitor-51 Driver仿真器的仿真
四、89C51的应用系统设计实例
例1 设计一个实时时钟
解:1.实时时钟实现的基本思想
如何获得1秒的定时,可把定时时间定为100ms,采用中断方式进行溢出次数的累计,计满10次,即得到秒计时。
片内RAM中规定3个单元作为秒、分、时单元,具体安排如下: 42H:“秒”单元 ;41H:“分”单元;40H:“时”单元
从秒到分,从分到时是通过软件累加并进行比较的方法来实现的。2.程序设计
(1)主程序的设计
1)进行定时器T0的初始化编程并启动T0,并允许定时器T0中断(开中断); 2)对工作单元初始化——将小时工作单元40H、分工作单元41H和秒工作单元42H清零 3)通过反复调用显示子程序,等待20ms定时中断的到来。(2)中断服务程序的设计
中断服务程序(PIT0)的主要功能包括以下几个部分。
进行计时操作。程序开始先判断计数溢出是否满50次,不满表明还没达到最小计时单位1秒,中断返回;如果满50次,表示已达到1秒,程序继续向下运行,运行计时操作。当满1秒时则将记录“秒位”的42H单元内容加1,满60秒后向记录“分位”的41H单元内容加1,满60分钟则向记录“时位”的30H单元内容加1.当记满24小时的时候,工作单元40H、41H、42H单元的内容全部清空,重新开始计数。
(3)程序清单:
ORG 1000H AJMP MAIN
;上电, 跳向主程序;T0的中断入口
ORG 000BH AJMP IT0P MAIN: MOV TMOD,#01H;设T0为方式1 MOV 20H, #0AH;装入中断次数
CLR A MOV
40H, A;“时”单元清“0” MOV 41H, A;“分”单元清“0”
MOV 42H, A;“秒”单元清“0” SETB ET0 SETB EA
;允许T0申请中断;总中断允许
MOV TH0,#3CH;给T0装入计数初值
;启动T0 MOV TL0,#0B0H
SETB TR0
HERE: SJMP HERE;等待中断(也可调用显示子程序)IT0P: PUSH PSW;T0中断服务子程序入口, 保护现场
PUSH Acc
;重新装入初值
;1秒未到, 返回;重置中断次数;“秒”单元增1
MOV TH0,#3CH
MOV TL0,#0B0H
DJNZ 20H,RETURN
MOV 20H, #0AH
MOV A, #01H
ADD A,42H
DA A
MOV 42H,A
;“秒”单元十进制调整;“秒” BCD码存回“秒”单元
;计满60秒, “秒”单元清“0”;“分”单元增1
CJNE A,#60,RETURN;是否到60秒, 未到则返回
MOV 42H, #00H
MOV A, #01H ADD A,41H
DA A
;“分”单元十进制调整
;“分”的BCD码存回“分”单元;计满60分, “分”单元清“0”;“时”单元增1
;到24小时, “时”单元清“0”
MOV 41H,A
CJNE A,#60,RETURN;是否到60分, 未到则返回
MOV 41H, #00H
MOV A, #01H
ADD A,40H DA A
MOV 40H,A
;“时”单元十进制调整
CJNE A,#24,RETURN;是否到24小时,未到则返回 MOV 40H, #00H
;恢复现场;中断返回 RETURN: POP Acc
RETI
POP PSW END 例2 设计一个实用的数据采集和超限报警系统。
解: CPU:89C51单片机
主频:11.0592MHz 数据采集:16通道模拟量输入
多路选择器:4067(16选1模拟开关电路)A/D转换器: MAX187(12位串行接口A/D转换器)开关量输出:8路开关量输出。
看门狗: X5045(带E2PROM的看门狗定时器电路)实时时钟: DS1307(带64字节RAM串行RT电路)
串行通信接口:MAX485,提供RS-485标准接口
并行I/O接口:8255A并行I/O接口电路
显示器: 6位LED显示器和8个发光二极管。
键盘:4个按键,独立连接的非编码键盘
电源:DC+5V、DC+12V 软件:程序固化单片机中,采用汇编语言编程。数据采集系统功能框图:
单片机数据采集系统主流程图:
五、89C51单片机应用的新创意 LED点阵显示系统简介
随着图形点阵LED显示模块在各行各业的逐步使用,使得人机界面变得越来越直观形象,尤其对于国内大多数需要有汉字和图形显示的用户来说,显示界面的友好与否,将直接影响到其产品的形象和市场竞争力。
本文所介绍的点阵LED显示屏,显示汉字和各种常见字符等信息,可广泛应用于各种场所。具有结构简单、安装方便、字型美观、图案清析。采用高性能单片机控 制,性能稳定,可靠性高,具有掉电保护功能,可完全脱机运行,可以显示约2000个文字。经过一条RS-232串口线与电脑连接更换信息,操作简单,使用 方便。2 LED点阵显示系统的硬件设计
LED点阵显示系统由计算机、RS-232通讯电路、控制电路和LED点阵显示电路构成,结构框图如图1所示。
上位计算机可选择工业控制计算机或者普通个人计算机。单块条屏由控制电路和驱动显示电路组成。控制电路负责与上位机通信,可根据通信距离的远近选用RS-232或RS-485标准总线接口。本电路采用RS-232接口的3脚(TXD)和5脚(GND),计算机向控制电路发送汉字或字符内码;控制电路存储该 内码并在字库中对应汉字或字符点阵,向驱动电路发送行列选通信号;显示驱动电路负责根据行列选通信号,向指定LED发光器件提供驱动电流。3 软件系统
程 序可以实现与计算机的通信,可非常方便地任意修改所要显示的汉字;并使显示屏可 固定、平移地显示汉字。程序中将数据存储器分为三个区:显示缓冲区,数据存 储区和接收缓冲区[4]。单片机通过串口接收PC机传来的数据(包括显示内容,显示方式和显示状态)暂时放在接收缓冲区,处理后放入数据存储区保存,然后 再根据显示方式从数据存储区中读出数据放入显示缓冲区用于显示。显示方式的实现取决于数据放入显示缓冲区的顺序,左移是从数据存储区取出一位数放入显示缓 冲区,上移是每次取出一行数据放到缓冲区,时间显示是先把实时时钟的数据放到显示缓冲区。显示时并不识别显示缓冲区的数据,只是依次从显示缓冲区提取数据 向显示屏发送并送入相应的锁存消隐和行值信号,完成扫描。程序功能框图如图5所示。
设计题目:用键盘控制LED显示不同图形
中央民族大学 二零零八年十月三十一日
一、设计目的
了解LED点阵和矩阵键盘的工作原理。
二、设计内容
编写程序控制用矩阵键盘控制LED点亮,产生不同的图形。
三、设计方案
功能概述:
本设计要实现的功能是通过键盘控制LED点阵图形显示,如果键盘输入0-9十个数字时显示相应的数字,如果输入其他的键,则显示“+”号。
1、程序设计思路
本设计要实现键盘控制LED点阵图形显示,就必须要编写键盘和LED点阵的程序。先通过扫描矩阵键盘,得到键盘值,然后再调用点阵显示子函数,根据扫描的键盘值,在LED点阵上显示不同的图形。
2、主程序设计
主程序要实现的功能是矩阵键盘扫描,得到键盘值,然后把值传给LED显示函数。
程序流程图如下:
3、LED点阵显示函数设计
本函数要实现的功能是根据键盘的值,在LED点阵上显示不同的图形。如果键盘的输入值为0-9则显示相应的数字,如果输入的是其他值,则显示“+”。本程序采用二维数组存放要显示的图形的字模,然后再通过逐行扫描LED点阵,把要显示的图形分8次显示,一次显示一行,利用人眼的视觉暂留效应,是人看到的是一个图形一次显示出来,通过一个循环控制图形显示的时间。程序流程图如下:
4、点阵图形设计
根据8*8 LED点阵的原理,8X8 点阵共需要64 个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1 电平,某一行置0 电平,则相应的二极管就亮;
先绘制出要显示的图形如下:
根据图形中点亮的LED灯的位置,得到相应图形的16进制数,存放在二维数组Buf1[11][8]中。
所以要显示的图形的字模如下:
buf1[11][8]={ {0x3c,0x24,0x24,0x24,0x24,0x24,0x3c,0x00},//0
{0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08},//1
{0x3c,0x20,0x20,0x3c,0x04,0x04,0x3c,0x00},//2
{0x3c,0x20,0x20,0x3c,0x20,0x20,0x3c,0x00},//3
{0x24,0x24,0x24,0x3c,0x20,0x20,0x20,0x00},//4
{0x3c,0x04,0x04,0x3c,0x20,0x20,0x3c,0x00},//5
{0x3c,0x04,0x04,0x3c,0x24,0x24,0x3c,0x00},//6
{0x3c,0x20,0x20,0x20,0x20,0x20,0x20,0x00},//7
{0x3c,0x24,0x24,0x3c,0x24,0x24,0x3c,0x00},//8
{0x3c,0x24,0x24,0x3c,0x20,0x20,0x3c,0x00},//9
{0x08,0x08,0x08,0x3e,0x08,0x08,0x08,0x00}
//+
};
四、程序源代码
//*************************************************************** #include
#define DEVICE_NAME “/dev/led_ary_ctl” #define DEVICE_NAME1 “/dev/keypad”
void Key(unsigned char b[]);
//------main----int main(void){
int fd;
int ret;
unsigned char buf[2];
double x;
char pre_scancode = 0xff;
printf(“n start keypad_driver test nn”);
fd = open(DEVICE_NAME1, O_RDWR);
printf(“fd = %dn”,fd);
if(fd ==-1){
printf(“open device %s errorn”,DEVICE_NAME1);}
else {
buf[0]=0x22;
while(1)
{
read(fd,buf,1);
if(buf[0]!= pre_scancode)
{
if(buf[0]!=0xff)
{
printf(“key =%xn”,buf[0]);
Key(buf);
}
}
pre_scancode = buf[0];
usleep(50000);
}
// close
ret = close(fd);
printf(“ret=%dn”,ret);
printf(“close keypad_driver testn”);}
return 0;}// end main //***************************************************************************** //---------------void Key(unsigned char b[]){ int fd;
int ret;
int i,j,k;
unsigned char buf[2];
unsigned char buf2[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char buf1[11][8]={{0x3c,0x24,0x24,0x24,0x24,0x24,0x3c,0x00},//0
{0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08},//1
{0x3c,0x20,0x20,0x3c,0x04,0x04,0x3c,0x00},//2
{0x3c,0x20,0x20,0x3c,0x20,0x20,0x3c,0x00},//3
{0x24,0x24,0x24,0x3c,0x20,0x20,0x20,0x00},//4
{0x3c,0x04,0x04,0x3c,0x20,0x20,0x3c,0x00},//5
{0x3c,0x04,0x04,0x3c,0x24,0x24,0x3c,0x00},//6
{0x3c,0x20,0x20,0x20,0x20,0x20,0x20,0x00},//7
{0x3c,0x24,0x24,0x3c,0x24,0x24,0x3c,0x00},//8
{0x3c,0x24,0x24,0x3c,0x20,0x20,0x3c,0x00},//9
{0x08,0x08,0x08,0x3e,0x08,0x08,0x08,0x00}
//+
};
// begin of led ary
buf[0]= 1;
buf[1]= 0;
if(b[0]<=9)i=b[0];else
i=10;
fd = open(DEVICE_NAME, O_RDWR);
printf(“fd = %dn”,fd);
if(fd ==-1)
printf(“open device %s errorn”,DEVICE_NAME);
else {
for(j=0;j<=5;j++)
{
for(k=0;k<8;k++)
{
buf[0]=buf1[i][k];buf[1]=buf2[k];
write(fd,buf,2);
}
usleep(1);
}
// close
ret = close(fd);
printf(“ret=%dn”,ret);
printf(“close led_driver testn”);} } //-
五、设计结果
实现键盘控制LED点阵显示,输入0-9十个数字时显示相应的数字,如果输入其他的键,则显示“+”号。
六、心得体会
通过本次实验,我们对linux下的实验更加熟悉了,对LED点阵显示和矩阵键盘的原理有了深入的了解,掌握了点阵图形的设计方法和键盘的输入的读取,并把二者结合起来,实现了键盘控制点阵图形现实。
班 级:学 号:姓 名:成 绩:指导教师:
20090612 2009112107 侯金钟 武俊鹏、刘书勇 1.实验一
1.1 实验名称
嵌入式系统硬件开发环境
1.2 实验目的
1.熟悉UP-net3000实验平台。
2.超级终端设置及BIOS 功能使用。
1.3 实验环境
硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentium100 以 上、串口线。
软件:PC 机操作系统win98、Win2000 或WinXP、ARM SDT 2.51 或ADS1.2 集成开发 环境、仿真器驱动程序、超级终端通讯程序。
1.4 实验内容及要求
熟悉UP-net3000实验平台的硬件电路和外设,ARM JTAG的安装和使用,利用超级终端检验外设的工作状态。
1.5 实验设计与实验步骤
1.建立工程
(1)运行ARM SDT 2.5 集成开发环境(ARM Project Manager).(2)在新建的工程中,如图1A-2 所示,选中工程树的“根部”。
(3)因为开发板上的嵌入式处理器ARM7TDMI 没有浮点处理器,所以,如图1A-3 所
示,在弹出的对话框中设置Floating Point Processor 为none,并保持其他的设置不变。(4)选中工程树的“根部”,通过菜单Project | Tool Configuration for work1.apj | asmlink | Set,对整个工程的连接方式进行设置。(5)在弹出的对话框中,选中Entry and Base 标签,如图1A-4 所示,设置连接的Read-Only(只读)和Read-Write(读写)地址。
(6)选择Linker Configuration 的ImageLayout 标签,(7)选择Project | Edit Project Tamplete 菜单,弹出Project Template Editor 对话框。
(8)选择Project | Edit Variables for work1.apj,弹出Edit Variables for work1.apj 对话框。
2.进行程序的在线仿真、调试
1.6 实验过程与分析
熟悉UP-net3000实验平台的硬件电路和外设,安装了ARM JTAG,利用超级终端检验了外设的工作状态。
1.7 实验结果总结
软件安装成功,结果显示正常。
1.8 心得体会
通过此次试验,我对ARM的环境的功能有一定的了解与完善。对试验台有了基本的认识与使用。
2.实验二
2.1 实验名称
嵌入式系统软件开发环境
2.2 实验目的
1.熟悉ADS1.2 开发环境,学会ARM 仿真器的使用。
2.使用ADS 编译、下载、调试并跟踪一段已有的程序,了解嵌入式开发的基本思想和过程。
2.3 实验环境
硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentium100 以 上、串口线。
软件:PC 机操作系统win98、Win2000 或WinXP、ARM SDT 2.51 或ADS1.2 集成开发 环境、仿真器驱动程序、超级终端通讯程序。
2.4 实验内容及要求
本次实验使用ADS 集成开发环境。新建一个简单的工程文件,并编译这个工程文件。学习ARM 仿真器的使用和开发环境的设置。下载已经编译好的文件到嵌入式控制器中运行。学会在程序中设置断点,观察系统内存和变量。
2.5 实验设计与实验步骤
(1)运行ADS1.2 集成开发环境(CodeWarrior for ARM Developer Suite)。
(2)在新建的工程中,选择Debug 版本,使用Edit | Debug Settings菜单对Debug 版本进行参数设置。(3)在Debug Settings 对话框中选择Target Settings 项。在Post-linker一栏中选择ARM from ELF。
(4)在Debug Settings 对话框中选择ARM Linker 项
(5)在第四步中如果选择简单的地址连接设置,在Debug Settings 对话框中选择ARM Linker 项
(6)回到的工程窗口中,选择Release 版本,使用Edit | Release Settings 菜单对Release 版本进行参数设置。(7)参照第(3)、(4)、(5)、(6)步在Release Settings 对话框中设置Release版本的Post-linker、连接地址范围、入口模块和输出文件。(8)回到如图1B-3 所示的工程窗口中,选择Targets 选项卡,如图1B-11 所示。选中DebugRel 版本,按Del 键将其删除。DebugRel 子树是一个折衷版本,通常用不到,所以在这里删除。
2.6 实验过程与分析
1)回到工程窗口选中Debug 版本,执行菜单Project | Make 对工程进行编译连接。(2)在ADS 中执行菜单Project | Debug 启动ADS1.2 的调试工具AXD。(3)在AXD 中执行菜单Options | Configure Target 对AXD 进行设置。(4)点Select 按钮选择远程连接为ARM ethernet driver,点Configure 按钮输入仿真器的IP 地址。
(5)等待程序装载完毕以后,通过Execute | Go 菜单以及Execute | Stop(或者工具栏中的相应按钮)运行或暂停程序。程序暂停后在窗口中将显示出程序暂停的位置。(6)通过Execute | Step 菜单(或者工具栏中的相应按钮)可以单步运行程序。
(7)程序停止后可以通过Processor Views | Sources 菜单查看源文件,并可在适当位置按F9 设置端点。
(8)使用在Processor View 菜单下的Registers、Variables 和Memory 命令可以查看工作寄存器或者内存变量。读者可以逐一地尝试,为以后调试程序打下基础。
2.7 实验结果总结
超级终端输出“Hello World!”。
2.8 心得体会
基本了解了ADS1.2的配置条件,学会了ARM仿真器的使用方法。
3.实验三
3.1 实验名称
键盘及LED实验
3.2 实验目的
1.学习键盘及LED 驱动原理。
2.掌握ZLG7289芯片串行接口的使用方法,用ZLG7289芯片驱动17键的键盘和8个共阴极LED。
3.3 实验环境
硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentium100 以 上、串口线。
软件:PC 机操作系统win98、Win2000 或WinXP、ARM SDT 2.51 或ADS1.2 集成开发 环境、仿真器驱动程序、超级终端通讯程序。
3.4 实验内容及要求
通过ZLG7289芯片驱动17键的键盘和8个共阴极LED,将按键值在LED上显示出来。要求从右至左循环显示至少四位数字。
基本功能实现之后可考虑实现从左至右显示四位及四位以上数字(最大八位),并可设置清零键等扩展功能。
3.5 实验设计与实验步骤
利用所给的基础代码进行调试,观察输出结果,结合指导书和教材掌握基本原理和源代码的编写方式。根据实验的要求设计函数流程,并反复调试,实现功能。1.新建工程,将“Exp3 键盘及LED 驱动实验”中的文件添加到工程。2.定义ZLG7289 寄存器(ZLG7289.h)
#define ZLG7289_CS(0x20)//GPB5 #define ZLG7289_KEY(0x10)//GPG4 #define ZLG7289_ENABLE()do{ZLG7289SIOBand=rSBRDR;ZLG7289SIOCtrl=rSIOCON;rSIOCON=0x31;rSBRDR=0xff;rPDATB&=(~ZLG7289_CS);}while(0)#define ZLG7289_DISABLE()do{rPDATB|=ZLG7289_CS;rSBRDR=ZLG7289SIOBand;rSIOCON=ZLG7289SIOCtrl;}while(0)3.编写ZLG7289 驱动函数(ZLG7289.c)4.定义键盘映射表:(Keyboard16.c)
unsigned char KeyBoard_Map[]= {4,8,11,0,0,0,0,0,5,9,12,15,1,0,0,0,6,10,13,16,2,3,0,0,7,0,14,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//64 键值映射表,通过查找键盘映射表来确定键盘扫描码对应的按键值。
5.定义键值读取函数。(Keyboard16.c)6.编写主函数,将按键值在数码管上显示。
3.6 实验过程与分析
利用键盘驱动函数实现基本数字输入,然后利用循环左移函数实现输入数字做一样功能,并通过改变函数中相应delay的值来消除键盘按键带来的抖动。
3.7 实验结果总结
按键值可以在LED上显示出来。要求从右至左循环显示八位数字,同时可以复位清零。达到实验的效果。
3.8 心得体会
通过本次实验,我了解了LED的显示屏幕的数字的移位功能,这个功能不止可以用一个方法实现,而循环左移是其中比较巧妙且省力的一种,在遇到类似情况的时候,可以优先考虑能不能利用到文件中已经存在的函数,这样可以不必自己编写函数,省时省力。是一种可靠的方法。4.实验四
4.1 实验名称
电机转动控制及中断实验
4.2 实验目的
1.熟悉ARM本身自带的六路即三对PWM,掌握相应寄存器的配置。
2.编程实现ARM系统的PWM输出和I/O输出,前者用于控制直流电机,后者用于控制步进电机。
3.了解直流电机和步进电机的工作原理,学会用软件的方法实现步进电机的脉冲分配,即用软件的方法代替硬件的脉冲分配器。
4.了解44B0处理器上中断的应用。5.学习在44B0处理器上中断的应用。
6.进一步熟悉平台外围硬件及其驱动程序的编写。
4.3 实验环境
硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentium100 以 上、串口线。
软件:PC 机操作系统win98、Win2000 或WinXP、ARM SDT 2.51 或ADS1.2 集成开发 环境、仿真器驱动程序、超级终端通讯程序。
4.4 实验内容及要求
1.学习步进电机和直流电机的工作原理,了解实现两个电机转动对于系统的软件和硬件要求。学习ARM 知识,掌握 PWM 的生成方法,同时也要掌握 I/O的控制方法。
2.编程实现ARM芯片的一对PWM输出用于控制直流电机的转动,通过A/D旋钮控制其转动方式。
3.编程实现ARM的四路I/O通道,实现环形脉冲分配用于控制步进电机的转动,通过A/D旋钮控制步进电机的转角。
4.通过键盘控制直流电机与步进电机的切换。5.设置并启动定时器。
6.设置中断,编写定时器中断服务程序,对中断次数进行计数并在LED上显示结果。
4.5 实验设计与实验步骤
1.添加并打开工程。
2.进行直流电机初始化设置和代码编写。3.进行步进电机初始化设置和代码编写。
4.对Timer3编程,编写定时器中断服务程序,完成对中断次数的计数。5.编写LED计数显示函数,使LED能正确计数并显示0-9999。6.编写中断初始化函数和中断响应函数。7.终端下载测试。
4.6 实验过程与分析 1.对直流电机进行编程和测试,掌握转速和旋转方向的设定方法。
2.对步进电机进行编程和测试,掌握ARM的四路I/O通道,实现环形脉冲分配用于控制步进电机的转动,通过A/D旋钮控制步进电机的转角。
3.对主函数进行编程,用键盘响应直流电机与步进电机的切换控制。
4.掌握中断相关语句的应用,弄清定义的中断向量、中断向量号,编写中断响应函数,并完成中断响应控制。
4.7 实验结果总结
实现了直流电机与步进电机的基本设置和控制,可以通过键盘控制电机之间的切换。完成了中断的响应和定时中断。当对其中一个旋钮转动时,就可以由直流电机转换成步进电机的转换,达到实验的效果。
4.8 心得体会
通过本次实验,我了解了直流电机和步进电机的工作原理,同时也知晓了电机间的转换过程,了解其中的道理内涵,熟悉了ARM自带的A/D转换器的工作原理及编程方法,了解了中断的意义和实现方法,实现了简单了中断处理程序。同时我也收获了很多关于ARM处理机的相关知识。
5.实验五
5.1 实验名称
触摸屏驱动实验
5.2 实验目的
1.了解触摸屏的基本概念与原理。
2.理解触摸屏与LCD的关系。3.编程实现对触摸屏的控制。
4.熟悉用 ARM 内置的 LCD控制器驱动 LCD。
5.3 实验环境
硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentium100 以 上、串口线。
软件:PC 机操作系统win98、Win2000 或WinXP、ARM SDT 2.51 或ADS1.2 集成开发 环境、仿真器驱动程序、超级终端通讯程序。
5.4 实验内容及要求
1.了解触摸屏基本原理,理解对触摸屏进行输出标定、与LCD显示器配合的过程。2.通过编程实现触摸两点自动在两点间划直线。3.通过编程实现在触摸屏上动态画出曲线。5.5 实验设计与实验步骤
1.添加并打开工程。
2.在头文件中定义宏和常量及驱动函数。
#define ADS7843_CTRL_START 0x80 #define ADS7843_GET_X 0x50 #define ADS7843_GET_Y 0x10 #define ADS7843_CTRL_12MODE 0x0 #define ADS7843_CTRL_8MODE 0x8 #define ADS7843_CTRL_SER 0x4 #define ADS7843_CTRL_DFR 0x0 #define ADS7843_CTRL_DISPWD 0x3 // Disable power down #define ADS7843_CTRL_ENPWD 0x0 // enable power down #define ADS7843_PIN_CS(1<<6)//GPF6 #define ADS7843_PIN_PEN(1<<5)//GPG5 /////////触摸屏动作//////// #define TCHSCR_ACTION_NULL 0 #define TCHSCR_ACTION_CLICK 1 //触摸屏单击 #define TCHSCR_ACTION_DBCLICK 2 //触摸屏双击 #define TCHSCR_ACTION_DOWN 3 //触摸屏按下 #define TCHSCR_ACTION_UP 4 //触摸屏抬起 #define TCHSCR_ACTION_MOVE 5 //触摸屏移动
#define TCHSCR_IsPenNotDown()(rPDATG&ADS7843_PIN_PEN)(ADS7843_CTRL_START|ADS7843_GET_X|ADS7843_CTRL_12MODE |ADS7843_CTRL_DFR|ADS7843_CTRL_ENPWD)//采样x 轴电压值,数据为12 位,参考电压输入模式为差分模式,允许省电模式
#defineADS7843_CMD_Y(ADS7843_CTRL_START|ADS7843_GET_Y|ADS7843_CTRL_12MODE |ADS7843_CTRL_DFR|ADS7843_CTRL_ENPWD)int TchScr_Xmax=1840,TchScr_Xmin=176, TchScr_Ymax=195,TchScr_Ymin=1910;//触摸屏返回电压值范围 #defineADS7843_CMD_X 3.校准触摸屏坐标,进行坐标转换。
4.实现触屏取点并显示功能。
将触摸动作及触摸点坐标在超级终端上显示出来。5.实现两点间自动划线功能。6.实现触摸屏动态划线功能。
可以使用TchScr_GetScrXY()函数(第三个参数为0)来获得液晶屏的x、y 方向的电压
范围,分别点触摸屏有效面积的左上角和右下角,得到下列参数:
TchScr_Xmax=1840;TchScr_Xmin=176;TchScr_Ymax=195;TchScr_Ymin=1910;//此数值仅供参考,请以实际校对为准
5.6 实验过程与分析 1.在定义触屏响应功能的函数中对点击触屏进行响应函数的修改,在其中添加修改点颜色的函数,修改得到的触摸点的颜色,并显示在LCD上。
2.获取第一个点坐标并储存,获取第二个点坐标并储存,由编写的划线函数取得储存的两点间直线上所有点的坐标,并对其改变颜色,显示在LCD上,即完成划直线功能。
3.将划线函数应用到响应触屏移动消息的函数下,即可对连续获得的触摸坐标进行连续的画短直线,连接成曲线,完成动态划线功能。
5.7 实验结果总结
了解了触摸屏响应动作消息的函数的工作原理,通过修改实现了触摸屏响应不同动作进行画点、划线、动态划线的功能。验证触摸屏的灵敏度的实验。
5.8 心得体会
通过这次实验,我基本掌握了通过编程驱动触摸屏以及触摸屏响应时间,实现了触摸屏对不同动作消息的响应。同时也知晓了在触摸屏上的描点画线的实现,但是由于不知名的原因,描点画线的误差较大,位置偏差较大,同时触摸屏有时会不灵敏,出现时好时坏的现象,但是由于我们的辛勤钻研,最终克服了这个困难,实现了最后的触摸屏的实现。
6.实验六
6.1 实验名称
UCOS-Ⅱ在ARM微处理器上的裁剪
6.2 实验目的
1.了解UCOS-Ⅱ内核的主要结构。
2.掌握UCOS-Ⅱ裁剪的基本原理与嵌入式编程实现方法。3.学习如何根据具体情况对UCOS-Ⅱ操作系统进行裁剪。
4.通过对UCOS-Ⅱ配置文件(OS_CFG.H)中相关的配置常量进行设置,实现对UCOS-Ⅱ的裁剪。
6.3 实验环境
硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentium100 以 上、串口线。
软件:PC 机操作系统win98、Win2000 或WinXP、ARM SDT 2.51 或ADS1.2 集成开发 环境、仿真器驱动程序、超级终端通讯程序。
6.4 实验内容及要求
对UCOS-Ⅱ内核进行裁剪并移植到ARM7微处理器上。
6.5 实验设计与实验步骤 1.按照要求,载入STARTUP目录下文件,完成系统初始化、环境配置。2.载入UCOS-Ⅱ的全部源码,与处理器架构相关的文件位于arch目录下。3.在os_cpu.h中编写与处理器和编译器相关的代码。
4.编写os_cpu_c.c等6个与操作系统相关的函数。5.编写os_cpu.asm等4个与处理器相关的函数。
6.6 实验过程与分析
按照实验步骤进行,得到了需要的系统。
6.7 实验结果总结
按照要求进行了裁剪,得到了满足需要又紧凑的应用软件系统。
6.8 心得体会
通过本次实验,我了解了UCOS-Ⅱ内核的主要结构,掌握UCOS-Ⅱ裁剪的基本原理与嵌入式编程实现方法,学会了如何根据具体情况对UCOS-Ⅱ操作系统进行裁剪。
7.实验七
7.1 实验名称
UCOS-Ⅱ在ARM微处理器上的移植和编译
7.2 实验目的
1.了解UCOS-Ⅱ内核的主要结构。
2.掌握将UCOS-Ⅱ内核移植到ARM7处理器上的基本方法。
7.3 实验环境
硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentium100 以 上、串口线。
软件:PC 机操作系统win98、Win2000 或WinXP、ARM SDT 2.51 或ADS1.2 集成开发 环境、仿真器驱动程序、超级终端通讯程序。
7.4 实验内容及要求
1.将UCOS-Ⅱ内核进行移植到ARM7微处理器上。
2.编写两个简单任务,在超级终端上观察两个任务的切换。
7.5 实验设计与实验步骤
1.该实验的文件分为两类,其一是 STARTUP 目录下的系统初始化、配置等文件,其二是 UCOS-Ⅱ的全部源码,arch 目录下的 3 个文件是和处理器架构相关的。
2.设置 os_cpu.h 中与处理器和编译器相关的代码。
3.用 C 语言编写 6 个操作系统相关的函数(OS_CPU_C.C)。4.用汇编语言编写 4 个与处理器相关的函数(OS_CPU.ASM)。5.编写一个简单的多任务程序来测试一下移植是否成功。6.编译并下载移植后的 UCOS-Ⅱ。
7.6 实验过程与分析
1.按照实验步骤进行,将µC/OS-II 内核移植到了ARM7 微处理器上。2编写了两个简单任务,在超级终端上观察两个任务的切换。
7.7 实验结果总结
将µC/OS-II 内核顺利移植到了ARM7 微处理器上。
7.8 心得体会
通过本次实验,使我更加了解了µC/OS-II 内核的主要结构,掌握了ARM的C语言和汇编语言的编程方法,了解了ARM7处理器结构,掌握了将µC/OS-II 内核移植到ARM 7 处理器上的基本原理与嵌入式编程实现方法。
8.实验八
8.1 实验名称
综合实验
8.2 实验目的
对前七次实验进行总结,应用之前所学的知识,将前几次实验内容结合起来,完成键盘,LED,触摸屏,直流电机,步进电机各种功能的组合。实现一个较为全面的功能结构。
8.3 实验环境
硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentium100 以 上、串口线。
软件:PC 机操作系统win98、Win2000 或WinXP、ARM SDT 2.51 或ADS1.2 集成开发 环境、仿真器驱动程序、超级终端通讯程序。
8.4 实验内容及要求
对前七次实验进行总结,应用之前所学的知识,完成自拟的嵌入式系统,要求综合前期基础实验的各种功能。
8.5 实验设计与实验步骤
1.添加并打开工程。2.进行LCD设计,在LCD显示屏输出文本。
3.进行LED及键盘设计,完成LED输出显示功能和键盘输入功能。4.进行电机控制设计,完成键盘控制电机转动功能。5.进行中断设计,完成定时中断功能。
6.进行触摸屏设计,完成触摸屏感应和划线功能。7.进行裁剪和移植功能设计和完成。
8.6 实验过程与分析
1.完成LCD显示功能,在LCD显示屏上输出文本:“Hello World!”。2.进入界面触屏控制选择功能,实现触屏选择功能。
3.自定义四种种功能,第一为电机控制,从键盘读取命令,并将功能编号显示在LED上,LED显示的是计数的数据,同时旋转按钮完成电机转速的控制选择。
4.第三种功能为划线,功能编号显示在LED高四位上,同时LCD屏幕清屏,为划线功能做准备,可以实现划线功能。
5.第四种功能为定时中断,当由键盘控制时,LED显示数值清零,实现了中断。6.实现裁剪与移植功能。
8.7 实验结果总结
完成了各种基本功能,并通过自拟的系统将各种功能整合起来,完成了一个小的嵌入式系统,对前七次的功能有了更深入的了解。通过LED的计数,当在计数值在前30秒之内,由键盘控制LED的数值及显示,按键盘上的某一个按键,实现对LED上的数值清零,后30秒由触摸屏控制清零,并且在前30秒之内,旋转按钮,实现对直流电机的运转,并且到步进电机的转换。
8.8 心得体会
为了这个培养目标,在进行课程体系设置时,主要是从三个方面考虑:一是电子技术知识,既有模电也有数电;二是计算机编程知识,即软件开发这一块,实现嵌入式程序的设计;三是计算机硬件这一块,能对单片机及一些控制芯片进行应用。其中编程知识的学习,包括第一学年的主干课程《C语言程序设计》,第二学年开设《面向对象编程技术》课程。在嵌入式专业人才培养方案中,并没有限定面向对象编程课程具体讲授哪一种面向对象编程语言,在教学内容上,有这样几种常用的语言是可以选择的:Java语言,这是一种典型的面向对象编程语言,现在应用也比较广泛;再就是C#语言,与C语言有一定的衔接,同样也是面向对象编程,应用也比较多。这两种语言语法简洁、实用,易学好懂,学生容易产生兴趣,教学效果较好。另外一个选择是C++语言。
那么,在这3种语言中,该以哪种语言作为嵌入式专业学生学习面向对象程序设计的样板呢?不妨从如下几个方面作一个比较:
1 与C语言的关系
嵌入式系统编程不同于一般形式的软件编程,它是建立在特定的硬件平台上,其编程语言应具备较强的硬件直接操作能力。当然,汇编语言具备这样的特质。但是,由于汇编语言开发的复杂性,它并不是嵌入式系统开发的一般选择。与之相比,C语言—一种“高级的低级语言”,则成为嵌入式系统开发的最佳选择。
C++和C#,以及Java这3种语言都是面向对象(OOP)的,都使用了类似C语言风格的语法,但C++并不是纯面向对象的,它保留了很多模块化的东西。C++与C的关系更紧密一些。它是基于C发展起来的程序设计语言,是C的一个面向对象的解释。C++为C扩充了大规模工程应用,复杂的系统结构和掌控方法,对C有着很好的兼容性,而C#和Java对C语言没有任何兼容性。
2 语法
Java和C#相对于C++的不同最大的有两点:第一点是他们运行在一个虚拟环境之中,第二点就是语法简单。前二者非常相似,都抛弃了最灵活,同时也是应用起来最复杂的指针问题,不再深入地址单元去执行相关操作,对内存的管理完全自动化,这样虽然带来了程序的稳定性和安全性,但是在某种程序上丢失了效率。
除了语法的相对简单,Java还提供了丰富的类库帮助你解决应用问题———因为它是面向应用的语言,包括多线程标准、JDBC标准、GUI标准,而这些标准在C++中是不存在的。C#没有宏和模板,不允许多重继承,而这些都是C++的重要应用方面。C++语言的强大功能和灵活性是建立在其复杂的语法之上的,因此对于初学者来说,不象C#、Java语言那样容易上手。
3 应用领域
目前,在Web开发上,C++没有多大的市场。在企业级应用软件的开发上,以Java、C#居多,正是这两种语言的简洁实用,使软件的开发周期大大缩短,但这个领域C++仍占有一席之地。在系统级的开发上,C/C++应用居多。这3种语言各有特色。总的来说,C++的应用集中在如下主要领域:
高级系统程序设计:包括操作系统核心、网络管理系统、编译系统、文字排版系统、图像和声音的编排系统、通讯系统、数据库系统等等。在网络软件的设计方面,C++拥有很多成熟的用于网络通信的库,其中最具有代表性的是跨平台的、重量级的ACE库,该库可以说是C++语言最重要的成果之一。操作系统编程中,C语言是主要使用的编程语言,但C++凭借其对C的兼容性,以及面向对象的性质在该领域也崭露头角。
嵌入式系统:近5年来,C语言在嵌入式软件开发中使用最多,同时,C++在嵌入式软件设计领域维持27%左右的占有率。
视频游戏:C++的效率是一个很重要的原因。
在科学计算领域,FORTRAN是使用最多的语言之一。但是近年来,C++凭借先进的数值计算库、泛型编程等优势在这一领域也应用颇多,包括仿真、实时数据获取和数据库访问等等。
另外,在设备驱动程序、分布式应用、移动(手持)设备等领域,C++语言也占据着比较重要的地位。
就Java和C#二者单独来看,C#更像是微软公司和SUN公司进行商业斗争的产物。历史上,微软公司是支持过Java语言的,代表性的产品有Visual J++和WFC。后来因为众所周知的原因,微软公司推出了C#,其目的很明确,就是和Java竞争。
实际上C#和Java在特性上也非常类似(不仅仅是语法)。二者都是为了更加方便地解决应用问题,在GUI、数据库访问、网络通信、多线程等和实际应用密切相关的点上都有成熟的解决方案。C++更多地靠第三方的库来实现这些功能,因为C++是一个国际标准,要在C++中加入这些语言之外的、面向应用的特性还需要很长一段路要走。而C#、Java的拥有者是商业化公司,各种动作自然要敏捷得多。
4 结论
C++可以说是全世界应用最广泛的语言,主流语言中功能最强大,开发平台多,同时它在嵌入式系统开发的作用也是不容忽视的。对于嵌入式专业的学生来说,C++是他们学习面向对象编程课程的最佳选择。
摘要:目前高职高专院校的计算机嵌入式专业,在开设《面向对象程序设计》课程时,选择何种具有面向对象编程特点,同时切合嵌入式专业的编程语言作为教学内容,是设置该课程需要考虑的问题。在对C#、Java以及C++3种面向对象编程的语言进行比较后,选择C++语言最合适。
关键词:面向对象程序设计,Java,C#,C++
参考文献
[1]强锋科技,朱洪波.Visual C++完全自学宝典[M].北京:清华大学出版社,2008.
[2]王斌.常用嵌入式高级编程语言比较[J].蒙自师范高等专科学校学报,2002,4(6).
【北京科技大学 嵌入式课程设计报告】推荐阅读:
北京科技项目课题科技经费预算06-28
北京科技大学期末试卷06-24
北京科技大学毕业证书11-13
北京信息科技大学课设06-03
操作系统北京科技大学07-22
北京科技大学 双评文件11-23
北京科技馆作文600字05-31
中国科技大学北京校友会04-18
《北京信息科技大学学报》编辑部03-08
北京科技大学:硕士生招生情况09-24