微控制器的簡易計算器,怎麼用51微控制器做簡易計算器? 10

時間 2021-09-06 09:21:34

1樓:

基本功能介紹:

簡單的加減乘除的運算。

時間顯示功能,而且能實現計算器模組和時間模組之間的任意切換。

按鍵音卻換功能。

原理;多功能微控制器計算器是一個實現加減乘除的和時間功能的計算器,主要的硬體組成由,一個at89s52微控制器晶片,一個led液晶(1602液晶),一個4*4鍵盤,和4個特殊功能按鍵。

一個時鐘晶片(ds1302),一個蜂鳴器。

單個硬體模組個的介紹

at89s52:

主要控制晶片,它是由8kflash,256bram,6箇中斷源,詳情參考at89s52的技術文件.

1602液晶

1602液晶模組內部的字元發生儲存器(cgrom)已經儲存了160個不同的點陣字元圖形,這些字元有:阿拉伯數字、英文字母的大小寫、常用的符號等,每一個字元都有一個固定的**,比如大寫的英文字母“a”的**是01000001b(41h),顯示時模組把地址41h中的點陣字元圖形顯示出來,我們就能看到字母“a”,而且可以實現一些複雜的字元操作:1:

清顯示,游標復位到地址00h位置,2:游標和顯示模式設定 游標移動方向,高電平右移,低電平左移,螢幕上所有文字是否左移或者右移。高電平表示有效,低電平則無效 3:

顯示開關控制,控制整體顯示的開與關,高電平表示開顯示,低電平表示關顯示,控制游標的開與關,高電平表示有游標,低電平表示無游標,控制游標是否閃爍,高電平閃爍,低電平不閃爍4:游標或顯示移位,高電平時移動顯示的文字,低電平時移動游標5:功能設定命令 dl:

高電平時為4位匯流排,低電平時為8位匯流排 n:低電平時為單行顯示,高電平時雙行顯示 f: 低電平時顯示5x7的點陣字元,高電平時顯示5x10的點陣字元(高低電平在相應的指令上實現),詳情可參考1602的技術文件。

1602採用標準的16腳介面: 第1腳:vss為地電源第2腳:

vdd接5v正電源第3腳:v0為液晶顯示器對比度調整端,接正電源時對比度最弱,接地電源時對比度最高,對比度過高時會產生“鬼影”,使用時可以通過一個10k的電位器調整對比度第4腳:rs為暫存器選擇,高電平時選擇資料暫存器、低電平時選擇指令暫存器。

第5腳:rw為讀寫訊號線,高電平時進行讀操作,低電平時進行寫操作。當rs和rw共同為低電平時可以寫入指令或者顯示地址,當rs為低電平rw為高電平時可以讀忙訊號,當rs為高電平rw為低電平時可以寫入資料。

第6腳:e端為使能端,當e端由高電平跳變成低電平時,液晶模組執行命令。 第7~14腳:

d0~d7為8位雙向資料線。 第15~16腳:空腳。

1602液晶和微控制器的接法

4*4鍵盤,和4個特殊功能按鍵

k(切換鍵) no(復位鍵)

(時間設定鍵) c(清除鍵) +

1 2 3 —

4 5 6 *

7 8 9 %(除)

—/+ 0 。 =

前4個為特殊功能鍵,

後十六個採用鍵盤掃描接法,

掃描原理:

首先給p3口賦11111110(0xfe),然後再讀取p3口的值,如果為11101110(0xee)說明是第一排第一個被按下,如果是11011110(0xde)說明是第一排第二個被按下,如果是10111110(0xbe)說明是第一排第三個被按下,如果是0111110(0x7e)說明是第一排第四個被按下,

判斷二三四排的按鍵,都採用同樣的方法,只要分別給p3口賦不同的值即可,在讀取p3口的值,在判斷。用這樣的方法即可實現4*4鍵盤的掃描,只要有鍵按下,就可以知道是那個鍵按下,通過這種方法可大大節省微控制器的io口的資源。詳情可參考網上的鍵盤掃描原理

時鐘晶片(ds1302)

ds1302 是dallas 公司推出的涓流充電時鐘晶片內含有一個實時時鐘/日曆和31 位元組靜態ram ,通過簡單的序列介面與微控制器進行通訊實時時鐘/日曆電路提供秒分時日日期月年的資訊每月的天數和閏年的天數可自動調整時鐘操作可通過am/pm 指示決定採用24 或12 小時格式ds1302 與微控制器之間能簡單地採用同步序列的方式進行通訊僅需用到三個口線1 res 復位2 i/o 資料線3 sclk序列時鐘時鐘/ram 的讀/寫資料以一個位元組或多達31 個位元組的字元組方式

