• 大小: 78KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-03
  • 语言: 其他
  • 标签: msp430  

资源简介

本次实验实现了基于串口通信的表达式解析与计算功能,如下图所示,向单片机输入表达式: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_linkInfo.xml
     文件          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\objects.mk
     文件        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.ccxml
     文件         806  2020-01-13 11:19  UARTcalculate\targetConfigs\readme.txt

评论

共有 条评论