導航:首頁 > 源碼編譯 > 在單片機編程計演算法

在單片機編程計演算法

發布時間:2022-05-23 03:04:20

單片機簡易計算器設計的程序

展開全部
首先會按鍵掃描,再會數碼管或液晶屏顯示,基本上可以了
程序
流程:
掃描按鍵(最多5次,最大65536,簡易計算器嗎)獲得一個數,再掃描按鍵獲得加減乘除符號
掃描按鍵獲得另一個數
掃描按鍵獲得「=」,顯示計算結果
由於程序比較長,且與硬體有關,因此只貼出主程序:
void
main()
{
while(1)
{
c=1;
while(c<6)//輸入第1個5
位數
{
keyval=keyscan();
if(keyval<10)
{
switch(c)
{
case
1:b1=keyval;
break;
case
2:b2=keyval;
break;
case
3:b3=keyval;
break;
case
4:b4=keyval;
break;
case
5:b5=keyval;
break;
}
c++;
}
display1(b1,b2,b3,b4,b5);
}
while(c==6)
//輸入計算符號
{
keyval=keyscan();
if((keyval>=10)&&(keyval<14))
//10-13代表加減乘除
4種符號
{
d=keyval;
}
c=1;
display3(d);
}
while(c<6)
//輸入第2個5
位數
{
keyval=keyscan();
if(keyval<10)
{
switch(c)
{
case
1:d1=keyval;
break;
case
2:d2=keyval;
break;
case
3:d3=keyval;
break;
case
4:d4=keyval;
break;//

case
5:d5=keyval;
break;
}
c++;
}
display2(d1,d2,d3,d4,d5);
}
bb=
b1*10000+b2*1000+b3*100+b4*10+b5;//5個按鍵數值合成一個數
dd=d1*10000+d1*1000+d3*100+d4*10+d5;
//另外5個按鍵數值也合成一個數
while(keyval!=14)
//等待按下"="
{
keyval=keyscan();
}
Delay1ms(10);
switch(d)
{
case
10:ee=bb+dd;
break;//+
case
11:
flag1=1;//結果是負數的標志,先假定是負數
if(bb>=dd)
{
ee=bb-dd;
//結果不是負數
flag1=0;
}
else
ee=dd-bb;
//減數和被減數交換
break;
case
12:ee=bb*dd;
break;//*可能會溢出
case
13:ee=bb/dd;
//除法小數部分會丟失,保留2位
ff=bb%dd;
fd1=ff*10/dd;
fd2=ff*100/dd%10;
break;
}
f10=ee/1000000000%10;
f9=ee/100000000%10;
f8=ee/10000000%10;
f7=ee/1000000%10;
f6=ee/100000%10;
f5=ee/10000%10;
f4=ee/1000%10;
f3=ee/100%10;
f2=ee/10%10;
f1=ee%10;
display4(f10,f9,f8,f7,f6,f4,f4,f3,f2,f1,fd1,fd2);
while(keyval!=15)
{
keyval=keyscan();
}
b1=0;b2=0;b3=0;b4=0;b5=0;
d1=0;d2=0;d3=0;d4=0;d5=0;
bb=0;dd=0;ee=0;
init2();
}
}

② 51單片機鍵盤矩陣實現個位加法計算器,用c編程

KEYBUF
EQU
40H
;鍵號存放單元
ORG
0000H
LJMP
MAIN
ORG
0030H
MAIN:
MOV
KEYBUF,#0
;初始鍵號設位0,也可以為任意值
MOV
R0,#30H
;顯示首地址
MOV
R2,#0CH
;計算數據存放單元個數
CLR
A
QING:
MOV
@R0,A
;將數據存放單元清零
INC
R0
DJNZ
R2,QING
MOV
P0,#8FH
;關閉顯示
MOV
R1,#30H
;將顯示首地址存放R1里

③ 單片機編程計算

