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

上传人:第*** 文档编号:34266247 上传时间:2018-02-22 格式:DOC 页数:20 大小:195.50KB
返回 下载 相关 举报
嵌入式课程设计实验报告-计算器_第1页
第1页 / 共20页
嵌入式课程设计实验报告-计算器_第2页
第2页 / 共20页
嵌入式课程设计实验报告-计算器_第3页
第3页 / 共20页
嵌入式课程设计实验报告-计算器_第4页
第4页 / 共20页
嵌入式课程设计实验报告-计算器_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《嵌入式课程设计实验报告-计算器》由会员分享,可在线阅读,更多相关《嵌入式课程设计实验报告-计算器(20页珍藏版)》请在金锄头文库上搜索。

1、华南师范大学嵌入式综设实验报告选题:基于 ARM 和 UCOS-II 系统的小型计算器指导老师: 王剑 x组员(学号):(20122302xxx) (20122302xxx)一、实现功能实现五位整数的加减乘除带括号的运算,由于实验箱的键盘数量有限,于是我们将键盘设置为虚拟的两层结构,其使用方法如下:(1)第一层键盘使用指南1 2 3 (4 5 6 )7 8 9 第二层0 . 第一层 =(2)第二层键盘使用指南+ %-*/二、系统流程图开 始两次扫描键盘,获取键码 YYNYNYNYNYN YN、YNYnum = (num*10)+(ch-0);输入的字符是否为数字字符是否为(是否为)是否为+是否

2、为-是否为*处理左括号Push(Sym,处理右括号Push(Sym,处理加号Push(Sym,处理减号Push(Sym,处理乘号Push(Sym,是否为./ 处理除号Push(Sym,是否为清零 计算器清零,使栈清空NY计算原理 计算原理定义一个操作数栈 sym,一个操作符栈 um 。思想是:置操作数栈为空,操作符栈压入元素#(它具有最高优先级),依次读入表达式中的每个字符 CH,如果 CH 是操作数,则 CH 压入操作数栈,如果 CH 是操作符,那么将 CH 和操作符栈顶元素进行优先级比较(如优先级高于 ) 。如果优先级大于当前栈顶元素,那么将其压栈,如果其优先级小于当前栈顶元素,那么执行

3、op=sym.pop();(取当前栈顶操作符) ,a=um.pop()(取当前栈顶操作数存入临时变量 a);b=sym.pop() (取当前栈顶操作数存入临时变量 b);c=计算(a op b); sym.push(c);如果优先级相等,则当前操作符出栈。重复上述操作直到表达式处理完毕。最后操作数栈剩余的操作数就是计算的最终结果。三、程序#include Includes.h /* uC/OS interface */#include option.h#include 2410lib.h#include uhal.h是否为=计算,调用Calculate(int right,int left,i

4、nt symbol);显示当前数值或运算符/* 任务栈 */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); / 任务SEG 任务处理函数void TmrFunc1(INT8U arg);/* 定时器1*/OS_TM

5、R *Tmr1;char ch,ch2;char print_11;char print_2 6; /*用于串口输出*/int Page=0; /* 键盘的页面标志 */*-栈定义-*/#ifndef STACK_SIZE#define STACK_SIZE 64#endifint NumSTACK_SIZE;/*数字栈 */int NumTop=0;int SymSTACK_SIZE;/*字符栈,用来储存操作符 */int SymTop=0;void Push_(int * stack,int * top,int val);int Pop_(int * stack,int * top);/*

6、-声明-*/#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;/*得数的中间变量 */int Flag = 0;/*表示数字不 为空的标识符 */int count=0;/* 跑马灯闪烁函数,

7、调用一次,四个跑马灯由亮变灭或者由灭变亮*/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, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xc0,0xdf

8、; 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)case C:ch2=(;break;case D:ch2=);break;case F:ch2=;break;case A:c

9、h2=.;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(ch2=E|ch2=B|ch2=.)print_10=0;elseprint_10=ch2;uHALr_printf(pri

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

11、mrFunc1 定时器服务函数,定时器1的初始状态为开 */err = OSCreateTimer( OSEnableTimer(Tmr1);uHALr_printf(n欢迎使用计算器n);/* 该任务到此完成,不断延时 */for (;)OSTimeDly(10);/* 任务SEG任务处理函数* 1、每隔100 ticks即1000ms,闪烁数码管*/void TaskSEG(void *Id)/uHALr_printf(Task2() calledn);for (;) OSSchedLock(); OSSchedUnlock();OSTimeDly(1);/* Main函数.* 1、初始化

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

13、级为13,TaskLED的优先级高于TaskSEG*/OSTaskCreate(TaskLED, (void *)&IdLED, (OS_STK *)&StackLEDSTACKSIZE - 1, 5);OSTaskCreate(TaskSEG, (void *)&IdSEG, (OS_STK *)&StackSEGSTACKSIZE - 1, 13);/* * 启动多任务调度*/OSStart();/* * 正常情况下,永远不会执行到这里 */return; void product(void)if(ch2=0&ch2=9)num = (num*10)+(ch2-0);Flag = 1;el

14、se if(ch2=(|ch2=)|ch2=+|ch2=-|ch2=*|ch2=/|ch2=%|ch2=)if(Flag)Push_(Num,num = 0;Flag = 0;switch(ch2)case (: /对(的处理( 左括号)Push_(Sym,break;case ): /对)的处理( 右括号)while(SymTop!=0&(SymTmp=Pop_(Sym,&SymTop)!=() ResTmp=Calculate(Pop_(Num,Push_(Num,break;case +: / 对+(加号)的处理if(SymTop!=0 & SymSymTop-1!=() ResTmp=Calculate(Pop_(Num,&NumTop),Pop_(Num,&NumTop),Pop_(Sym,Push_(Num,Push_(Sym,break;case -: / 对-(减号)的处理if(SymTop!=0 & SymSymTop-1!=() ResTmp=Calculate(Pop_(Num,&NumTop),Pop_(Num,&NumTop),Pop_(Sym,Push_(Num,Push_(Sym,break;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号