中國石油大學(北京)
課程設計報告
課程名:硬體綜合實踐
姓名許愷
學號2014011329
班級計算機14-1班
設計時間2018年1月5日
在51微控制器上編寫燒錄十進位制四則運算電腦程式,使之具有計算、糾錯、顯示、括號運算(甚至浮點數運算)的功能。
根據實習設計要求,經過分析可得整個實驗可以分為兩個部分,軟體和硬體,要明白硬體結合軟體的方式以及lcd液晶屏的工作方式和51晶元的編碼方式以及按鈕的電路連線方式;軟體要明白多位數四則運算的**演算法和c的語法。
設計思路可以分為三部分。第一,鍵盤按鈕的掃瞄;第二,晶元內部的運算;第三,lcd液晶的顯示;其中第二部分最為複雜重要。
連線:jp8連jp4 jp9連jp5 j8斷開 j2斷開 jp165斷開 把1602液晶插入
**:計算器硬體綜合實驗
#include
//此檔案中定義了51的一些特殊功能暫存器
#include
#define uchar
unsigned char
sbit en=p2^7; //lcd的使能引腳
sbit rs=p2^6; //lcd資料命令選擇端
sbit rw=p2^5; //lcd的讀寫選擇端
sbit k1=p3^0; //*號
sbit k2=p3^1; // /號
sbit k3=p3^2; //(號
sbit k4=p3^3; // )號
sbit k5=p3^4; // =號
//這裡連線了線並且將每位都對應上
code uchar
key_code=;
//2*4鍵盤鍵值表
//定義字元鍵值表,均為字元對應的ascii碼的十六進製制
code uchar
char_table=; //這個會顯示 =
//定義優先順序矩陣,分為四種情況,當前的比上乙個
0優先順序高、2優先順序低、1左括號遇到右括號、3發生錯誤
code uchar yxj[6][7]=; //num為資料棧,初值為0
uchar sign[5]; //sign為符號棧
int i=0,j=0,k=0; //j是資料棧的棧頂指標,指向棧頂的下乙個,k是符號棧的棧頂的下乙個
uchar c; //用來存放當前的字元
int flagnum=0; //指當前遇到數字的位數
uchar theta; //運算時的運算符號
int num1,num2,num0; //運算時的運算數和得數
c=arr[i];
i++;
while(c!='\0')
//如果要加上浮點數就增加一種情況就是遇到『.』的時候改變一下迭代方式
if(c>='0'&&c<='9') //如果當前遇到的是數字,先把字元變成數字,
c=c-0x30;
if(flagnum==0)
num[j]=c;j++;
//如果這是第一位就直接入棧
flagnum++;
else
num[j-1]=num[j-1]*10+c; //不是第一位就拿出來上乙個乘十加上再壓進去
flagnum++;
c=arr[i];i++;
else //如果來的不是數字
if(k==0) //如果符號棧裡沒東西直接入棧
sign[0]=c;
k++;
c=arr[i];i++;
flagnum=0;
else //符號棧裡有東西就得比較一下了,分三種情況
switch(precede(sign[k-1],c))
case
0: sign[k]=c;k++;c=arr[i];i++; //當前符號優先順序更高則入符號棧
flagnum=0; //數字位數清零
break;
case
1: k--;sign[k]='\0';c=arr[i];i++;break;
//當兩個括號相遇時直接出棧
case
2: theta=sign[k-1];k--; //當當前的符號優先順序小於等於上乙個符號時,將棧內的數字和符號取出進行運算
num2= num[j-1];j--;
num1=num[j-1];j--;
num0=operate(num1,theta,num2);
num[j]=num0;j++; //運算結果入棧
break;
default: break;
i=0;
while(arr[i]!='\0') //把表示式字串置為空
arr[i]='\0';
i++;
return num[j-1]; //返回整型的結果
//符號優先順序比較,輸入a,b兩個符號,根據優先順序表返回他的優先順序對比情況,分為0123
int precede(char
a,char b)
char i,j;
switch(a)
case '+':i=0;break;
case '-':i=1;break;
case '*':i=2;break;
case '/':i=3;break;
case '(':i=4;break;
case ')':i=5;break;
case '=':i=6;break;
switch(b)
case '+':j=0;break;
case '-':j=1;break;
case '*':j=2;break;
case '/':j=3;break;
case '(':j=4;break;
case ')':j=5;break;
case '=':j=6;break;
return yxj[i][j];
//棧中數的運算,輸入兩個數乙個符號返回乙個得數
int operate(int
num1,uchar theta,int num2)
int num3;
switch(theta)
case
'+':num3=num1+num2;break;
case
'-':num3=num1-num2;break;
case
'*':num3=num1*num2;break;
case
'/':num3=num1/num2;break;
return num3;
這次的硬體綜合實習讓我在兩周的時間內快速學習了微控制器並且進行了實驗,雖然之前參加機械人大賽已經對51微控制器的燒錄和寫**已經有了一定的了解,但是這次的學習讓我對它的了解更加深入,前面的幾個小實驗也是層層遞進為最後的實驗做準備,四則運算演算法一直是我不太會的演算法,通過這次實驗我學會了,相信在以後也能自如的寫出來。本次設計學習了很多東西,在網上查了好多資料,在短時間內對我自身有乙個明顯的提高,同時也增加了一些未來的可能性,很感謝我的隊友徐志遠同學,我們兩個缺一不可,在這次實驗中幫了我很多,也感謝老師對我的鼓勵。
徐朝農老師的教學精神值得所有老師學習,既沒有輕鬆水過,也沒有過於嚴格苛刻,高標準+人性化的評判,真正讓同學們學到東西。要說建議也沒有什麼,就是下一屆和後面的學弟學妹人數會越來越多,可以申請多一點教具和教室,難度還可以加大。
參考:
華為機試 四則運算
題目 四則運算 問題描述 輸入乙個只包含個位數字的簡單四則運算表示式字串,計算該表示式的值 注 3.1 表示式只含 四則運算符,不含括號 3.2 表示式數值只包含個位整數 0 9 且不會出現0作為除數的情況 3.3 要考慮加減乘除按通常四則運算規定的計算優先順序 3.4 除法用整數除法,即僅保留除法...
華為機試簡單四則運算
簡單四則運算 問題描述 輸入乙個只包含個位數字的簡單四則運算表示式字串,計算該表示式的值 注 1 表示式只含 四則運算符,不含括號 2 表示式數值只包含個位整數 0 9 且不會出現0作為除數的情況 3 要考慮加減乘除按通常四則運算規定的計算優先順序 4 除法用整數除法,即僅保留除法運算結果的整數部分...
四則運算 華為機試 C C
請實現如下介面 功能 四則運算 輸入 strexpression 字串格式的算術表示式,如 3 2 返回 算術表示式的計算結果 publicstaticintcalculate string strexpression 請實現 return0 約束 pucexpression字串中的有效字元包括 0...