MOV A, X MOV B, #10 MUL AB MOV Z, A MOV Z+1, B MOV A, Y MOV B, #5 DIV AB ADD A, Z JNC NEXT INC Z+1 NEXT: CLR C SUBB A, #5 MOV Z, A JNC NEXT2 INC Z+1 NEXT2: END X,Y為位於內部RAM30H,31H單元的單位元組變數, Z位於32H33H,低位元組在前。

④ 如何用51單片機做計算器(要求用C語言編程) 由於是新手所以沒積分 對不住各位了

給你參考一下的,我最近做的:

我的實驗板上的鍵不夠,所以只能做加法運算,而且兩數之和不能大於十。

嘿嘿,沒錯這個給某種人用的。

//**********myh.h***********有兩個文件,一個是頭文件myh.h一個是js.c

#include<reg52.h>

typedefunsignedcharuchar;

typedefunsignedintuint;

typedefbitBOOL;

//**

sbitrs=P2^6;

sbitrw=P2^5;

sbite=P2^7;

//**

ucharKey_Down(void);//返回0到12的鍵盤的編碼

voiddelay(uchar);//延時

voidInit(void);

voidWrite_Cmd(uchar);

voidWrite_Data(uchar);

BOOLIf_Busy();

//**

ucharcodeLcd_tab[]="0123456789+=";

ucharcodeKey_tab[]={0xb7,0xbb,0xbd,0xbe,0xd7,0xdb,0xdd,0xde,0xe7,0xeb,0xed,0xee};

//**********

uintQ0;

uintQ1;

uintQ2;

//*************js.c********

#include"myh.h"

//**************

voidmain()

{ucharm_key;

ucharm_inc=0;

Init();

Write_Cmd(0x80);

while(1)

{Q1=0;

Q0=0;

Q2=0;

m_key=Key_Down();

Write_Cmd(0x01);

Write_Data(Lcd_tab[m_key]);

Q0=m_key;

m_key=Key_Down();

Write_Data(Lcd_tab[m_key]);

m_key=Key_Down();

Write_Data(Lcd_tab[m_key]);

Q1=m_key;

m_key=Key_Down();

Write_Data(Lcd_tab[m_key]);

Q2=Q0+Q1;

Write_Data(Lcd_tab[Q2]);

}

}

//************************

ucharKey_Down(void)

{ucharKey_number=0;

ucharm_cx;

ucharm_cy;

ucharm_cxy;

P3=0x0f;

m_cx=P3;

while(1)

{if(m_cx!=0x0f)

{delay(500);

m_cx=P3;

if(m_cx!=0x0f)

break;}

else{P3=0x0f;m_cx=P3;}

}

P3=0x0f;

m_cx=P3&0x0f;

P3=0xf0;

m_cy=P3&0xf0;

m_cxy=m_cx|m_cy;

for(Key_number=0;Key_number<12;Key_number++)

{if(m_cxy==Key_tab[Key_number])

break;

}

returnKey_number;}

//**********

voiddelay(uchartime)

{ucharj;

for(;time>0;time--)

for(j=0;j<200;j++);

}

//**************

voidinit()

{delay(10);

Write_Cmd(0x38);

delay(10);

Write_Cmd(0x38);

delay(10);

Write_Cmd(0x38);

delay(10);

Write_Cmd(0x0c);

delay(10);

Write_Cmd(0x06);

delay(10);

Write_Cmd(0x01);

}

//***********

voidWrite_Cmd(ucharcmd)

{//while(If_Busy());

e=0;

rw=0;

rs=0;

delay(4);

P0=cmd;

delay(4);

e=1;

delay(10);

e=0;

}

//***

voidWrite_Data(uchardat)

{//while(If_Busy());

e=0;

rw=0;

rs=1;

delay(4);

P0=dat;

delay(4);

e=1;

delay(10);

e=0;

}

//**

BOOLIf_Busy()

{

BOOLresult;

rw=1;

rs=0;

e=1;

delay(4);

result=(BOOL)(P2&0x80);

e=0;

returnresult;

}

⑤ 單片機編程

