嵌入式课程设计实验报告-计算器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;
}