|
作者:喵九
時(shí)間:2018.6
這份文件是‘單片機(jī)原理’簡(jiǎn)易計(jì)算器的課程設(shè)計(jì),可實(shí)現(xiàn)加減乘除四種運(yùn)算。
文件包含:
1:protues原理電路圖(可分別適用于protues8.0之前跟之后的各個(gè)版本)。
2:計(jì)算器的C程序語(yǔ)言。
3:可直接被單片機(jī)運(yùn)行的hex計(jì)算器程序。
4:計(jì)算器word文檔。
5:計(jì)算器ppt。
0.png (16.46 KB, 下載次數(shù): 107)
下載附件
2018-6-22 17:41 上傳
一 設(shè)計(jì)目的
本設(shè)計(jì)是基于51系列單片機(jī)來(lái)進(jìn)行的簡(jiǎn)單數(shù)字計(jì)算器設(shè)計(jì),可以完成計(jì)算器的鍵盤(pán)輸入,進(jìn)行加、減、乘、除六位整數(shù)數(shù)范圍內(nèi)的基本四則運(yùn)算,并在LED上顯示相應(yīng)的結(jié)果。軟件方面使用C語(yǔ)言編程,并用PROTUES仿真。
二 總體設(shè)計(jì)及功能介紹
根據(jù)功能和指標(biāo)要求,本系統(tǒng)選用MCS-51系列單片機(jī)為主控機(jī),實(shí)現(xiàn)對(duì)計(jì)算器的設(shè)計(jì)。具體設(shè)計(jì)及功能如下:
由于要設(shè)計(jì)的是簡(jiǎn)單的計(jì)算器,可以進(jìn)行四則運(yùn)算,為了得到較好的顯示效果,采用LED 顯示數(shù)據(jù)和結(jié)果;
另外鍵盤(pán)包括數(shù)字鍵(0~9)、符號(hào)鍵(+、-、×、÷)、清除鍵和等號(hào)鍵,故只需要16 個(gè)按鍵即可,設(shè)計(jì)中采用集成的計(jì)算鍵盤(pán);
執(zhí)行過(guò)程:開(kāi)機(jī)顯示零,等待鍵入數(shù)值,當(dāng)鍵入數(shù)字,通過(guò)LED顯示出來(lái),當(dāng)鍵入+、-、*、/運(yùn)算符,計(jì)算器在內(nèi)部執(zhí)行數(shù)值轉(zhuǎn)換和存儲(chǔ),并等待再次鍵入數(shù)值,當(dāng)再鍵入數(shù)值后將顯示鍵入的數(shù)值,按等號(hào)就會(huì)在LED上輸出運(yùn)算結(jié)果
三 原理圖
P7$DVBGHKZ0X[IPQEV8J1_7.png (27.04 KB, 下載次數(shù): 90)
下載附件
2018-6-22 10:42 上傳
四 單片機(jī)程序部分
- #include <reg51.h>
- #include <intrins.h>
- #include <ctype.h> /* isdigit()函數(shù) */
- #include <stdlib.h> /* atoi()函數(shù) */
- #define uchar unsigned char
- #define uint unsigned int
- uchar operand1[9], operand2[9]; /* 操作數(shù) */
- uchar operator; /* 操作符 */
- void delay(uint);
- uchar keyscan();
- void disp(void);
- void buf(uint value);
- uint compute(uint va1,uint va2,uchar optor);
- uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,
- 0x92,0x82,0xf8,0x80,0x90,0xff}; /* 字符碼表 */
- uchar dbuf[8] = {10,10,10,10,10,10,10,10}; /* 顯示緩存 */
- /* 延時(shí)函數(shù) */
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /*******************************************
- 鍵盤(pán)掃描程序
- 將按鍵轉(zhuǎn)化為字符并作為輸出
- ,'#'分別表示清零鍵和沒(méi)有鍵按下
- *******************************************/
- uchar keyscan()
- {
- uchar skey; /* 按鍵值標(biāo)記變量 */
- /***********************
- 掃描鍵盤(pán)第1行
- ************************/
- P1 = 0xfe;
- while((P1 & 0xf0) != 0xf0) /* 有按鍵按下 */
- {
- delay(3); /* 去抖動(dòng)延時(shí) */
- while((P1 & 0xf0) != 0xf0) /* 仍有鍵按下 */
- {
- switch(P1) /* 識(shí)別按鍵并賦值 */
- {
- case 0xee: skey = '7'; break;
- case 0xde: skey = '8'; break;
- case 0xbe: skey = '9'; break;
- case 0x7e: skey = '/'; break;
- default: skey = '#';
- }
- while((P1 & 0xf0) != 0xf0) /* 等待按鍵松開(kāi) */
- ;
- }
- }
- /***********************
- 掃描鍵盤(pán)第2行
- ************************/
- P1 = 0xfd;
- while((P1 & 0xf0) != 0xf0)
- {
- delay(3);
- while((P1 & 0xf0) != 0xf0)
- {
- switch(P1)
- {
- case 0xed: skey = '4'; break;
- case 0xdd: skey = '5'; break;
- case 0xbd: skey = '6'; break;
- case 0x7d: skey = '*'; break;
- default: skey = '#';
- }
- while((P1 & 0xf0) != 0xf0)
- ;
- }
- }
- /***********************
- 掃描鍵盤(pán)第3行
- ************************/
- P1 = 0xfb;
- while((P1 & 0xf0) != 0xf0)
- {
- delay(3);
- while((P1 & 0xf0) != 0xf0)
- {
- switch(P1)
- {
- case 0xeb: skey = '1'; break;
- case 0xdb: skey = '2'; break;
- case 0xbb: skey = '3'; break;
- case 0x7b: skey = '-'; break;
- default: skey = '#';
- }
- while((P1 & 0xf0) != 0xf0)
- ;
- }
- }
- /***********************
- 掃描鍵盤(pán)第4行
- ************************/
- P1 = 0xf7;
- while((P1 & 0xf0) != 0xf0)
- {
- delay(3);
- while((P1 & 0xf0) != 0xf0)
- {
- switch(P1)
- {
- case 0xe7: skey = '[b]
- ; break;
- case 0xd7: skey = '0'; break;
- case 0xb7: skey = '='; break;
- case 0x77: skey = '+'; break;
- default: skey = '#';
- }
- while((P1 & 0xf0) != 0xf0)
- ;
- }
- }
- return skey;
- }
- void main()
- {
- uint value1, value2, value; /* 數(shù)值1,數(shù)值2,結(jié)果 */
- uchar ckey, cut1 = 0, cut2 = 0; /* ckey鍵盤(pán)輸入字符 */
- uchar operator; /* 運(yùn)算符 */
- uchar i, bool = 0;
- init: /* goto語(yǔ)句定位標(biāo)簽 */
- buf(0); /* 初始化 */
- disp();
- value = 0;
- cut1 = cut2 = 0;
- bool = 0;
- for(i = 0;i < 9;i++)
- {
- operand1[i] = '\0';
- operand2[i] = '\0';
- } /* 初始化 */
- while(1)
- {
- ckey = keyscan(); /* 讀取鍵盤(pán) */
- if(ckey != '#')
- { /* isdigit函數(shù),字符是阿拉伯?dāng)?shù)字返回非0值,否則返回0 */
- if(isdigit(ckey))
- {
- switch(bool)
- {
- case 0:
- operand1[cut1] = ckey;
- operand1[cut1+1] = '\0';
- value1 = atoi(operand1); /* atoi函數(shù),將字符串轉(zhuǎn)化為,int整數(shù) */
- cut1++;
- buf(value1);
- disp();
- break;
- case 1:
- operand2[cut2] = ckey;
- operand2[cut2+1] = '\0';
- value2 = atoi(operand2);
- cut2++;
- buf(value2);
- disp();
- break;
- default: break;
- }
- }
- else if(ckey=='+'||ckey=='-'||ckey=='*'||ckey=='/')
- {
- bool = 1;
- operator = ckey;
- buf(0);
- dbuf[7] = 10;
- disp();
- }
- else if(ckey == '=')
- {
- value = compute(value1,value2,operator);
- buf(value);
- disp();
- while(1) /* 計(jì)算結(jié)束等待清零鍵按下 */
- {
- ckey = keyscan();
- if(ckey == '
- ) /* 如果有清零鍵按下跳轉(zhuǎn)到開(kāi)始 */
- goto init;
- else
- {
- buf(value);
- disp();
- }
- }
- }
- else if(ckey == '[b]
- )
- { goto init;}
- }
- disp();
- }
- }
- /******************************************
- 運(yùn)算函數(shù)
- 輸入:操作數(shù)和操作符
- 輸出:計(jì)算結(jié)果
- *******************************************/
- uint compute(uint va1,uint va2,uchar optor)
- {
- uint value;
- switch(optor)
- {
- case '+' : value = va1+va2; break;
- case '-' : value = va1-va2; break;
- case '*' : value = va1*va2; break;
- case '/' : value = va1/va2; break;
- default : break;
- }
- return value;
- }
- /*******************************************
- 更新顯示緩存
- 輸入:無(wú)符號(hào)整數(shù)
- 輸出:將輸入送入顯示緩存
- *******************************************/
- void buf(uint val)
- {
- uchar i;
- if(val == 0)
- {
- dbuf[7] = 0;
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
全部資料51hei下載地址:
單片機(jī)簡(jiǎn)易計(jì)算器.zip
(367.32 KB, 下載次數(shù): 577)
2018-6-22 10:43 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|