1:
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0INT
ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
SETB ET0
SETB EA
MOV A,#0FEH
SJMP $
T0INT:
CLR TR0
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
MOV P1,A
RL A
RETI
END
2:
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0INT
ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#0FEH
MOV TL0,#0CH
SETB TR0
SETB ET0
SETB EA
SJMP $
T0INT:
CLR TR0
MOV TH0,#0FEH
MOV TL0,#0CH
SETB TR0
CPL P1.1
RETI
END

⑥ 單片機做計算器的程序

1、直接調用庫函數。

⑦ 單片機如何編程計算該16個單元的數值之和

QIHE:
MOVR0,#30H
MOVR2,#16
MOVR3,#0
MOVR4,#0
LOOP:
MOVA,@R0
ADDA,R4
MOVR4,A
CLRA
ADDCA,R3
MOVR3,A
INCR0
DJNZR2,LOOP
RET

⑧ 怎樣用51單片機做計算器啊

1、硬體模擬圖

4、程序源代碼

#include <reg51.h>#include <intrins.h>

#include <ctype.h>

#include <stdlib.h>

#define uchar unsigned char

#define uint unsigned int

uchar operand1[9], operand2[9];

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};

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

uchar keyscan()

{

uchar skey;

P1 = 0xfe;

while((P1 & 0xf0) != 0xf0)

{

delay(3);

while((P1 & 0xf0) != 0xf0)

{

switch(P1)

{

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)

;

}

}

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)

;

}

}

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)

;

}

}

P1 = 0xf7;

while((P1 & 0xf0) != 0xf0)

