嵌入式控制系统课程设计 -计算器_第1页
嵌入式控制系统课程设计 -计算器_第2页
嵌入式控制系统课程设计 -计算器_第3页
嵌入式控制系统课程设计 -计算器_第4页
嵌入式控制系统课程设计 -计算器_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式课程设计|自1103高云峰嵌入式控制系统课程设计计算器学院:自动化学院班级:自1103姓名:高云峰学号:41151092指导教师:杨旭同组人:2014年7月12日摘要本设计在EmbeddedVisualC++集成开发环境下编写程序,通过键盘或触摸屏的输入,实现计算器的顺序计算并且实现判断优先级计算,自动判断数据的正确性(不多于小数点、数字以0开头、左右括号前出现数字)及合理性(被除数为0、单个数据超过10位),在4位LED上面轮流显示8位计算结果,控制LED灯和驱动LED数码管的应用程序,并在WinCE平台下运行,实现在PXA270实验箱的数码管上和对话框的数字显示控件上同步显示手动输入的数字、数码管按照预设频率循环显示数字等功能。关键词:WinCE操作系统EVC集成开发环境PXA270实验箱LEDGPIO对话编辑框AbstractThisapplicationisattemptedimplementacalculatorwhichhastheabilitytoorderlycalculateandjudgethepriorityofthecalculation,aswellastotestthevalidityandtherationalityofthedata.ItistriggeredbytheinputfromthekeyboardorthetouchscreenandprogrammedinEmbeddedVisualC++integrateddevelopmentenvironment.Besides,withtheWinceplatform,itcoulduse4LEDtoindicatethe8-bitoutcomeofthecalculatorcircularly,controlthe4LEDanddrivetheapplicationprogramofthedigitalLED,soastocompletethemissionwhichaimstoshowthenumberkeyedbytheoperatorbothontheLEDofthePXA270experimentalboxandtheeditboxofthescreensimultaneously.Theapplicationalsoownsthefunctiontochangethecolorofthenumbershowedintheeditboxofthescreeninaconstantfrequency.Keywords:WinCEOSEVCIDEPXA270experimentboxLEDGPIODialogueeditbox目录27991设计目的 设计目的(1)通过理论学习、查阅资料、软件设计、系统调试等环节,巩固和提高所学的知识和应用水平,进一步学习和领悟嵌入式程序开发的方法和流程。全面综合的应用所学基础知识,建立起一个完整的嵌入式系统开发过程的概念。(2)了解WinCE操作系统的概念。学会在EmbeddedVisualC++集成开发环境中开发应用程序。(3)通过做实验,测试应用程序功能,直观的了解PXA270实验设备的组成部分,尤其是课程设计中经常用的一些外部设备。(4)通过课程设计,了解嵌入式编程的特点,并且通过自己的实践,解决嵌入式编程的各种问题。(5)通过完成这个课程设计,要培养分析问题和解决问题的能力;实际动手操作的能力;查阅中外文献的能力;制定设计方案的能力;计算机应用的能力;设计计算和绘图的能力;语言文字表达的能力;团队合作的能力,并能从中得到一定的收获与启发。2设计功能与设计特色2.1设计功能本次嵌入式控制系统课程设计试图将老师提供的课程设计题目综合在一起,以对话框为主界面,利用EVC编程,尽可能的实现一个集多种功能于一体的综合小设计。其功能包括:(1)创建了一个计算器,可以实现顺序计算与判别优先级计算;可以自动判断数据的正确性(如:参加计算的数不多于10位,否则提示“数据溢出”);提示“算术逻辑错误”,在一些常见的错误方面,如:数字以0开头,被除数为0;有括号优先级运算。(2)创建文本编辑框,用于显示运算式及输出结果,并将文本框的背景色设置为黑色。设置“清零”按钮控件,用来清除输入框内容,以便重新输入新的内容;设置“清除”按钮控件,用来将前一步输错的内容删除,可以接着输入正确的内容。(3)创建了一个LED数字显示控件,该控件可以显示输入框内输入的内容及计算器输出结果,此外结合PXA270八段数码管,将计算内容同时显示在数码管上。创建了一个循环模块,其功能是将计数器的计算结果在PXA270的4个八段数码管上循环显示。循环方式为右循环,设置循环间隔时间为任意输入值。2.2设计特色本次设计不仅能够完成课程设计题目的其中计算机的基本要求,并且我们小组精益求精,将3项要求结合在一块,并在原有功能的基础上进行了修改和完善,实现了更为理想的功能,实现了计算器的各种功能,我们主要的设计特色有:(1)本设计功能丰富,分模块进行,分为计算器、显示、颜色三个模块,界面设计以GroupBox控件划分,界面显得清楚明了且整齐大方。(2)在显示模块中,含有“清除”、“清零”按钮,可以方便重新输入新的内容,而不必关闭对话框再打开输入,同时这也是考虑到PXA270实验箱上键盘部分没有清除键而增加的。(3)在颜色模块中,用户通过改变是三个滑条的值,来改变计算机显示文本框中数字的颜色。在改变滑动条的同时,可以在右边的编辑框中显示当前红、绿、蓝三原色各自的数值,这样可以十分准确的改变颜色为用户需要的颜色。程序设计时分别编写有改变字体颜色的函数和改变背景颜色的函数(已注释),通过简单修改即去除注释,也可完成改变背景颜色的功能,或者同时使用两种功能。(4)在数码管显示模块,可以轮流显示多于四位的的内容和小数点,且循环间隔的时间都不是固定的,可以进行修改,这样更加有利于用户在使用时,当不满足其需求时可以方便修改。(5)为了处理异常情况,比如说编辑框未输入内容或输入不正确的内容,将给出报错信息,提示输入正确的内容。3功能模块设计3.1计算器模块3.1.1任务要求1)顺序计算与判别优先级计算:实现加减乘除及括号的计算。2)自动判断数据的正确性及运算过程的正确性:除数为0,两个数之间没有运算符连接,以及括号处理遇到的各种问题。其中包括括号前没有出现运算符就出现了数字,以及括号后也出现了数字,而没有进行运算符号的连接;出现了多个小数点的问题;数据溢出的问题。3)实现退格、清零功能。3.1.2设计思路1)界面设计计数器模块的界面设计如图3.1,所有控件放在一个组框GroupBox中。图3.1计算器界面多个Button按钮,包含数字“0-9”的ID分别为IDC_Button_ZERO/ONE/TWO/……/NINE,运算符“+-×÷”的ID为IDC_Button_ADD/SUB/MUL/DIV/Equal,清零、后退的ID为IDC_Button_Caption为“清除”的Button控件ID为IDC_Button_CleanIt/IDC_Button_Del。2)程序设计思路主要由以下部分组成:(1)根据返回值,识别出控制键与一般字符键,作出不同的处理来实现对历史命令的调用。(2)对表达式的预处理:检查括号的配对情况(正确配对,则前括号与后括号的数量相同)。负号的处理。3.1.3程序部分它的实现代码如下:voidCProjectDlg::OnButtonC(){//TODO:AddyourcontrolnotificationhandlercodehereCleanIt();//清除文本框Str.Format(_T("%s"),str);GetDlgItem(IDC_EDIT_CAL)->SetWindowText(Str);}voidCProjectDlg::OnButtonDiv()//加、减、乘,0-9的类似,省略{//TODO:Addyourcontrolnotificationhandlercodeherestr[strlong]='/';//将输入的字符添加到字符串中strlong++;//字符串长度+1str[strlong]='\0';//添加字符串结束标志Str.Format(_T("%s"),str);//打印到CString对象Str中GetDlgItem(IDC_EDIT_CAL)->SetWindowText(Str);//将Str中字符串输出到编辑框}voidCProjectDlg::Finish()//计算算式处理主函数{charnum[1000];//记录独立数字字符串doublesuanshi[100];//记录由字符串处理成数字形式的算式doublenumber;//记录由数字字符换转换成的数字intbit;//记录十字字符串的位数inti;doubletotal;//记录最后计算结果bit=0;l=0;for(i=0;str[i]!='\0';i++)//从同开始处理整个字符串成为数字串{if((str[i]>='0'&&str[i]<='9')||str[i]=='.')//如果为0~9或小数点则加入要处理为数字的字符串中{num[bit]=str[i];bit++;}else//如果为符号则特殊处理{if(bit>10)//如果单个数字串位数超过10位,则报溢出错误{AfxMessageBox(_T("数据溢出"));return;}num[bit]='\0';//在数字串后添加结束标志if(str[i]!='('&&(i>0&&str[i-1]!=')'))//如果当前字符不为(,或者当前字符前一字符不为),则可以处理当前数字串{//理由是(前或者)后出现数字,则为算式逻辑错误,不允许参与计算number=solve(num);//处理当前数字串成为数字if(number==-1)//若返回为-1则是数字串出现错位,原因是小数点多于一个,详见solve(){//则提示逻辑错误,结束计算AfxMessageBox(_T("算式逻辑错误"));return;}suanshi[l]=number;//将处理得到的浮点型数加入数字算式传中l++;//数字算式串程度+1}elseif(str[i]=='('&&bit>0)//当前符号为(,并且数字串位数大于0,即(前出现数字,则返回逻辑错误,结束{AfxMessageBox(_T("算式逻辑错误"));return;}elseif(str[i]==')'&&str[i+1]!='\0'&&str[i+1]>'0'&&str[i+1]<'9')//若当前符号为),并且字符串后一位没有结束{//并且后一位为数字,则提示逻辑错误,结束AfxMessageBox(_T("算式逻辑错误"));//理由详见上return;}switch(str[i])//如果没有出现以上不合法操作,则将当前符号,以特殊数字的方式加入数字算式串{case'+':suanshi[l]=-1;break;case'-':suanshi[l]=-2;break;case'*':suanshi[l]=-3;break;case'/':suanshi[l]=-4;break;case'(':suanshi[l]=-5;break;case')':suanshi[l]=-6;break;default:break;}l++;bit=0;}}num[bit]='\0';//给算式结束后最后的一个数字进行处理if(i>0&&str[i-1]!=')')//处理方式同上{number=solve(num);if(number==-1){AfxMessageBox(_T("算式逻辑错误"));return;}suanshi[l]=number;l++;}total=0.0;//给计算结果清零total=tryit(suanshi);//对算式进行计算,详见tryit()if(n<l&&suss)//如果n<l,suss为真,即算式没有计算完成就跳出,多余了反括号,报错{AfxMessageBox(_T("算式逻辑错误"));return;}Str.Format(_T("%0.5lf"),total);//将得到的结果打印到Str中GetDlgItem(IDC_EDIT_CAL)->SetWindowText(Str);//将Str中字符串输出到Edit框中LEDDisplay();//数码管显示}doubleCProjectDlg::tryit(double*suanshi)//加减计算主函数,将括号、乘除法视为独立数字进行加减运算{doubletotal=0;if(suanshi[n]>=0)//若算式开始第一位是数字{total=calculate(suanshi);//直接开始计算以这个数字为主的部分if(suanshi[n]==-6)//如果计算结束后的负号为),则后移一位n++;}while(n<l&&suss)//如果算式没有处理完,并且没有出现除数为0时,继续运算{if(suanshi[n]==-1)//当符号为+时{n++;total+=calculate(suanshi);}elseif(suanshi[n]==-2)//当符号为-时{n++;total-=calculate(suanshi);}elseif(suanshi[n]==-5)//当整个数字算式第一位就为(时{total=calculate(suanshi);n++;}elseif(suanshi[n]==-6)//当符号为),跳出当前子部分计算{break;}elseif(suanshi[n]>0)//当当前位为数字时,出现算式逻辑错误,理由是不可能处理出连续两个数字,两个数字必须由符号隔开{AfxMessageBox(_T("算式逻辑错误"));suss=false;return0;}}returntotal;}doubleCProjectDlg::calculate(double*suanshi)//数字子部分的乘除运算{doublenumber;if(suanshi[n]==-5)//当子部分算式第一位为(时,调用tryit对子部分进行递归运算{n++;number=tryit(suanshi);}elsenumber=suanshi[n];//当子部分算式第一位为数字时,直接加入子部分结果中while(n<l){if(suanshi[n]>-3&&suanshi[n]<0)//当符号位出现+-号时,跳出子部分处理,回到加减处理中{break;}n++;if(n==l)//当n等于l时,结束运算break;if(suanshi[n]>-3)//当符号位出现数字,或者加减号时,结束子部分处理,回到加减处理中{break;}if(suanshi[n]==-3)//当符号为*号时{n++;number*=calculate(suanshi);//使用递归运算,处理乘号后可能出现括号}elseif(suanshi[n]==-4)//当符号为/号{n++;if(suanshi[n]==0)//当除数为0时,返回错误{AfxMessageBox(_T("算式逻辑错误"));suss=false;return0;}if(suanshi[n]>0)//当除号后为数字{number/=suanshi[n];//直接除掉,不能递归}elseif(suanshi[n]==-5)//当除号后出现括号,则进行递归,防止出现算式优先级错误number/=calculate(suanshi);}elseif(suanshi[n]==-5)//当数字位后出现(,则是逻辑错误,结束{AfxMessageBox(_T("算式逻辑错误"));suss=false;return0;}if(suanshi[n]==-6)//当出现)时,结束子部分的计算,跳出{break;}}returnnumber;//返回子部分的计算值}doubleCProjectDlg::solve(char*num)//将字符串处理为数字{doublenumber=0;doublexiaoshu=0;inti,j;for(i=0;num[i]!='\0'&&num[i]!='.';i++){number=number*10+num[i]-'0';}if(num[i]=='.')//处理小数点后的数{for(j=i+1;num[j]!='\0';j++){if(num[j]=='.')//如果小数点后的数中又出现小数点,报错return-1;xiaoshu=xiaoshu*10+num[j]-'0';}for(j=i+1;num[j]!='\0';j++){xiaoshu/=10.0;31}number+=xiaoshu;}returnnumber;//返回转换值}voidCProjectDlg::CleanIt(){str[0]='\0';n=0;l=0;strlong=0;suss=true;times=0;m_bValue=true;T=0;}voidCProjectDlg::OnButtonEqual(){//TODO:Addyourcontrolnotificationhandlercodeherestr[strlong]='\0';//等于号被按下是,进行计算,并且清除一部分记录Finish();CleanIt();}BOOLCProjectDlg::PreTranslateMessage(MSG*pMsg)//键盘的消息响应{//TODO:Addyourspecializedcodehereand/orcallthebaseclassif(pMsg->message==WM_KEYDOWN){switch(pMsg->wParam){caseVK_NUMPAD0:str[strlong]='0';break;caseVK_NUMPAD1:str[strlong]='1';break;caseVK_NUMPAD2:str[strlong]='2';break;caseVK_NUMPAD3:str[strlong]='3';break;caseVK_NUMPAD4:str[strlong]='4';break;caseVK_NUMPAD5:str[strlong]='5';break;caseVK_NUMPAD6:str[strlong]='6';break;caseVK_NUMPAD7:str[strlong]='7';break;caseVK_NUMPAD8:str[strlong]='8';break;caseVK_NUMPAD9:str[strlong]='9';break;caseVK_ADD:str[strlong]='+';break;caseVK_SUBTRACT:str[strlong]='-';break;caseVK_MULTIPLY:str[strlong]='*';break;caseVK_DIVIDE:str[strlong]='/';break;caseVK_DECIMAL:str[strlong]='.';break;caseVK_RETURN:if(::GetDlgCtrlID(pMsg->hwnd)!=IDC_BUTTON_EQUAL){GotoDlgCtrl(GetDlgItem(IDC_BUTTON_EQUAL));}OnButtonEqual();returnFALSE;break;default:returnCDialog::PreTranslateMessage(pMsg);break;}strlong++;str[strlong]='\0';Str.Format(_T("%s"),str);GetDlgItem(IDC_EDIT_CAL)->SetWindowText(Str);}returnCDialog::PreTranslateMessage(pMsg);}voidCProjectDlg::OnButtonPoint()//添加小数点进字符串{//TODO:Addyourcontrolnotificationhandlercodeherestr[strlong]='.';strlong++;str[strlong]='\0';Str.Format(_T("%s"),str);GetDlgItem(IDC_EDIT_CAL)->SetWindowText(Str);}voidCProjectDlg::OnButtonDel()//退格{//TODO:Addyourcontrolnotificationhandlercodehere(strlong>0)?(strlong--):(strlong=strlong);//当字符串长度不为0时,字符串长度-1,添加结束标志str[strlong]='\0';Str.Format(_T("%s"),str);GetDlgItem(IDC_EDIT_CAL)->SetWindowText(Str);}3.2显示模块(LED数码管)3.2.1任务要求1)LED数码管驱动程序:实现在目标板上的LED数码管显示计数器输入的运算符及计算后的结果。如果超过四位,则轮流显示。3.2.2设计思路这个模块,即综合了实验8和实验9的内容。计数器模块的界面设计如图3.1中,为了将整个模块综合起来,当“=”按键按下时,实现LED的显示。数码管显示的关键部分是如何显示4位数之后的部分,就要用到轮流显示,每次装入缓冲4位数字(包括小数点),通过定时器,可以设置停留时间的不一样,第一组数据停的时间长一点,后面的稍微短些。3.2.3程序实现voidCProjectDlg::LEDDisplay()//LED显示函数{inti,j,len;BYTEdata[4];DWORDbytes;len=Str.GetLength();//获取计算结果的字符串长度for(i=0;i<len-3;i++)//从字符串0位显示到len-3位,每次显示四位数{memset(data,0,4);//缓冲清0for(j=i;j<i+4;j++)//依次将要显示的四位写入缓冲{if(Str[j]!='.')data[j-i]=ledfont[Str[j]-'0'];elsedata[j-i]=0x01;//当前位为小数点时}WriteFile(m_hDev,data,4,&bytes,NULL);//将缓冲区数据以流形式写入外设if(i==0)Sleep(3000);//如果为最前四位,显示3秒elseSleep(500);//每前进一位停留0.5秒}}3.3其他(1)打开设备并做确认因为我们的设计中要驱动PXA270实验箱上的八段数码管和LED灯,因此在对话框初始化的时候需要打开设备,并做一个确认,如果失败,则弹出提示对话框。这部分程序代码添加在OnInitDialog中,实现代码如下:m_hDev=CreateFile(_T("LED2:"),GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);//初始化外设数码管,挂载外设,建立流连接if(m_hDev==INVALID_HANDLE_VALUE)//如果返回值为失败,输出打开设备失败{AfxMessageBox(_T("打开设备失败"));}m_hDevL=CreateFile(_T("GIO1:"),GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);//初始化LED灯,挂载if(m_hDevL==INVALID_HANDLE_VALUE){AfxMessageBox(_T("打开设备失败LED"));}(2)添加处理窗口失败的响应函数选择View-ClassWizard,在弹出的对话框中,添加系统用来处理窗口失败时发送的消息WM_DESTORY,点击“AddFunction”,再点击“EditCode”。添加代码如下:voidCProjectDlg::OnDestroy(){CDialog::OnDestroy();//TODO:AddyourmessagehandlercodehereCloseHandle(m_hDev);}4使用手册与测试结果性能分析4.1使用手册通过设计对话框界面、查阅相关书籍,编写控件程序、不断调试,完善设计功能,最终我们小组完成的对话框界面如图3.1。下面具体说明此操作界面的使用方法。(1)双击打开WinCE系统“我的电脑”中“pro.exe”文件,显示如图4.1的界面。或者点击本地电脑WindowsCE的软件运行,也可以直接弹出本地的运行程序。(2)在Display模块中,通过键盘或是界面输入合理的运算表达式,可以看到在结果框显示,输入“=”,可在结果框中显示,同时在PXA270实验箱的八段数码管也显示,测试结果如图4.2。图3.1计算器界面图4.1一般计算结果显示图4.2超过四位计算结果显示图4.3除数为零计算结果显示图4.4数码管移位显示(3)当计算结果小于9999且除数非零时,输出结果与图4.1类似,图中为6×8的结果。(4)当计算结果大于9999且除数非零时,输出结果与图4.2类似,溢出位在实验箱的数码管上不显示。(5)当除数为零时,计算结果如图4.3所示,弹出

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论