實時時鐘具有能計算2100 年之前的秒分時日日期星期月年的能力還有閏年調整的能力(詳情可參考ds1302的技術文件

管腳描述

x1 x2 32.768khz 晶振管腳

gnd 地

rst 復位腳

i/o 資料輸入/輸出引腳

sclk 序列時鐘

vcc1,vcc2 電源供電管腳

計算器工作大概流程

2樓:走在時間的前頭

計算器用什麼做顯示呢,液晶屏還是數碼管?需要可以交流一下哈。

3樓:

不是本專業的說了你也不懂啊

怎麼用51微控制器做簡易計算器? 10

4樓:匿名使用者

你好!微控制器做計算器的設計,本身就是難點;

你是用**還是要做實物呢?

最多計算位數需要幾位?

5樓:萬達集團懂事長

很簡單,第一,設計按鍵電路,最好4乘4的按鍵第二、74573驅動數碼管顯示電路!

剩下的就常規的了,電源電路,復位電路!

寫程式,除錯,燒錄,ok!

6樓:樹下聽雨

先製作出數字顯示電路,還有相應數字按鍵電路,需要幾位數就用幾個數碼管,然後根據計算邏輯編寫出相應c程式

微控制器做計算器的程式

7樓:刺友互

1、直接呼叫庫函式。

2、下面是函式的配置,從中可以看出,i=0時,埠25.16.4所對應的燈亮,i=1時,埠27.28.5所對應的燈亮,在for迴圈中,兩組燈交替閃爍。

3、通過自定義巨集進行操作,來實現。

4、自定義的巨集如下,將燈的埠及開關,通過自定義巨集的方式,可以在程式中進行直接操作。

5、直接控制埠所對應的暫存器。

6、直接操作暫存器,需要定義埠對應的暫存器。

8樓:匿名使用者

#include

#define uchar unsigned char;

uchar led1,led2,led3,led4;

uchar keyval,calflag,s_dat,d_dat;

uchar distab=;

unsigned int number,r_dat;

void delay(unsigned int a)

unsigned int i,j;

for(i=0;ifor(j=0;j<1000;j++);

void dealdat()

switch(calflag)

case 0:

r_dat=s_dat+d_dat;

break;

case 1:

r_dat=s_dat-d_dat;

break;

case 2:

r_dat=s_dat*d_dat;

break;

case 3:

r_dat=s_dat/d_dat;

break;

default:break;

led1=(r_dat/1000)%10;

led2=(r_dat/100)%10;

led3=(r_dat/10)%10;

led4=r_dat%10;

uchar kbscan(void)

unsigned char sccode,recode;

p3=0x0f;  //發0掃描,列線輸入

if ((p3 & 0x0f) != 0x0f)  //有鍵按下

delay(20);   //延時去抖動

if ((p3&0x0f)!= 0x0f)

sccode = 0xef;    //逐行掃描初值

while((sccode&0x01)!=0)

p3=sccode;

if((p3&0x0f)!=0x0f)

recode=(p3&0x0f)|0xf0;

return((~sccode)+(~recode));

else

sccode=(sccode<<1)|0x01;

return 0;  //無鍵按下,返回0

}void getkey(void)

unsigned char key;

key=kbscan();

if(key==0)

switch(key)

case 0x11:keyval=7;break;

case 0x12:keyval=4;break;

case 0x14:keyval=1;break;

case 0x18:keyval=10;break;

case 0x21:keyval=8;break;

case 0x22:keyval=5;break;

case 0x24:keyval=2;break;

case 0x28:keyval=0;break;

case 0x41:keyval=9;break;

case 0x42:keyval=6;break;

case 0x44:keyval=3;break;

case 0x48:keyval=11;break;

case 0x81:keyval=12;break;

case 0x82:keyval=13;break;

case 0x84:keyval=14;break;

case 0x88:keyval=15;break;

default:keyval=0xff;break;

}void t0isr() interrupt 1

th0=0xf4;

tl0=0x48;

switch(number)

case 0:p2=0x04;p0=distab[led1];break;

case 1:p2=0x08;p0=distab[led2];break;

case 2:p2=0x01;p0=distab[led3];break;

case 3:p2=0x02;p0=distab[led4];break;

default:break;

number++;

if(number>3)number=0;

main()

tmod = 0x01;

number = 0;

th0=0xf4;

tl0=0x48;

tr0=1;

et0=1;

ea=1;

led1=0;

led2=0;

led3=0;

led4=0;

while(1)

getkey();

switch(keyval)

case 0:

case 1:

case 2:

case 3:

case 4:

case 5:

case 6:

case 7:

case 8:

case 9:

led3=led4;

led4=keyval;

led1=0;

led2=0;

break;

case 10:break; //"on"

case 11: //"="

d_dat=led3*10+led4;

dealdat();

break;

case 12: //"/"

calflag=3;

s_dat=led3*10+led4;

led3=0;

led4=0;

break;

case 13: //"*"

calflag=2;

s_dat=led3*10+led4;

led3=0;

led4=0;

break;

case 14: //"-"

calflag=1;

s_dat=led3*10+led4;

led3=0;

led4=0;

break;

case 15: //"+"

calflag=0;

s_dat=led3*10+led4;

led3=0;

led4=0;

break;

default:break;

51微控制器計數器怎麼用,51微控制器計數器怎麼用 50

51微控制器是基礎入門的一個微控制器,還是應用最廣泛的。51微控制器的定時 計數器的概念 微控制器中,脈衝計數與時間之間的關係十分密切,每輸入一個脈衝,計數器的值就會自動累加1,只要相鄰兩個計數脈衝之間的時間間隔相等,則計數值就代表了時間的流逝,因此,微控制器中的定時器和計數器其實是同一個物理的電子...

51微控制器中ACC怎麼用,51微控制器中ACC怎麼用??

a和acc的實質是一樣的,對應位址都是0e0h,只是彙編在使用時,在格式上取了兩個名字。你看看它們的使用方法,有的地方用a,有的地方用acc,會發現有一定的規律。當其要進行位表示時,必須用acc,比如要寫成acc.7,而不能寫成a.7 但當其作為8位二進位制數時,acc和a都能用 但還是有區別 比如...

51微控制器中的定時器中斷是怎麼用的

娛樂小八卦啊 如下 實現led燈一秒亮滅閃爍 void main tmod 0x01 設定定時器0為工作方式1 m1 m0為01 th0 65536 45872 256 裝初值11.0582晶振定時50ms數為45872 tl0 65536 45872 256 ea 1 開總中斷 et0 1 開定時...