資源簡介
本次實驗實現了基于串口通信的表達式解析與計算功能,如下圖所示,向單片機輸入表達式: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
評論
共有 條評論