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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

华南师范大学嵌入式综设实验报告

选题:基于ARM和UCOS-II系统的小型计算器

指导老师:王剑x

组员(学号):(20122302xxx)(20122302xxx)

一、实现功能

实现五位整数的加减乘除带括号的运算,由于实验箱的键盘数量有限,于是我们将键盘设置为虚拟的两层结构,其使用方法如下:

(1

(2

二、系统流程图

计算原理

计算原理

定义一个操作数栈sym,一个操作符栈um 。

思想是:置操作数栈为空,操作符栈压入元素"#"(它具有最高优先级),依次读入表达式中的每个字符CH,如果CH是操作数,则CH压入操作数栈,如果CH是操作符,那么将CH和操作符栈顶元素进行优先级比较(如‘×’优先级高于‘+’)。

如果优先级大于当前栈顶元素,那么将其压栈,

如果其优先级小于当前栈顶元素,那么执行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"

/* 任务栈*/

OS_STK StackLED[STACKSIZE]= {0, }; // 任务LED任务栈

OS_STK StackSEG[STACKSIZE]= {0, }; // 任务SEG任务栈

/* 任务ID */

char IdLED = '1'; // 任务LED ID

char IdSEG = '2'; // 任务SEG ID

/* 任务处理函数*/

void TaskLED(void *Id); // 任务LED任务处理函数

void TaskSEG(void *Id); // 任务SEG任务处理函数

void TmrFunc1(INT8U arg);

/* 定时器1*/

OS_TMR *Tmr1;

char ch,ch2;

char print_1[1];

char print_2 [6]; /*用于串口输出*/

int Page=0; /* 键盘的页面标志*/

/*------------------------------------栈定义---------------------------------*/ #ifndef STACK_SIZE

#define STACK_SIZE 64

#endif

int Num[STACK_SIZE];/*数字栈*/

int NumTop=0;

int Sym[STACK_SIZE];/*字符栈,用来储存操作符*/

int SymTop=0;

void Push_(int * stack,int * top,int val);

int Pop_(int * stack,int * top);

/*------------------------------------声明-------------------------------------*/

#define DELAYTIME 1

extern unsigned char seg7table[16];

int Calculate(int right,int left,int symbol);

#define DELAYTIME 1

void product(void);

int a,b,c;

char number[255];

char sign;

int now=0;

int num=0;

int SymTmp;/*对操作符处理时的中间变量*/

int ResTmp;/*得数的中间变量*/

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);

else

Led_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};

static int seg_status = 0;

count++;

// seg_status += 1;

// if(seg_status > 15)

// seg_status = 0;

}

相关文档
最新文档