ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:54.78KB ,
资源ID:3919232      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-3919232.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(嵌入式课程设计实验报告计算器.docx)为本站会员(b****4)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

嵌入式课程设计实验报告计算器.docx

1、嵌入式课程设计实验报告计算器华南师范大学嵌入式综设实验报告选题:基于 ARM和 UCOS-II系统的小型计算器 指导老师: 王剑 x组员(学号):( 20122302xxx) (20122302xxx)、实现功能 实现五位整数的加减乘除带括号的运算,由于实验箱的键盘数量有限,于是我们 将键盘设置为虚拟的两层结构,其使用方法如下:1)第一层键盘使用指南123(456)789第二层0第一层=2)第二层键盘使用指南+%-*/二、系统流程图N计算原理计算原理 定义一个操作数栈 sym,一个操作符栈 um 。 思想是:置操作数栈为空,操作符栈压入元素 #( 它具有最高优先级 ),依次读入表达式中的每个字

2、 符 CH,如果 CH是操作数,则 CH压入操作数栈,如果 CH是操作符,那么将 CH 和操作符栈顶元 素进行优先级比较(如优先级高于 )。 如果优先级大于当前栈顶元素,那么将其压栈, 如果其优先级小于当前栈顶元素,那么执行 op=sym.pop();(取当前栈顶操作符) ,a=um.pop() (取当前栈顶操作数存入临时变量 a);b=sym.pop() (取当前栈顶操作数存入临时变量 b) ;c=计算(a opb); sym.push(c);如果优先级相等,则当前操作符出栈。 重复上述操作直到表达式处理完毕。最后操作数栈剩余的操作数就是计算的最终结果。三、程序#include#includ

3、e#includeIncludes.hoption.h2410lib.h/* uC/OS interface */#includeuhal.h/* 任务栈 */OS_STK StackLEDSTACKSIZE= 0, ;任 / 务 LED任务栈OS_STK StackSEGSTACKSIZE= 0, ;任 / 务 SEG任务栈/* 任务ID */char IdLED = 1; / 任务LED IDchar IdSEG = 2; / 任务SEG ID/* 任务处理函数 */void TaskLED(void *Id); / 任务 LED任务处理函数void TaskSEG(void *Id);

4、/ 任务 SEG任务处理函数void TmrFunc1(INT8U arg);/* 定时器 1*/OS_TMR *Tmr1;char ch,ch2;char print_11;char print_2 6; /* 用于串口输出 */int Page=0; /* 键盘的页面标志 */* 栈定义 */ #ifndef STACK_SIZE#define STACK_SIZE 64#endif int NumSTACK_SIZE;/*数字栈 */int NumTop=0;int SymSTACK_SIZE;/*字符栈,用来储存操作符 */int SymTop=0;void Push_(int * s

5、tack,int * top,int val);int Pop_(int * stack,int * top);/* 声明 */#define DELAYTIME 1extern unsigned char seg7table16;int Calculate(int right,int left,int symbol);#define DELAYTIME 1void product(void);int a,b,c;char number255;char sign;int now=0;int num=0;int SymTmp;/* 对操作符处理时的中间变量 */int ResTmp;/* 得数的

6、中间变量 */int Flag = 0;/* 表示数字不为空的标识符 */int count=0;/* 跑马灯闪烁函数,调用一次,四个跑马灯由亮变灭或者由灭变亮*/void User_LED_Blink(void)static int led_status = 0;led_status += 1;if(led_status % 2 = 0)Led_Display(0x0f);elseLed_Display(0x00);/* 数码管显示实验,由 0到 F依次显示*/void User_SEG_Blink(void)static unsigned char seg_value = 0xc0, 0x

7、f9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xc0,0xdf;static int seg_status = 0;/count+;seg_status += 1;/if(seg_status 15)seg_status = 0;/* 定时器 Tmr1、 Tmr2、Tmr3 处理函数* 1 、根据 arg参数确定定时器* 2、三个定时器同时只打开一个,即 Tmr1、Tmr2、Tmr3 ,三个定时器总和闪烁一次跑马灯*/void TmrFunc1(INT8U arg)ch=Key_GetKey();ch2=ch;switch(ch)ca

8、se C:ch2=(;break;case D:ch2=);break;case F:ch2=;break;case A:ch2=.;break;case E:Page=1;Led_Display(0xff);break;case B:Page=0;Led_Display(0x00);break;default:break;if(Page=1)switch(ch)case 1:ch2=+;break;case 4:ch2=-;break;case 7:ch2=*;break;case 0:ch2=/;break;case 2:ch2=%;break;default:ch=0;break;if(

9、ch2=E|ch2=B|ch2=.)print_10=0;else print_10=ch2;uHALr_printf(print_1);product();/* 任务 LED任务处理函数* 1 、OSStart调用之前创建的最高优先级任务,在该函数重启动时钟节拍定时器* 2 、创建三个定时器,定时时间都为 2秒钟,它们使用同样的 TmrFunc1定时器服务函数,但是使用不同的参数,定时器 1的初始状态为开,其余为关*/void TaskLED(void *Id)char key_press;char led_status = 0x0;INT8U err;/* 启动时钟节拍定时器,开始多任务调

10、度 */ARMTargetStart();/* 初始化定时器 */OSTmrInit();/* 创建定时器,定时时间为 2秒钟,它使用 TmrFunc1定时器服务函数, 定时器 1的初始状态为开 */err = OSCreateTimer( &Tmr1, TmrFunc1, 1, 10, OS_TMR_ENABLE);OSEnableTimer(Tmr1);uHALr_printf(n 欢迎使用计算器 n);/* 该任务到此完成,不断延时 */for (;)OSTimeDly(10);/* 任务 SEG任务处理函数* 1、每隔 100 ticks即 1000ms,闪烁数码管*/void Tas