{

delay(3);

while((P1 & 0xf0) != 0xf0)

{

switch(P1)

{

case 0xe7: skey = '$'; 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;

uchar ckey, cut1 = 0, cut2 = 0;

uchar operator;

uchar i, bool = 0;

init:

buf(0);

disp();

value = 0;

cut1 = cut2 = 0;

bool = 0;

for(i = 0;i < 9;i++)

{

operand1[i] = '';

operand2[i] = '';

}

while(1)

{

ckey = keyscan();

if(ckey != '#')

{

if(isdigit(ckey))

{

switch(bool)

{

case 0:

operand1[cut1] = ckey;

operand1[cut1+1] = '';

value1 = atoi(operand1);

cut1++;

buf(value1);

disp();

break;

case 1:

operand2[cut2] = ckey;

operand2[cut2+1] = '';

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)

{

ckey = keyscan();

if(ckey == '$')

goto init;

else

{

buf(value);

disp();

}

}

}

else if(ckey == '$')

{ goto init;}

}

disp();

}

}

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;

}

void buf(uint val)

{

uchar i;

if(val == 0)

{

dbuf[7] = 0;

i = 6;

}

else

for(i = 7; val > 0; i--)

{

dbuf[i] = val % 10;

val /= 10;

}

for( ; i > 0; i--)

dbuf[i] = 10;

}

void disp(void)

{

uchar bsel, n;

bsel=0x01;

for(n=0;n<8;n++)

{

P2=bsel;

P0=table[dbuf[n]];

bsel=_crol_(bsel,1);

delay(3);

P0=0xff;

}

}

(8)在單片機編程計演算法擴展閱讀:

PROTEUS 是單片機課堂教學的先進助手

PROTEUS不僅可將許多單片機實例功能形象化,也可將許多單片機實例運行過程形象化。前者可在相當程度上得到實物演示實驗的效果,後者則是實物演示實驗難以達到的效果。

它的元器件、連接線路等卻和傳統的單片機實驗硬體高度對應。這在相當程度上替代了傳統的單片機實驗教學的功能,例:元器件選擇、電路連接、電路檢測、電路修改、軟體調試、運行結果等。

課程設計、畢業設計是學生走向就業的重要實踐環節。由於PROTEUS提供了實驗室無法相比的大量的元器件庫,提供了修改電路設計的靈活性、提供了實驗室在數量、質量上難以相比的虛擬儀器、儀表,因而也提供了培養學生實踐精神、創造精神的平台

隨著科技的發展,「計算機模擬技術」已成為許多設計部門重要的前期設計手段。它具有設計靈活,結果、過程的統一的特點。可使設計時間大為縮短、耗資大為減少,也可降低工程製造的風險。相信在單片機開發應用中PROTEUS也能茯得愈來愈廣泛的應用。

使用Proteus 軟體進行單片機系統模擬設計,是虛擬模擬技術和計算機多媒體技術相結合的綜合運用,有利於培養學生的電路設計能力及模擬軟體的操作能力;

在單片機課程設計和全國大學生電子設計競賽中,我們使用 Proteus開發環境對學生進行培訓,在不需要硬體投入的條件下,學生普遍反映,對單片機的學習比單純學習書本知識更容易接受,更容易提高。

實踐證明,在使用 Proteus 進行系統模擬開發成功之後再進行實際製作,能極大提高單片機系統設計效率。因此,Proteus 有較高的推廣利用價值。

⑨ 單片機指令周期的計算

計算方法:PIC單片機的每四個時鍾周期為一個內部指令周期,例如:8MHz的晶振,則內部指令周期為1/(8/4)= 0.5 uS

實例一:35us, 8MHz的晶振, 8位定時器, 分頻比1/2 , 初值 E4

實例二:156.25us , 32768Hz的晶振, 8位定時器, 分頻比1/32 , 初值 FC

計算方法一: 35 = =(256-初值)*分頻*4/晶振 + 14/分頻 =(256-初值)+14/2

計算方法二:0.015625 =(256-初值)*分頻*4/晶振 = (256-初值)*32*4/32768

特別注意:分頻比1-8 需要加上一個14/分頻

指令周期是指令周期執行某一條指令所消耗的時間,它等於機器周期的整數倍。傳統的80C51單片機的指令周期大多數是單周期指令,也就是指令周期=機器周期,少部分是雙周期指令。

(9)在單片機編程計演算法擴展閱讀


在MCS-51系統中,有單周期指令,雙周期指令。四周期指令只有乘,除兩條指令。指令的運算速度和它的機器周期直接相關,機器周期數較小則執行速度快。

在編程時要注意選用具有同樣功能而機器周期數小的指令。每一條指令的執行都可以包括取指和執行兩個階段。在取指階段,CPU從內部或者外部ROM中取出指令操作碼及操作數,然後再執行這條指令。

在8051指令系統中,根據各種操作的繁簡程度,其指令可由單位元組,雙位元組和三位元組組成。從機器執行指令的速度看,單位元組和雙位元組指令都可能是單周期或雙周期,

而三位元組指令都是雙周期,只有乘,除指令佔四個周期,一條指令的位元組數表徵這條指令在存儲器中所佔空間大小,而周期數表徵運行這條指令所花時間長短,即運行速度。

⑩ 單片機上怎樣計數

做一個旋轉編碼的數據表,如果能直接計算的,可以寫出轉換公式。用一個寄存器或是地址存放當前旋轉位置的值,根據值查表或轉換得出相應的編碼。
正轉對該寄存器inc,反轉就dec即可。如何控制正反計數和計數總值就不用講了吧?

閱讀全文

與在單片機編程計演算法相關的資料

熱點內容
python基礎教程pdf下載 瀏覽:123
如何統計伺服器 瀏覽:742
蘋果和安卓怎麼贈送模組 瀏覽:803
伺服器倒計時怎麼弄 瀏覽:30
excel文件夾更新 瀏覽:433
億點連接app哪裡好 瀏覽:788
java掃碼支付 瀏覽:873
單片機行車記錄儀 瀏覽:391
oppo雲伺服器什麼意思 瀏覽:82
51單片機可以編譯多少公里 瀏覽:27
用什麼工具製作安卓應用 瀏覽:486
單片機數碼管的代碼 瀏覽:779
第一款安卓手機是什麼牌子 瀏覽:396
java非同步web 瀏覽:274
51單片機讀tf卡 瀏覽:940
linux下獲取文件 瀏覽:320
加密文件電腦顯示無屏幕截取許可權 瀏覽:356
虛榮安卓用什麼充值 瀏覽:754
阿里雲沒有伺服器如何備案 瀏覽:708
python用戶特性總結 瀏覽:731