资源简介
本次实验实现了基于串口通信的表达式解析与计算功能,如下图所示,向单片机输入表达式:2/1-3*(1*5+4*(2-2)+5)/(3-1*9)=; 返回计算结果:7,等等

代码片段和文件信息
/*
* 串口字符串
* 说明:只处理一位整数带括号加减乘除,不检测表达式正误
* 例如:输入(5+3)*(3*2+9) =
* 输出120
* 运行环境:msp430f6638
* 编译环境:CCS 7.1.1 (新版本报错则新建工程复制代码)
* 日期:2020.1.13
* 作者:于子豪
*/
#include
typedef unsigned char u8;
typedef signed int u16;
typedef unsigned int SP6;
typedef unsigned long u32;
void init_uart_115200(void);
void set_SMCLK_4MHz(void);
int analysis_char(u8 oneChar);
void sendResult(int num);
void oneCharProcess(u8 oneChar);
u8 getPriority(u8 oneChar);
int calculate(char char0 int a int b);
void num_push(int num);
int num_pop(void);
void sp_push(u8 sp);
u8 sp_pop(void);
u8 revChar_temp = 0;
char * sendstr;
int str_index = 0;
int num[20] = {0};//运算数栈
int num_index = -1;//运算数栈栈顶指针
u8 sp[20] = {0};//运算符栈
int sp_index = -1;//运算符栈栈顶指针
int main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
set_SMCLK_4MHz();
init_uart_115200();
__enable_interrupt();
sendstr = “start\n“;
UCA1IFG |= UCTXIFG; //强制进入中断
while(1){
}
}
/* ======== USCI A0/B0 TX Interrupt Handler Generation ======== */
#pragma vector = USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void){
switch(__even_in_range(UCA1IV4)){//user guide:36.4.14 UCAxIV Register
case 0:break;
case 2://接受数据
revChar_temp = UCA1RXBUF;
oneCharProcess(revChar_temp);
break; //vector 2 : RXIFG
case 4://发送数据
if(sendstr[str_index] != ‘\0‘){
UCA1TXBUF = sendstr[str_index++];
}else{
str_index = 0;
}
break; //vector 4 : TXIFG
default: break;
}
}
//运算符优先级:数值越小优先级越高
u8 getPriority(u8 oneChar){
switch(oneChar){
case ‘(‘:return 0;
case ‘*‘:return 1;
case ‘/‘:return 1;
case ‘-‘:return 2;
case ‘+‘:return 2;
case ‘)‘:return 3;
case ‘=‘:return 4;
default : break;
}
return 255;
}
//中断处理函数,一次处理一个字符
void oneCharProcess(u8 oneChar){
int analysisChar = analysis_char(oneChar);//遇到操作数时,将其压入num
if(analysisChar != -1 && analysisChar != -2){
num_push(analysisChar);
}else if(analysisChar == -1){
if(oneChar==‘=‘){//所有SP出栈,最后的计算结果在num栈中
char temp1 = sp_pop();
while(temp1 != 0){
num_push(calculate(temp1 num_pop() num_pop()));
temp1 = sp_pop();
}
sendResult(num_pop());
}else if((sp_index==-1) && (num_index==-1) && (oneChar == ‘-‘)){//第一个运算数是负数情况
sp_push(oneChar);
num_push(0);
}else if((sp_index==-1) || (oneChar==‘(‘) || (getPriority(oneChar) sp_push(oneChar);
}else if(oneChar==‘)‘){//如果右括号“)”,则依次弹出SP栈顶的运算符,并压入num,直到遇到左括号为止,此时将这一对括号丢弃;
char temp1 = sp_pop();
while(temp1!=‘(‘){
num_push(calculate(temp1 num_pop() num_pop()));
temp1 = s
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2020-01-13 11:26 UARTcalculate\
文件 647 2020-01-13 12:44 UARTcalculate\.ccsproject
文件 30162 2020-01-13 12:45 UARTcalculate\.cproject
目录 0 2020-01-13 11:26 UARTcalculate\.launches\
文件 4939 2020-01-13 14:25 UARTcalculate\.launches\UARTcalculate.launch
文件 843 2020-01-13 11:19 UARTcalculate\.project
目录 0 2020-01-13 11:20 UARTcalculate\.settings\
文件 62 2020-01-13 11:19 UARTcalculate\.settings\org.eclipse.cdt.codan.core.prefs
文件 123 2020-01-13 11:19 UARTcalculate\.settings\org.eclipse.cdt.debug.core.prefs
文件 208 2020-01-13 11:20 UARTcalculate\.settings\org.eclipse.core.resources.prefs
目录 0 2020-01-13 17:43 UARTcalculate\Debug\
文件 89469 2020-01-13 17:43 UARTcalculate\Debug\UARTcalculate.map
文件 75280 2020-01-13 17:43 UARTcalculate\Debug\UARTcalculate.out
文件 288079 2020-01-13 17:43 UARTcalculate\Debug\UARTcalculate_li
文件 59 2020-01-13 17:43 UARTcalculate\Debug\ccsObjs.opt
文件 707 2020-01-13 17:43 UARTcalculate\Debug\main.d
文件 32440 2020-01-13 17:43 UARTcalculate\Debug\main.obj
文件 4417 2020-01-13 17:43 UARTcalculate\Debug\makefile
文件 260 2020-01-13 12:45 UARTcalculate\Debug\ob
文件 2073 2020-01-13 17:43 UARTcalculate\Debug\sources.mk
文件 1064 2020-01-13 17:43 UARTcalculate\Debug\subdir_rules.mk
文件 530 2020-01-13 17:43 UARTcalculate\Debug\subdir_vars.mk
文件 14641 2020-01-13 11:19 UARTcalculate\lnk_msp430f6638.cmd
文件 8358 2020-01-13 17:32 UARTcalculate\main.c
目录 0 2020-01-13 11:19 UARTcalculate\targetConfigs\
文件 822 2020-01-13 12:44 UARTcalculate\targetConfigs\MSP430F6638.ccxm
文件 806 2020-01-13 11:19 UARTcalculate\targetConfigs\readme.txt
- 上一篇:山东大学数据库历年题样题.zip
- 下一篇:IPV6 VRRP实验.docx
相关资源
- IAR for MSP430 v7.10.1 注册机
- 基于MSP430G2553的蓝牙控制小车
- 利用DS1302和msp430进行闹钟和万年历的
- msp430F149操作红外接收模块源码
- [免费]msp430f149控制PS2键盘并用1602显示
- MSP430f149读sd FAT txt
- 用8位spi实现16位spi
- 基于MSP430单片机的实时多任务操作系
- MSP430系列单片机例程(msp430f235)
- MSP430控制AD9850产生频率可调的方波及
- msp430f449程序
- 基于MSP430的数控直流电压源
- MSP430F5438A Timer_B 操作实验
- MSP430F5438 UCS 时钟操作实验
- MSP430F5438A Timer_A 操作实验
- MSP430F5438 看门狗实验
- IAR EW430连接仿真器在线仿真
- 初识畅学系列MSP430F149单片机开发板
- 畅学多功能实验箱 MSP430F5438 RTC 操作实
- MSP430F5438A RAM操作实验
- msp430f5438a技术资料
- MSP430 JTAGUSB的和并口的与目标板连接的
- MSP430教程:MSP430单片机ADC12模块
- WIA-PA网络技术在井下人员定位系统中
- 16位MSP430单片机的开关稳压电源设计
- 基于mps430f149的12864液晶显示模块编程
- MSP430F5529移植modbus
- MSP430详细教程
- MSP430信号发生器.rar
- MSP430F5529 例程源码
评论
共有 条评论