11、kSEG(void *Id)/uHALr_printf(Task2() calledn);for (;)OSSchedLock();OSSchedUnlock();OSTimeDly(1);/* Main 函数 .* 1 、初始化目标系统,初始化硬件定时器等,与操作系统无关* 2、调用 OSInit初始化 uC/OS-II软件数据结构等,必须在打开时钟节拍中断之前调用* 3、创建两个任务, TaskLED和 TaskSEG,TaskLED的优先级为 5, TaskSEG的优先级为 13,TaskLED的优先级高于 TaskSEG* 4 、调用 OSStart启动 uC/OS-II*/void

12、Main(void)/* 目标系统初始化*/ARMTargetInit();/* uC/OS-II 软件初始化*/OSInit();/* 创建两个任务, TaskLED和 TaskSEG,TaskLED的优先级为 5,TaskSEG的优先级为 13,TaskLED 的优先级高于 TaskSEG*/OSTaskCreate(TaskLED(, void *)&IdLED, (OS_STK* )&StackLEDSTACKSIZE- 1, 5);OSTaskCreate(TaskSEG(,v oid *)&IdSEG, (OS_STK* )&StackSEGSTACKSIZE- 1, 13);/*

13、 启动多任务调度*/OSStart();/* 正常情况下,永远不会执行到这里*/return;void product(void)if(ch2=0&ch2=9)num = (num*10)+(ch2-0);Flag = 1;else if(ch2=(|ch2=)|ch2=+|ch2=-|ch2=*|ch2=/|ch2=%|ch2=)if(Flag)Push_(Num,&NumTop,num);num = 0;Flag = 0;switch(ch2)case (: / 对 (的处理 (左括号 )Push_(Sym,&SymTop,();break;case ): / 对 )的处理 (右括号 )w

14、hile(SymTop!=0&(SymTmp=Pop_(Sym,&SymTop)!=()ResTmp=Calculate(Pop_(Num,&NumTop),Pop_(Num,&NumTop),SymTmp);Push_(Num,&NumTop,ResTmp);break;case +: / 对 +(加号)的处理if(SymTop!=0 & SymSymTop-1!=()&SymTop);ResTmp=Calculate(Pop_(Num,&NumTop),Pop_(Num,&NumTop),Pop_(Sym,Push_(Num,&NumTop,ResTmp);Push_(Sym,&SymTo

15、p,+);break;case -: / 对 -(减号)的处理if(SymTop!=0 & SymSymTop-1!=()ResTmp=Calculate(Pop_(Num,&NumTop),Pop_(Num,&NumTop),Pop_(Sym,&SymTop);Push_(Num,&NumTop,ResTmp);Push_(Sym,&SymTop,-);break;case *: / 对 * (乘号)的处理if(SymTop!=0&SymSymTop-1!=(&SymSymTop-1!=+)&SymTop);ResTmp=Calculate(Pop_(Num,&NumTop),Pop_(Nu

16、m,&NumTop),Pop_(Sym,Push_(Num,&NumTop,ResTmp);Push_(Sym,&SymTop,*);break;case /: / 对 /(除号)的处理if(SymTop!=0&SymSymTop-1!=(&SymSymTop-1!=+)&SymTop);ResTmp=Calculate(Pop_(Num,&NumTop),Pop_(Num,&NumTop),Pop_(Sym,Push_(Num,&NumTop,ResTmp);Push_(Sym,&SymTop,/);break;case %: / 对(取余)的处理if(SymTop!=0&SymSymTop

17、-1!=(&SymSymTop-1!=+)&SymTop);ResTmp=Calculate(Pop_(Num,&NumTop),Pop_(Num,&NumTop),Pop_(Sym,Push_(Num,&NumTop,ResTmp);Push_(Sym,&SymTop,%);break;case =: / 对 =号处理if(SymTop!=0)while(SymTop!=0&(SymTmp=Pop_(Sym,&SymTop)!=( )ResTmp=Calculate(Pop_(Num,&NumTop),Pop_(Num,&NumTop),SymTmp);Push_(Num,&NumTop,R

18、esTmp);num = Pop_(Num,&NumTop);if(num0)print_20=-;num=-num;else print_20=+;print_21=num/10000+0;print_22=num%10000/1000+0;print_23=num%1000/100+0;print_24=num%100/10+0;print_25=num%10+0;uHALr_printf(nResult= );num);uHALr_printf(print_2);/uHALr_printf(Result= %d, sprintf(print_buf, Task%c() turnedn,

19、*(char *)Id);(void *)&IdLEDNumTop = 0;SymTop = 0;num = 0;uHALr_printf(n);break;/display(num);int Calculate(int right,int left,int symbol)int result = 0;switch(symbol)case +:result = left+right;break;result = left*right;break;case -:result =left-right; break;case /:result = left/right;break;case %:result = left%right;break;return result;/* 栈处理 */void Push_(int * stack,int * top,int val)if(*top = STACK_SIZE)return;stack(*top)+ = val;int Pop_(int * stack,int * top)if(*top=0)return -1;return stack-(*top);

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2