资源简介
本次实验实现了基于串口通信的表达式解析与计算功能,如下图所示,向单片机输入表达式: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
相关资源
- 按键控制MSP430F5529单片机控制灯闪烁
- MSP430F系列单片机bootloader原理及实现方
- MSP430F5529原理图
- MSP430F149单片机对继电器的控制程序和
- MSP430 SD卡FAT16源码!!!经典
- LCD1602程序 for MSP430F449
- 基于MSP430F6638的数字钟代码
- 2018年TI杯电子设计大赛FDC2214、TPS630
- MSP430F5529LP 串口通信 UART 代码 CCS工程
- 基于MSP430的UART串口控制机械臂
- fdc2214驱动程序——基于MSP430F5529
- 基于MSP430F149单片机的语音播报模块使
- msp430f5529计算fft程序,可用
- msp430系列库封装
- msp430f5529三种频率PWM定时输出
- MSP430G2553例程代码
- MSP430 INFO_A 操作
- msp430f149 TFT屏 显示 240*320
- 基于msp430的智能宿舍.rar
- msp430G2553调用库
- msp430AD采集电压
- 用DS18B20测量温度并在12864液晶屏上显
- MSP430 USB转串口驱动
- 基于msp430单片机的电子万年历LCD 128
- 基于msp430单片机的红外线遥控解码L
- MSP430G25534个简单的小程序
- 基于DDS和MSP430的信号发生器设计
- 基于MSP430F149控制LCD12864串口显示C程序
- 基于msp430f149的ds18b20显示程序
- MSP430F149驱动OV7670摄像头
评论
共有 条评论