❶ 用單片機設計簡易計算器
給你些子程序,自己看著湊吧。呵呵。有了這些,寫出來應該不難了。
;@@@@@@@@@雙位元組整數運算@@@@@@@@@@@@@@@@@@
;***********雙位元組無符號加法**************
;入口:R6(H),R7,R4(H),R5,出口:和R6(H),R7(L)
UADD: MOV A,R7
ADD A,R5
MOV R7,A
MOV A,R6
ADDC A,R4
MOV R6,A
RET
;***********雙位元組無符號減法**************
;入口:被減數R6(H),R7(L),減數R4(H),R5(L),出口:差R6(H),R7(L)
CLR C
MOV A,R7
SUBB A,R5
MOV R7,A
MOV A,R6
SUBB A,R4
MOV R6,A
RET
;***********雙位元組無符號乘法**************
;入口:R6(H),R7(L),R4(H),R5(L),出口:積R6(H),R7(L)
UMUL: MOV A,R7
MOV B,R5
MUL AB
MOV R0,B
XCH A,R7
MOV B,R4
MUL AB
ADD A,R0
XCH A,R6
MOV B,R5
MUL AB
ADD A,R6
MOV R6,A
RET
;***********雙位元組無符號除法*****************
;入口:R6(H),R7(L),R4(H),R5(L),出口:商R6(H),R7(L),余R4(H),R5(L)
;影響:R2,R3,
;堆棧需求:1
UDIV: CLR C
CLR A
MOV R2,A
MOV R3,A
MOV B,#10H
MOVBIT: MOV A,R7;R6、R7中數據左移一位到R2、R3中,C到R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
CLR C ;R2R3-R4R5
MOV A,R3
SUBB A,R5
PUSH Acc
MOV A,R2
SUBB A,R4
JBC Cy,MOVBIT0;不夠減,清C繼續左移
MOV R2,A;夠減,存回余數並置位C
POP Acc
MOV R3,A
SETB C
SJMP MOVBIT1
MOVBIT0: POP Acc
MOVBIT1: DJNZ B,MOVBIT
MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R2
MOV R4,A
MOV A,R3
MOV R5,A
RET
(7) 標號: DIVD 功能:雙位元組二進制無符號數除法
入口條件:被除數在R2、R3、R4、R5中,除數在R6、R7中。
出口信息:OV=0 時,雙位元組商在R2、R3中,OV=1 時溢出。
影響資源:PSW、A、B、R1~R7 堆棧需求: 2位元組
DIVD: CLR C ;比較被除數和除數
MOV A,R3
SUBB A,R7
MOV A,R2
SUBB A,R6
JC DVD1
SETB OV ;溢出
RET
DVD1: MOV B,#10H ;計算雙位元組商
DVD2: CLR C ;部分商和余數同時左移一位
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV F0,C ;保存溢出位
CLR C
SUBB A,R7 ;計算(R2R3-R6R7)
MOV R1,A
MOV A,R2
SUBB A,R6
ANL C,/F0 ;結果判斷
JC DVD3
MOV R2,A ;夠減,存放新的余數
MOV A,R1
MOV R3,A
INC R5 ;商的低位置一
DVD3: DJNZ B,DVD2 ;計算完十六位商(R4R5)
MOV A,R4 ;將商移到R2R3中
MOV R2,A
MOV A,R5
MOV R3,A
CLR OV ;設立成功標志
RET
❷ 基於51單片機的簡易計算器設計,急
//功能 0 1 2 3 4 5 6 7 8 9 + - × ÷ = 清零 表3-1 3.2 計算器的軟體設計
#include<reg51.h> //頭文件
#define uint unsigned int //
#define uchar unsigned char
sbit lcden=P2^3; //定義引腳
sbit rs=P2^4;
sbit rw=P2^0;
sbit busy=P0^7;
char i,j,temp,num,num_1;
long a,b,c; //a,第一個數 b,第二個數 c,得數
float a_c,b_c;
uchar flag,fuhao;//flag表示是否有符號鍵按下,fuhao表徵按下的是哪個符號
uchar code table[]={ 7,8,9,0, 4,5,6,0, 1,2,3,0, 0,0,0,0};
uchar code table1[]={
7,8,9,0x2f-0x30,
4,5,6,0x2a-0x30,
1,2,3,0x2d-0x30,
0x01-0x30,0,0x3d-0x30,0x2b-0x30};
void delay(uchar z) // 延遲函數
{
uchar y;
for(z;z>0;z--)
for(y=0;y<110;y++);
} void check() // 判斷忙或空閑
{
do{
P0=0xFF;
rs=0; //指令
rw=1; //讀
lcden=0; //禁止讀寫
delay(1); //等待,液晶顯示器處理數據
lcden=1; //允許讀寫
}while(busy==1); //判斷是否為空閑,1為忙,0為空閑
}
void write_com(uchar com) // 寫指令函數
{
P0=com; //com指令付給P0口
rs=0;
rw=0;
lcden=0;
check();
lcden=1;
}
void write_date(uchar date) // 寫數據函數
{
P0=date;
rs=1;
rw=0;
lcden=0;
check();
lcden=1;
}
void init() //初始化
{
num=-1;
lcden=1; //使能信號為高電平
write_com(0x38); //8位,2行
write_com(0x0c); //顯示開,游標關,不閃爍*/
write_com(0x06); //增量方式不移位 顯竟獗暌貧 柚?
write_com(0x80); //檢測忙信號
write_com(0x01); //顯示開,游標關,不閃爍
num_1=0;
i=0;
j=0;
a=0; //第一個參與運算的數
b=0; //第二個參與運算的數
c=0;
flag=0; //flag表示是否有符號鍵按下,
fuhao=0; // fuhao表徵按下的是哪個符號
}
void keyscan() // 鍵盤掃描程序
{
P3=0xfe;
if(P3!=0xfe)
{
delay(20); //延遲20ms
if(P3!=0xfe)
{
temp=P3&0xf0;
switch(temp)
{
case 0xe0:num=0;
break;
case 0xd0:num=1;
break;
case 0xb0:num=2;
break;
case 0x70:num=3;
break;
}
}
while(P3!=0xfe);
if(num==0||num==1||num==2)//如果按下的是'7','8'或'9
{
if(j!=0)
{
write_com(0x01);
j=0;
}
if(flag==0)//沒有按過符號鍵
{
a=a*10+table[num];
}
else//如果按過符號鍵
{
b=b*10+table[num];
}
}
else//如果按下的是'/'
{
flag=1;
fuhao=4;//4表示除號已按
}
i=table1[num];
write_date(0x30+i);
}
P3=0xfd;
if(P3!=0xfd)
{
delay(5);
if(P3!=0xfd)
{
temp=P3&0xf0;
switch(temp)
{
case 0xe0:num=4;
break;
case 0xd0:num=5;
break;
case 0xb0:num=6;
break;
case 0x70:num=7;
break;
}
}
while(P3!=0xfd);
if(num==4||num==5||num==6&&num!=7)//如果按下的是'4','5'或'6'
{
if(j!=0)
{
write_com(0x01);
j=0;
}
if(flag==0)//沒有按過符號鍵
{
a=a*10+table[num];
}
else//如果按過符號鍵
{
b=b*10+table[num];
}
}
else//如果按下的是'/'
{
flag=1;
fuhao=3;//3表示乘號已按
}
i=table1[num];
write_date(0x30+i);
}
P3=0xfb; if(P3!=0xfb)
{
delay(5);
if(P3!=0xfb)
{
temp=P3&0xf0;
switch(temp)
{
case 0xe0:num=8;
break;
case 0xd0:num=9;
break;
case 0xb0:num=10;
break;
case 0x70:num=11;
break;
}
}
while(P3!=0xfb);
if(num==8||num==9||num==10)//如果按下的是'1','2'或'3'
{
if(j!=0)
{
write_com(0x01);
j=0;
}
if(flag==0)//沒有按過符號鍵
{
a=a*10+table[num];
}
else//如果按過符號鍵
{
b=b*10+table[num];
}
}
else if(num==11)//如果按下的是'-'
{
flag=1;
fuhao=2;//2表示減號已按
}
i=table1[num];
write_date(0x30+i);
}
P3=0xf7;
if(P3!=0xf7)
{
delay(5);
if(P3!=0xf7)
{
temp=P3&0xf0;
switch(temp)
{
case 0xe0:num=12;
break;
case 0xd0:num=13;
break;
case 0xb0:num=14;
break;
case 0x70:num=15;
break;
}
}
while(P3!=0xf7);
switch(num)
{
case 12:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;}//按下的是"清零"
break;
case 13:{ //按下的是"0"
if(flag==0) //沒有按過符號鍵
{
a=a*10;
write_date(0x30);
P1=0;
}
else if(flag==1)//如果按過符號鍵
{
b=b*10;
write_date(0x30);
}
}
break;
case 14:{j=1;
if(fuhao==1){write_com(0x80+0x4f);//按下等於鍵,游標前進至第二行最後一個顯示處
write_com(0x04); //設置從後住前寫數據,每寫完一個數據,游標後退一格
c=a+b;
while(c!=0)
{
write_date(0x30+c%10);
c=c/10;
}
write_date(0x3d); //再寫"="
a=0;b=0;flag=0;fuhao=0;
}
else if(fuhao==2){write_com(0x80+0x4f); //游標前進至第二行最後一個顯示處
write_com(0x04); //設置從後住前寫數據,每寫完一個數據,游標後退一格
//(這個照理說順序不對,可顯示和上段一樣)
if(a-b>0)
c=a-b;
else
c=b-a;
while(c!=0)
{
write_date(0x30+c%10);
c=c/10;
}
if(a-b<0)
write_date(0x2d);
write_date(0x3d); //再寫"="
a=0;b=0;flag=0;fuhao=0;
}
else if(fuhao==3){write_com(0x80+0x4f);
write_com(0x04);
c=a*b;
while(c!=0)
{
write_date(0x30+c%10);
c=c/10;
}
write_date(0x3d);
a=0;b=0;flag=0;fuhao=0;
}
else if(fuhao==4){write_com(0x80+0x4f);
write_com(0x04);
i=0;
c=(long)(((float)a/b)*1000);
while(c!=0)
{
write_date(0x30+c%10);
c=c/10;
i++;
if(i==3)
write_date(0x2e);
}
if(a/b<=0)
write_date(0x30);
write_date(0x3d);
a=0;b=0;flag=0;fuhao=0;
}
}
break;
case 15:{write_date(0x30+table1[num]);flag=1;fuhao=1;}
break;
}
}
}
main()
{
init();
while(1)
{
keyscan();
}
}
❸ 單片機,設計一個計算器,能夠自定義按鍵鍵值,並能通過串口調試助手將執行結果顯示到計算機上。
你的這個題目范圍太大了。限於篇幅無法在細節上一一講明白。
主要的思路如下:
硬體設計:單片機需要能夠檢測鍵是否按下,就需要搭建電路。通常情況下按鍵有兩種方式:一種是直接將鍵通過電阻電容連接到單片機IO引腳上,這種方式適用於按鍵數量不太多或單片機引腳數量足夠多的情況。另外一種是將鍵縱橫排列成按鍵網路,通過掃描的方法檢測按下的是哪個鍵,這種適用於鍵數量較多,或IO引腳不足的情況,比如你的圖上有4X4=16鍵,直接連接的方法需要16個IO口,網路的話,只需要4+4=8個IO口即可完成。具體哪種根據需要來,具體電路網上搜索。
另外就是通訊電路,這個網上有好多RS232的,不再細說
演算法設計
由於是鍵盤,除了檢測到哪個鍵按下外,還應該包含一定的消除抖動的能力,防止按下一個鍵卻觸發好多次同樣的按下此鍵的情況。
另外需要在單片機內存中建立「鍵-鍵值」的對應關系表,因為你要求能夠自定義鍵值。
通訊
你沒有提到通訊是實時發送還是按下一個鍵,比如回車鍵後才發送。
由於鍵盤的速度比較低,為了簡單,可以採用檢測到一個鍵按下後就發送一個鍵的代碼。
根據你所採用的單片機的不同,所用的對通訊的初始化、發送等代碼也有所不同。具體不再細說。
❹ 基於51單片機的簡易計算器製作
您好,這樣的:
縱觀單片機的發展過程,可以預示單片機的發展趨勢,;1)低功耗CMOS化;MCS-51系列的8051推出時的功耗達630m;2)微型單片化;現在常規的單片機普遍都是將中央處理器(CPU)、;此外,現在的產品普遍要求體積
照程序設計的各部分實現的功能不同,將整個軟體系統分成了三個塊,並對每一個功能塊所採用的元器件進行了詳細介紹。此外還編寫了主要功能模塊的基本程序,詳盡闡述了各模塊的工作過程。還有總流程圖,源代碼,硬器件鋪線圖。
❺ 基於單片機的多功能計算器設計文獻綜述
hh
❻ 一、設計題目 基於單片機的簡易計算器設計 二、設計任務 1、用單片機設計一簡易計算器。 2、採用4*4鍵盤,
1. 4X4鍵盤輸入,點陣字元型液晶顯示。
2. 由於所採用的浮點程序庫的限制(MCU平台只找到這個……),浮點運算採用3位元組二進制補碼表示,有效數字6位。對於輸入輸出,採用3位元組BCD碼浮點數格式,有效數字只有4位,因此最終有效數字只有4位。
3. 可進行連續輸入,例如:1.23+4.56*8.23/234.8 ,但是運算結果為從左到右,這也是8位簡易計算器的方式。
4. 可進行錯誤判斷,溢出、除零等錯誤將顯示一個字元 E 。
5. 由於鍵盤只有16個按鍵,安排如下:
+---------------+
| 7 | 8 | 9 | + |
| 4 | 5 | 6 | - |
| 1 | 2 | 3 | * |
| 0 | . | = | / |
+---------------+
6. 按鍵的缺少導致取消了一些特殊函數,即開根號,三角函數(sin, cos, tan, ctg)的實現,由於這些函數在浮點程序庫中均已提供,如果硬體允許,在原來的框架上添加這些附加功能是很容易的(可以看作和+, -, *, /等價的按鍵操作,調用不同的子程序進行運算即可)
7. 按兩次 = 等於清靈。因為按鍵實在太少,才採用了這個做法。
8. 相應舉例:
按鍵 結果 說明
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
123+= 123 按下等號而沒有第二個操作數,保留第一個操作數
並認為此次運算結束(等號的功能)
123+321/111 4.0 等價於(123+321) / 111
2.3+5.4=/0.1+ 77 等號後直接按 / ,則將前面的運算結果作為第一個
操作數
1/0= E 錯誤顯示
要源碼去這里:
❼ 基於單片機的多功能計算器
不會吧,這么有趣,我前幾天做的課程設計就是這個啊!
剛剛花了一個星期做完了這個計算器,硬體,程序,論文都已經完成了。
我裡面沒用到74LS244或74LS240、與非門等器件,就是用到了51單片機和數碼管來實現的
因為51裡面的IO口多,沒必要用這些東西,如果要用也可以,哈哈。
如果你急要,我發你吧!
❽ 基於MSP430單片機的簡易計算器設計
這是我以前的,你可以看看:
第六頁 開始:模擬+程序
http://wenku..com/view/2447d32d915f804d2b16c18e.html