嵌入式课程设计报告北京科技大学Word格式文档下载.docx
《嵌入式课程设计报告北京科技大学Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《嵌入式课程设计报告北京科技大学Word格式文档下载.docx(26页珍藏版)》请在冰豆网上搜索。
4.4基本功能的实现4
4.5时钟功能的实现5
4.5按键设置时钟6
4.5文本框设置时钟12
5实验结果13
5.1基本功能13
5.2时钟功能14
结论15
参考文献16
附录17
1程序清单led_1Dlg.cpp17
2程序清单led_1Dlg.h27
引言
通过嵌入式控制系统课程的学习并结合本次实验,使学生了解嵌入式系统的开发方法和流程,熟悉IntelXScale硬件平台及其应用处理机的使用方法,熟悉WindowsCE嵌入式系统的基本原理、概念。
并能针对IntelXScale硬件平台、应用需求自行定制、优化WinCE操作系统,并独立编写可在IntelXScale嵌入式设备上运行的应用程序。
本小组由三人组成,程顺均、白茹和马志达。
在课程设计中,分工明确,团结协作,最终顺利完成里基本题目的第一个题目并且自行设计一个功能复杂的电子表。
程顺均负责了主要的程序设计,白茹和马志达负责硬件的连线等。
LED数码管驱动程序
1实验内容
基本功能:
要求编写一个测试程序,实现PXA270-EP目标板上的LED数码管循环显示数字2,4,6,8。
扩展功能:
使用数码管和相关控件实现一个24小时制的时钟,液晶屏界面和数码管同时显示时间,并方便更改。
2实验设备
1、GX-PXA270EP实验箱
2、装有windowsXP的PC
3实验设计原理
3.1LED发光管原理
LED(LightEmittingDiode),即发光二极管。
是一种半导体固体发光器件。
它是利用固体半导体置于一个有引线的架子上,然后四周用环氧树脂密封,起到保护内部芯线的作用,所以LED的抗震性能好。
发光二极管的核心部分是由p型半导体和n型半导体组成的晶片,如图3.8.2,在p型半导体和n型半导体之间有一个过渡层,称为p-n结。
在某些半导体材料的PN结中,注入的少数载流子与多数载流子复合时会把多余的能量以光的形式释放出来,从而把电能直接转换为光能。
PN结加反向电压,少数载流子难以注入,故不发光。
这种利用注入式电致发光原理制作的二极管叫发光二极管,通称LED。
当它处于正向工作状态时(即两端加上正向电压),电流从LED阳极流向阴极时,半导体晶体就发出从紫外到红外不同颜色的光线,光的强弱与电流有关。
3.2八位LED显示器
八段LED显示器由8个发光二极管组成。
基中7个长条形的发光管排列成日”字形,另一个贺点形的发光管在显示器的右下角作为显示小数点用,它能显示各种数字及部份英文字母。
LED显示器有两种不同的形式:
一种是8个发光二极管的阳极都连在一起的,称之为共阳极LED显示器;
另一种是8个发光二极管的阴极都连在一起的,称之为共阴极LED显示器。
图3-1数码管内部原理图
4实验步骤
4.1加载驱动程序
任何简单的硬件在操作系统上调用时都需要驱动程序,数码管也不例外。
由于时间的限制,本次实验的开发板上的flash里面已经烧录了加载驱动的windowsCE操作系统,所以只需要打开相应的EVC开发软件开发即可。
4.2添加控件
为了让数码管在一个程序下演示两个功能,所以这里添加了一个基本功能的按钮,当按下这个按钮时,数码管进入循环显示状态,数码管从左到右轮流显示,分别显示2、4、6、8,时间间隔为1S。
添加按钮控件后,在属性里面更改其外观。
图4-1添加按钮控件效果图
4.3添加按钮响应程序
单独的添加了按钮,只是在界面上多了一个按钮罢了,但是按钮按下后还没有响应程序。
在对话框的编辑界面下,双击按钮,输入响应函数名称,即插入了相应的消息处理函数。
如复位按钮的处理函数。
voidCLed_1Dlg:
:
OnButton1()
{
//TODO:
Addyourcontrolnotificationhandlercodeherefor(inti=0;
i<
4;
i++)
ledshow[i]=0;
}
show();
以同样的方式为每个按钮添加处理函数。
本设计界面一共包含13个按钮控件。
12个用于设置时间的按钮,1个基本功能按钮。
4.4基本功能的实现
基本功能是要求4位7段数码管依次显示2、4、6、8,时间间隔1S。
基本实现方
式是使用定时器,定时为1S,并添加定时中断处理函数。
其实现的流程图如下:
在第i位显示2*(i+1)
i++
i=0
图4-2基本功能实现流程图
4.5时钟功能的实现
为了实现时钟,同样需要使用定时器。
设备只有4位数码管,所以不显示秒而只显示时和分。
在对话框类里面定义成员数组变量,用于保存时间的4个位。
Ledshow[0]
Ledshow[1]
Ledshow[2]
Ledshow[3]
图4-3四位数码管显示变量表示图
显示的4位数字并不是任意的,有一定的约束和规律,如分显示到59时的下一个状态时00而不是60,时显示到23时的下一个状态是00而不是24。
这样的规则应该应用于定时响应函数中。
也就是voidCLed_1Dlg:
OnTimer(UINTnIDEvent的实现代码中。
图4-4四位数码管显示变量表示图
4.5按键设置时钟
时间与标准时间不一样时,需要进行校正。
本次实验的时钟设置的方式有两种,直接输入校正和按钮校正。
按钮校正时,一共有8个按键,分别对应4个数字的加操作和减操作。
但是由于存储的时候保存为整形,所以不能无节制的加减,得有一定的规则。
下面为按键的程序框图。
图4-5小时十位加调整按键响应程序流程
图4-11分钟个位加调整按键响应程序流程图图4-12分钟个位减调整按键响应程序流程图
时钟在运行过程中是00:
00~23:
59勺24个状态中的一个,所以在调整时间的时候必须要限制其状态。
其具体的规则如上面流程图所示:
小时个位不能大于2
当小时个位大于3时,个位不能大于1
当小时个位小于4时,个位不能大于2
当小时十位大于1时,个位不能大于3
当小时十位小于2时,个位不能大于9
小时的个位和十位都不能小于零
分钟十位不能大于5,
8、分钟个位不能大于9
9、分钟的十位和个位不能小于零
4.5文本框设置时钟
文本框是windowsCE中的一个常用的控件,将文本框拖到对话框中,将属性设置为可写,并设置其ID为ID_EDIT1。
使用GetDIgltemlnt(IDC_EDIT1,&
b,FALSE)函数可以读取文本内容,并将其转换为整数。
使用sprintf(str,"
%d"
val可以将获取的整数转换为字符串,最后通过对每个字符减去'
'
的偏移,即可到到四个数字。
最后将四个数字赋给时钟的四个变量即可。
图4-13文本设置时间提交按钮响应程序流程图
5实验结果
5.1基本功能
程序编写好后,下载实验板上,运行起来一个窗口界面
图5-1程序运行的窗口
点击基本功能按钮就会出现2、4、6、8的轮流显示的效果,每次只显示一位,每一位的显示时间为1S,并且无限循环下去。
当按下停止按钮,循环停止
图5-2基本功能效果图之一
5.2时钟功能
在停止模式下,从文本框中设置好时间提交,则可以设置当前时间,然后按下使用按钮,时钟开始运行。
标准时间模式下,一分钟数据时间更新一次。
实验中为了方便看到现象,使用SetTimer(1,1000,NULL替换了SetTimer(1,60000,NULL)这样时间加快了更新。
八个按键可以再停止模式或者运行模式调整时间,由于按键处理函数加入了对数字的限制,所以不会得到非法的时间。
另外,在用于显示的函数中加入了对文本框的设置函数,所以文本框中的内容,所以文本框的内容始终会与数码管的内容保持一致。
图5-3时间运行到02:
05的效果
结论
windowsCE是一个界面友好的嵌入式操作系统,系统提供了丰富了控件,极大的方便了用户的开发。
C++是优秀的编程语言,在EVC环境下,编写的难度大大降低,尤其是界面的处理。
由于实验平台提供了相应的驱动程序,所以本次实验并不需要了解其硬件操作,大大缩短了一个嵌入式应用的开发速度。
通过本次嵌入式实验的操作,初步掌握了嵌入式软件开发的流程,对操作系统的裁剪、移植、应用软件的开发有了更加深入的理解。
参考文献
[1]杨旭著.嵌入式课程设计(小学期).北京:
北京科技大学,2008.
[2]古万荣著.VisualC++完全自学手册[M].北京:
北京.机械工业出版社,2009
1程序清单led_1Dlg.cpp
1〃led_1Dlg.cpp:
implementationfile
#include"
stdafx.h"
#include"
led_1.h"
led_1Dlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE
#endif
/////////////////////////////////////////////////////////////////////////////
//CLed_1Dlgdialog
CLed_1Dlg:
CLed_1Dlg(CWnd*pParent/*=NULL*/)
CDialog(CLed_1Dlg:
IDD,pParent)
〃{{AFX_DATA_INIT(CLed_1Dlg)
//NOTE:
theClassWizardwilladdmemberinitializationhere
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32m_hIcon=AfxGetApp()->
LoadIcon(IDR_MAINFRAME);
DoDataExchange(CDataExchange*pDX)
CDialog:
DoDataExchange(pDX);
〃{{AFX_DATA_MAP(CLed_1Dlg)
theClassWizardwilladdDDXandDDVcallshere
//}}AFX_DATA_MAP
BEGIN_MESSAGE_MAP(CLed_1Dlg,CDialog)
〃{{AFX_MSG_MAP(CLed_1Dlg)
ON_BN_CLICKED(IDC_BUTTON1,OnButton1)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_BUTTON2,OnButton2)
ON_BN_CLICKED(IDC_BUTTON3,OnButton3)
ON_BN_CLICKED(IDC_BUTTON4,OnButton4)
ON_BN_CLICKED(IDC_BUTTON5,OnButton5)
ON_BN_CLICKED(IDC_BUTTON6,OnButton6)
ON_BN_CLICKED(IDC_BUTTON7,OnButton7)
ON_BN_CLICKED(IDC_BUTTON8,OnButton8)
ON_BN_CLICKED(IDC_BUTTON9,OnButton9)
ON_NOTIFY(NM_OUTOFMEMORY,IDC_SLIDER1,OnOutofmemorySlider1)
ON_BN_CLICKED(IDC_BUTTON1O,OnButton10)
ON_BN_CLICKED(IDC_BUTTON11,OnButton11)
ON_BN_CLICKED(IDC_BUTTON12,OnButton12)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BUTTON13,OnBasic)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//CLed_1Dlgmessagehandlers
BOOLCLed_1Dlg:
OnlnitDialog()
OnlnitDialog();
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'
smainwindowisnotadialog
SetIcon(m_hlcon,TRUE);
//Setbigicon
SetIcon(m_hlcon,FALSE);
//Setsmallicon
CenterWindow(GetDesktopWindow());
//centertothehpcscreen
Addextrainitializationhere
m_hDev=
CreateFile(_T("
LED2:
"
),GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
if(m_hDev==INVALID_HANDLE_VALUE)
AfxMessageBox(_T(打开设备失败!
请联系程顺均"
));
m_hDev_IO=
GPIO1:
if(m_hDev_IO==INVALID_HANDLE_VALUE)
returnTRUE;
//returnTRUEuniessyousetthefocustoacontrol
Addyourcontrolnotificationhandlercodehere
for(inti=0;
//复位,清零
〃调用显示函数,显示
show()〃CLed_1Dlg类的成员函数,用于数码管驱动和文本框的显示
BYTEdata[4];
DWORDbytes;
charstr[4][16];
CStringall;
〃用于文本框显示的字符串
data[i]=ledfont[ledshow[i]];
〃获取显示码
WriteFile(m_hDev,data,4,&
bytes,NULL);
〃驱动数码管显示
for(i=0;
sprintf(str[i],"
ledshow[i]);
〃将字符格式化存于str[]数组中
all+=str[i];
〃将字符拼接起来
SetDlgltemText(IDC_EDIT1,all);
〃在文本框中显示
m_bvalue!
=m_bvalue;
WriteFile(m_hDev_IO,&
m_bvalue,4,&
//LED亮或者灭
OnDestroy()
:
0nDestroy。
;
CloseHandle(m_hDev);
Addyourmessagehandlercodehere
OnButton2()
ledshow[0]++;
〃如果十位大于2,要清零
〃如果个位已经大于4,则十位最多加到1,
〃如果个位小于4,则十位最多最多加到2
if(ledshow[0]>
2||ledshow[0]*10+ledshow[1]>
23)
ledshow[0]=0;
〃清零
〃调用显示函数
OnButton3()
ledshow[0]--;
if(ledshow[0]<
0&
&
ledshow[1]>
3)〃十位不能小于零,个位已经大于3
ledshow[0]=1;
//此时个位最大为1
elseif(ledshow[0]<
ledshow[1]<
4)//十位不能小于零,个位小于4
ledshow[0]=2;
//此时个位最大为2
OnButton4()
〃如果十位小于2,则个位最多加到9
〃如果个位等于2,则个位最多加到3
//也就是小时数必须是0~23之间变动
ledshow[1]++;
if(ledshow[0]*10+ledshow[1]>
23||ledshow[1]>
9)
ledshow[1]=0;
OnButton5()
ledshow[1]--;
if(ledshow[1]<
2!
=ledshow[0])〃个位不能小于零,小时小于20
ledshow[1]=9;
//个位置9
elseif(ledshow[1]<
2==ledshow[0])〃个位不能小于零,小时大于19
//此时个位一定不能大于3
OnButton6()
Addyourcontrolnotificationhandlercodehereledshow[2]++;
if(ledshow[2]>
5)
ledshow[2]=0;
〃分钟十位不能大于5
OnButton7()
Addyourcontrolnotificationhandlercodehereledshow[2]--;
if(ledshow[2]<
0)//分钟十位不能小于0
ledshow[2]=5;
OnButton8()
Addyourcontrolnotificationhandlercode