如何用51微控制器做能運算小數的計算器

2021-03-03 20:57:17 字數 5614 閱讀 6297

1樓:匿名使用者

你好!顯示是液晶還是數碼管?精確到幾位小數?

51微控制器計算出的小數如何儲存

2樓:匿名使用者

熟悉c51的算術運算子功能,就明白了。51微控制器中是沒有小數的,x/y 得到的結果是商的整數,x%y得到的是商的餘數。如果想精確計算商的小數,需要運用演算法,最直接的演算法就是,將餘數乘10倍,即餘數×10/y, 得到第一位小數,類似得到後續的小數位

求一個基於51微控制器的利用數碼管顯示的有小數點的計算器的c程式 130

3樓:大維

程式的話可以給你一個作為參考!  實現了計算結果的小數顯示。

//掃描顯示6位數碼管,顯示資訊為緩衝區的六個「0」

//2017.8.7 新增浮點數顯示支援

#include//標頭檔案定義

#include

#include

#define uchar unsigned char // 巨集定義

#define uint unsigned int

#define key p1

uchar code tab=;  //00 顯示空

uchar disp_buffer[6]= ,buf[10]; //顯示緩衝區

uchar flag = 0;

long dat1,dat2;

float temp;

bit keypress = 1,getv = 0;

void p_data(long dat);

void display();

//延時子程式,帶有輸入引數 m

void delay(unsigned int m)}}

//按鍵掃描程式 4x4

uchar key()

}return 0xff;

}void keyscan()

dat1 = 0;

dat2 = 0;

flag = 0;

break;

case 0x0f:

if(!getv)

else

break;

default:

if(!getv) //根據getv的值判斷是第一個資料還是第二個資料!

else

break;

}} }}

else

keypress = 1;

//填充disp_buffer   浮點數資料處理 轉換為整數,並標記小數點位置

uchar float_int_dot(float numf)

sprintf(buf,"%f",numf);

for(ct = 7 ,ctn = 5; ct != 0 ; ct--)

else if(buf[ct - 1] != '0')//不等於0 則將ascii轉換為數值填充入顯示緩衝區,

}return dotps;

//填充disp_buffer ,資料處理

void p_data(long dat)

else

disp_buffer[5 - pi] = 16;

dat = dat/10;}}

//顯示子程式

void display(uchar  flash , uchar count, uchar dot) //dot 代表現實小數點的位置

else

p0 = tab[disp_buffer[i]];                //送顯示段碼

*//*方法二***************/

if(!(flash&0x01))

else

p0 = tab[disp_buffer[i]];                //送顯示段碼

flash = flash >> 1;

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

if(dot - 1 == 5 - i)

p0 = p0|0x80;

delay(2);

p0 = 0x00;                               //消隱

temp = _crol_(temp,1);

}//主函式

void main()  }

proteus **圖

4樓:匿名使用者

51微控制器的硬體設施決定了軟體所以單純的利用軟體是沒有意義的。只能增強自己程式設計理解能力。

你的要求需要利用四位以上的數碼管。由於達到了四位每個數碼管需要八個引腳。然後利用微控制器的另外四個引腳控制四個三極體做掃描市的顯示比較省引腳和電能。

按鍵設計也需要掃描設計。也需要八個引腳這樣功能多些。例如設計加減乘除小數點

設計思路可以這樣。

利用數碼管顯示需要構造字元庫就是字模然後在取模顯示或者取餘顯示。

這樣的程式網上很多。不過是液晶顯示器的比較多。可以兩個加起來一起用

5樓:匿名使用者

可以將數放大十倍作為整數處理,顯示時再轉換回來

6樓:匿名使用者

好吃的東西代表著你所期待的東西。可能有一種這樣的想法,在經歷平凡或者挫折後

怎樣用51微控制器做計算器啊?

7樓:浮生梔

1、首先第一步就是要進行查詢元器件並放入到原理圖中,如下圖所示。

2、接著就是要進行原理圖連線根據網路標籤的方式即可。

3、然後就是要進行編寫程式,

程式源**

#include #include

#include

#include

#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);

4、最後一步就是進行驗證正確後編譯程式在protues中載入hex觀察**結果是否正確,如下圖所示。

擴充套件資料

電腦**:

微控制器有了開發系統,隨著微控制器的發發系統也在不斷髮展。 keil是一種先進的微控制器整合開發系統。

它代表著組合語言微控制器開發系統的最新發展,首創多項便利技術,將開發的程式設計/**/除錯/寫入/加密等所有過程一氣呵成,中間不須任何編譯或彙編。

功能特性:

1、可以**63k程式空間,接近64k 的16位地址空間;

2、可以**64kxdata 空間,全部64k 的16位地址空間;

3、可以真實**全部32 條io腳;

4,完全相容keilc51 uv2 除錯環境,可以通過uv2 環境進行單步,斷點, 全速等操作;

5、可以使用c51語言或者a**組合語言進行除錯 ;

6、可以非常方便地進行所有變數觀察,包括滑鼠取值觀察,即滑鼠放在某 變數上就會立即顯示出它此的值;

7、可選 使用使用者晶振,支援0-40mhz晶振頻率;

8、片上帶有768位元組的xdata,您可以在**時選 使用他們,進行xdata 的**;

9、可以**雙dptr 指標;

10、可以**去除ale 訊號輸出. ;

11、自適應300-38400bps 的所有波特率通訊;

12、體積非常細小,非常方便插入到使用者板中.插入時緊貼使用者板,沒有連線電纜,這樣可以有效地減少執行中的干擾,避免**時出現莫名其妙的故障;

13、**插針採用優質鍍金插針,可以有效地防止日久生鏽,選擇優質園腳ic插座,保護**插針,同時不會損壞目標板上的插座. ;

14,**時監控和使用者**分離,不可能產生不能**的軟故障;

15、rs-232介面不計成本採用max202積體電路,序列通訊穩定可靠,絕非一般三極體的簡易電路可比。

功能限制:

**器佔用微控制器串列埠及定時器2,與keil c(pc)通訊,故不支援串列埠及定時器2 的**功能。全速執行時微控制器串列埠及定時器2 可供使用者使用。

使用方法:

1、將**器插入需**的使用者板的cpu插座中,**器由使用者板供電;

2、將**器的序列電纜和pc機接好,開啟使用者板電源;

8樓:心脆任憔悴

1、硬體**圖

硬體部分比較簡單,當鍵盤按鍵按下時它的那一行、那一列的埠為低電平。因此,只要掃描行、列埠是否都為低電平就可以確定是哪個鍵被按下。

2、主程式流程圖

程式的主要思想是:將按鍵抽象為字元,然後就是對字元的處理。將運算元分別轉化為字串儲存,操作符儲存為字元形式。

然後呼叫***pute()函式進行計算並返回結果。具體程式及看註釋還有流程圖。

3、altium designer畫的pcb圖

4、程式源**

#include #include

#include

#include

#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 ***pute(uint va1,uint va2,uchar optor);

uchar code table = ;

uchar dbuf[8] = ;

void delay(uint z)

uchar keyscan()

while((p1 & 0xf0) != 0xf0) ;}

}p1 = 0xfd;

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

while((p1 & 0xf0) != 0xf0);}

}p1 = 0xfb;

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

while((p1 & 0xf0) != 0xf0);}

}p1 = 0xf7;

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

while((p1 & 0xf0) != 0xf0);}

}return skey;

}void main()

while(1)

}else if(ckey=='+'||ckey=='-'||ckey=='*'||ckey=='/')

else if(ckey == '=')}}

else if(ckey == '$')

}disp();}}

uint ***pute(uint va1,uint va2,uchar optor)

return value;

}void buf(uint val)

else

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

for( ; i > 0; i--)

dbuf[i] = 10;

}void disp(void)}

請教下51微控制器彙編濾波問題,微控制器如何用C語言以及組合語言寫濾波程式?

1.你要把30h開始的8個位元組加起來,和放在位元組變數可能溢位,所以你的 把和放在r2r3拼起來的16位單元中 每個位元組先加到r3中,有進位則r2 加1 2.第一次的swap a 和 rl a 的作用是把剛才求和結果的高位位元組中的bit0,1,2移位到bit5,6,7 相當於高位位元組除以8的...

如何用51微控制器 uln2019a驅動12v繼電器用的是開關雙電源5v和12v

2003和繼電器之間加一光耦。或直接用微控制器驅動光耦再控制繼電器。用光耦隔離就行 但用 51微控制器 uln2003a驅動12v繼電器 用的是開關雙電源5v和12v 我也見過.不難的.我用過51微控制器 三極體驅動12v繼電器 用的是開關雙電源5v和12v 我也見過有人用微控制器直接驅動220v的...

51微控制器的定時器怎麼做延時51微控制器的定時器怎麼做延時彙編

1 你的主程式必須在1秒內完成一個過程,然後等待下一秒的到來 2 主程式放在一個迴圈內,並回設定答一個標記,以判斷是否觸發執行主程式,還是繼續空迴圈 3 這個標記就由延時中斷例程來賦值 其實,如果你的主程式能夠在1秒內完成,由沒有其他任務的話,完全可以放在中斷例程裡執行的 貌似想到的方法和複雜,就是...