古詩詞大全網 - 成語用法 - 51單片機設計的簡易的計算器

51單片機設計的簡易的計算器

我以前做過4x4鍵盤控制電動機轉速,用數碼管顯示電機轉速的程序,程序如下:

AD EQU 30H

RTR EQU 31H

LTR EQU 32H

STR EQU 33H

BW EQU 34H

BWS EQU 35H

SHW EQU 36H

SHWS EQU 37H

GW EQU 38H

GWS EQU 39H

WSHR EQU 3AH;WSHR=BWS*100+SHWS*10+GWS

sz EQU 3BH;數字與代碼對應程序的數字變量

xsm EQU 3CH;數字與代碼對應程序的代碼變量

TODH EQU 3DH;計算的10進位數的高位*電機的要求轉速高位

TODL EQU 3EH;計算的10進位數的低位*電機的要求轉速低位

TODHT EQU 3FH;測試後電機的實際轉速高位

TODLT EQU 40H;測試後電機的實際轉速低位

PCK EQU 41H;pc口當前的狀態植

TOH EQU 42H;定時器高位數

T0L EQU 43H;定時器低位數

pink1 EQU 44H;電機轉動1/4圈定時器1的奇數次數

pink2 EQU 45H

VTIMES EQU 46H;速度顯示次數

T1H EQU 47H

T1L EQU 48H

TESTK DATA 49H ;高電平脈沖的個數

TTH0 EQU 1AH

TTL0 EQU 4BH

SUBNOW EQU 4CH

ORG 0000H

LJMP MAIN

ORG 03H

AJMP INTR0;中段0,用來計算電機轉速

ORG 0BH

MOV A,PCK

ANL A,#00000111B

MOV PCK,A

MOV A,#00000110B

CJNE A,PCK,INTT0LF

LJMP INTT0L;

ORG 1BH;pwm停轉子程序

AJMP INTT0H

ORG 0040H

;**************************定時器中斷子程序****************************

;****電機停止程序

INTT0H:

mov th0,TOH

mov tl0,T0L

SETB TR0;定時器0開始計數

CLR TR1;定時器1禁止計數

INC pink1

MOV DPTR,#7F02H; b地址

MOV A, #00000000B;電機停止運動

MOVX @DPTR,A

reti

;****電動機正轉子程序

INTT0L:

mov th1,T1H

mov tl1,T1L

SETB TR1;定時器1開始計數

CLR TR0;定時器0禁止計數

MOV DPTR,#7F02H; b地址

MOV A, #11001100B;C口輸出片選號燈

MOVX @DPTR,A

reti

;****電動機反轉

INTT0LF:

mov th1,T1H

mov tl1,T1L

SETB TR1;定時器1開始計數

CLR TR0;定時器0禁止計數

MOV DPTR,#7F02H; b地址

MOV A, #10101100B;C口輸出片選號燈

MOVX @DPTR,A

reti

;*************************計算電機轉速************************

;R2R3R4R5/ R6R7=R4R5余R2R3////(R2R3R4/R7)=(R2)R3R4 余數R7

INTR0:

MOV R2,#00H

MOV R3,#0EH

MOV R4,#0A6H

MOV R7,pink1

MOV pink1,#0

MOV A,#10

CLR CY

SUBB A,R7

JNB CY,OUTINT0

LCALL NDIV31

MOV TODHT, R3

MOV TODLT,R4

MOV R6,TODH

MOV R7,TODL

CLR CY

MOV A,R4

SUBB A,R7

MOV SUBNOW,A

JB CY,ADV

LCALL SUBV

JMP OUTINT0

ADV:

LCALL ADDV

OUTINT0:

LCALL JSW;計算各位的數值毫時大大約600個始周期 ;MOV TODLT,TOH

;LCALL JSW;計算各位的數值毫時大大約600個始周期

RETI;***********************************************************************************************

;***************************************************************************************************

;***************************************************************************************************

COMP_M:

MOV A,#0FDH

SUBB A,TOH

JNB CY,OUT_PMM

MOV TOH,#0FDH

MOV T1H,#85

OUT_PMM:

RET

;***************加速子程序**********************

ADDV:

CLR EA

CLR TR1

CLR TR0

MOV R1,SUBNOW

MOV R0,#10000000B

FRT:

MOV A,R0

RL A

MOV R0,A

MOV A,R1

ANL A,R0

JZ FRT

MOV A,TOH

ADD A,R0

JC VMAX

MOV TOH,A

MOV A,T1H

SUBB A,R0

MOV T1H,A

JMP TXT

VMAX:

MOV TOH,#0FDH

MOV T1H,#85

TXT:

SETB TR0

SETB TR1

SETB EA

RET

;************減加速子程序*************************

SUBV:

CLR EA

CLR TR1

CLR TR0

MOV R1,SUBNOW

MOV R0,#10000000B

FRT1:

MOV A,R0

RL A

MOV R0,A

MOV A,R1

ANL A,R0

JZ FRT1

MOV A,TOH

SUBB A,R0

JC VMAX1

MOV TOH,A

MOV A,T1H

ADD A,R0

MOV T1H,A

JMP TXT1

VMAX1:

MOV TOH,#85

MOV T1H,#0FDH

TXT1:

SETB TR0

SETB TR1

SETB EA

RET

;*****************************主程序**************************************

MAIN:

MOV BW,#7DH

MOV SHW,#7DH

MOV GW,#7DH

MOV BWS,#0

MOV SHWS,#0

MOV GWS,#0

MOV SP,#0A0H

MOV TOH,#0A1h;******************************************************************

MOV T0L,#0h;******************************************************************

MOV T1H,#0E1h;*******************************************************************

MOV T1L,#37h;*******************************************************************

MOV TMOD,#00H;定時器0在模式1下工作

MOV RTR,#00110110B

MOV LTR,#00101101B

MOV PCK,#00H

MOV TODHT,#2

MOV TODLT,#25H

MOV TODH,#0

MOV TODL,#0

;LCALL JSTIM;計算總值TODH;TODL

MOV pink2,#0

MOV pink1,#0

SETB EX0

SETB IT0

START:

MOV DPTR,#7F00H; 狀態字地址

MOV A, #00111111B;設A,B,C口均為輸出

MOVX @DPTR,A

LCALL DISPLAY;顯示

LCALL KEYSC;掃描鍵盤

;MOV TESTK,#44H;************************************************TEST*************************************************

ACALL DISPKEYV ;確定鍵盤

;LCALL JSTIM;計算總值TODH;TODL

;LCALL JSW;計算各位的數值毫時大大約600個始周期

LCALL JSEHW;計算各個代碼******************************

JMP START

;*************************鍵盤掃描程序**************************

KEYSC:

MOV TESTK,#0

mov p1,#0FH ;p10-3輸出1,作為輸入位

mov a ,p1

ANL A,#0FH

CJNE A,#0FH,DELAY

RET

DELAY: ACALL DELAY1 ; 延時去鍵抖

mov a ,p1

ANL A,#0FH

CJNE A,#0FH,HAVE

RET

HAVE:

MOV A,#0EFH ;行掃描碼

NEXT:

MOV B,A

MOV P1,A

MOV A,p1

ANL A,#0FH ;檢測列

CJNE A,#0FH,YES

MOV A,B

RL A

CJNE A,#0FEH,NEXT

YES: orl a,#0f0h ;高四位置1

CPL A

mov r2,#00h

MOV R2,A ;存列碼

MOV A,B ;取行碼,

CPL A

ORL A,R2 ;列碼+行碼=鍵植

MOV AD,#00H

MOV TESTK,A

RET

;****************************確定鍵盤程序******************************

DISPKEYV:MOV A,TESTK

KEY0:CJNE A,#11H,KEY1

acall WORD0

KEY1:CJNE A,#12H,KEY2

acall WORD1

KEY2:CJNE A,#14H,KEY3

acall WORD2

KEY3:CJNE A,#18H,KEY4

acall WORD3

KEY4:CJNE A,#21H,KEY5

acall WORD4

KEY5:CJNE A,#22H,KEY6

acall WORD5

KEY6:CJNE A,#24H,KEY7

acall WORD6

KEY7:CJNE A,#28H,KEY8

acall WORD7

KEY8:CJNE A,#41H,KEY9

acall WORD8

KEY9:CJNE A,#42H,KEY10

acall WORD9

KEY10:CJNE A,#44H,KEY11

acall WORD10

KEY11:CJNE A,#48H,KEY12

acall WORD11

KEY12:CJNE A,#81H,KEY13

acall WORD12

KEY13:CJNE A,#82H,KEY14

acall WORD13

KEY14:CJNE A,#84H,KEY15

acall WORD14

KEY15:

CJNE A,#88H,PASS

AJMP WORD15

PASS:RET

WORD0:

lCALL MOVE

MOV A,#0

MOV GWS,A

LCALL JSTIM;計算總值TODH;TODL

MOV R0,TESTK

TSTK0:

LCALL KEYSC

MOV A,R0

CJNE A,TESTK,OUT0

JMP TSTK0

OUT0:

MOV R0,#0

RET

WORD1:

lCALL MOVE

MOV A,#1

MOV GWS,A

LCALL JSTIM;計算總值TODH;TODL

MOV R0,TESTK

TSTK1:

LCALL KEYSC

MOV A,R0

CJNE A,TESTK,OUT1

JMP TSTK1

OUT1:

MOV R0,#0

RET

WORD2:

lCALL MOVE

MOV A,#2

MOV GWS,A

LCALL JSTIM;計算總值TODH;TODL

MOV R0,TESTK

TSTK2:

LCALL KEYSC

MOV A,R0

CJNE A,TESTK,OUT2

JMP TSTK2

OUT2:

MOV R0,#0

ACALL JSEHW;計算各個位的顯示代碼

RET

WORD3:

lCALL MOVE

MOV A,#3

MOV GWS,A

LCALL JSTIM;計算總值TODH;TODL

MOV R0,TESTK

TSTK3:

LCALL KEYSC

MOV A,R0

CJNE A,TESTK,OUT3

JMP TSTK3

OUT3:

MOV R0,#0

ACALL JSEHW;計算各個位的顯示代碼

RET

WORD4:

lCALL MOVE

MOV A,#4

MOV GWS,A

LCALL JSTIM;計算總值TODH;TODL

MOV A,TESTK

TSTK4:

LCALL KEYSC

CJNE A,TESTK,OUT4

JMP TSTK4

OUT4:

ACALL JSEHW;計算各個位的顯示代碼

RET

WORD5:

lCALL MOVE

MOV A,#5

MOV GWS,A

LCALL JSTIM;計算總值TODH;TODL

MOV A,TESTK

TSTK5:

LCALL KEYSC

CJNE A,TESTK,OUT5

JMP TSTK5

OUT5:

ACALL JSEHW;計算各個位的顯示代碼

RET

WORD6:

lCALL MOVE

MOV A,#6

MOV GWS,A

LCALL JSTIM;計算總值TODH;TODL

MOV A,TESTK

TSTK6:

LCALL KEYSC

CJNE A,TESTK,OUT6

JMP TSTK6

OUT6:

ACALL JSEHW;計算各個位的顯示代碼

RET

WORD7:

lCALL MOVE

MOV A,#7

MOV GWS,A

LCALL JSTIM;計算總值TODH;TODL

MOV A,TESTK

TSTK7:

LCALL KEYSC

CJNE A,TESTK,OUT7

JMP TSTK7

OUT7:

ACALL JSEHW;計算各個位的顯示代碼

RET

WORD8:

lCALL MOVE

MOV A,#8

MOV GWS,A

LCALL JSTIM;計算總值TODH;TODL

MOV A,TESTK

TSTK8:

LCALL KEYSC

CJNE A,TESTK,OUT8

JMP TSTK8

OUT8:

ACALL JSEHW;計算各個位的顯示代碼

RET

WORD9:

lCALL MOVE

MOV A,#9

MOV GWS,A

LCALL JSTIM;計算總值TODH;TODL

MOV A,TESTK

TSTK9:

LCALL KEYSC

CJNE A,TESTK,OUT9

JMP TSTK9

OUT9:

ACALL JSEHW;計算各個位的顯示代碼

RET

WORD10:

CLR EA

CLR ET0

CLR TR0

mov th0,TOH

mov tl0,T0L

MOV PCK,#00000110B

SETB EA;打開所有中斷

SETB ET0;定時器允許中斷

SETB TR0;定時器0開始計數

CLR TR1;定時器1禁止計數

SETB ET1;定時器1允許中斷

RET

WORD11:

CLR EA

CLR ET0

CLR TR0

mov th0,TOH

mov tl0,T0L

MOV PCK,#00000101B

SETB EA;打開所有中斷

SETB ET0;定時器允許中斷

SETB TR0;定時器0開始計數

CLR TR1;定時器1禁止計數

SETB ET1;定時器1允許中斷

RET

WORD12:

LCALL ADDV

MOV TODLT,TOH

LCALL JSW;計算各位的數值毫時大大約600個始周期

MOV A,TESTK

TSTK12:

LCALL KEYSC

CJNE A,TESTK,OUT12

JMP TSTK12

OUT12:

RET

WORD13:

LCALL SUBV

MOV TODLT,TOH

LCALL JSW;計算各位的數值毫時大大約600個始周期

MOV A,TESTK

TSTK11:

LCALL KEYSC

CJNE A,TESTK,OUT11

JMP TSTK11

OUT11:

RET

WORD14:

CLR ET0;使能定時器0中斷

CLR ET1;使能定時器1中斷

CLR EA;使能總中斷

CLR TR1;關閉T1計時

CLR TR0;關閉T0計時

MOV PCK,#00H

MOV BW,#7DH

MOV SHW,#7DH

MOV GW,#77H

RET

WORD15:JB EA,MID15

MOV BWS,#0

MOV SHWS,#0

MOV GWS,#0

JMP OUT15

MID15:

CLR EA

MOV A,TESTK

TSTK15:

LCALL KEYSC

CJNE A,TESTK,OUT15

JMP TSTK15

MOV TODLT,TOH

LCALL JSW;計算各位的數值毫時大大約600個始周期

OUT15:

SETB EA

RET

;***********************計算各個代碼******************************

JSEHW:

MOV SZ,BWS

ACALL js

MOV BW,xsm

MOV SZ,SHWS

ACALL js

MOV SHW,xsm

MOV SZ,GWS

ACALL js

MOV GW,xsm

RET

js:

mov a,sz

js0:cjne a,#0,js1

mov xsm,#7dh

js1:cjne a,#1,js2

mov xsm,#14h

js2:cjne a,#2,js3

mov xsm,#6eh

js3:cjne a,#3,js4

mov xsm,#3eh

js4:cjne a,#4,js5

mov xsm,#17h

js5:cjne a,#5,js6

mov xsm,#3bh

js6:cjne a,#6,js7

mov xsm,#7bh

js7:cjne a,#7,js8

mov xsm,#00011100B

js8:cjne a,#8,js9

mov xsm,#7fh

js9:cjne a,#9,js10

mov xsm,#3fh

js10:ret

;***************************計算各位的數值毫時大大約600個始周期**************************************

JSW:;(R2R3R4/R7)=(R2)R3R4 余數R7

MOV R2,#0

MOV R3,TODHT

MOV R4, TODLT

MOV R7,#100

LCALL NDIV31

MOV BWS,R4

MOV A,R7;

MOV R4,A

MOV R3,#0

MOV R2,#0

MOV R7,#10

LCALL NDIV31

MOV SHWS,R4

MOV GWS,R7

RET

;***************************計算十進制結果****************************

JSTIM:

MOV TODL,#0

MOV TODH,#0

MOV A,GWS

MOV B,#1

ACALL JSHL

MOV A,SHWS

MOV B,#10

ACALL JSHL

MOV A,BWS

MOV B,#100

ACALL JSHL

RET

JSHW:

JB OV,JSGW

CLR OV

RET

JSGW:

INC TODH;TEST DATE

RET

JSHL:

MUL AB

MOV R1,B

ADD A,TODL

MOV TODL,A

MOV A,B

ADDC A,TODH

MOV TODH,A

ACALL JSHW

RET

;*****************************單字節的除法*********************

;****************************(R2R3R4/R7)=(R2)R3R4 余數R7

NDIV31 :MOV A,R2

MOV B,R7

DIV AB

MOV R2,B

MOV B,#10H

NDV311 :CLR C

MOV A,R4

RLC A

MOV R4,A

MOV A,R3

RLC A

MOV R3,A

MOV A,R2

RLC A

MOV R2,A

MOV F0,C

CLR C

SUBB A,R7

JB F0,NDV312

JC NDV313

NDV312 :MOV R2,A

INC R4

NDV313 :DJNZ B,NDV311

CLR OV

JZ NDV314

SETB OV

NDV314 :XCH A,R2

MOV R7,A

RET

;*******************雙字節減法***(R3R4-R6R7)=(R3R4)*******

NSUB :MOV A,R4

CLR C

SUBB A,R7

MOV R4,A

MOV A,R3

SUBB A,R6

MOV R3,A

RET

DELAY1:

MOV R5,#10

D1: MOV R6,#250

DJNZ R6, $

DJNZ R5,D1

RET

DELAY_BS:

MOV R5,#5

D2: MOV R6,#99

D3: MOV R7,#99

DJNZ R7, $

DJNZ R6,D3

DJNZ R5,D2

RET

;*****************************顯示器顯示子程序***********************************

DISPLAY:

MOV DPTR,#7F01H;

MOV A, BW;

MOVX @DPTR,A

MOV DPTR,#7F03H; c地址

MOV A, #00011000B;C口輸出片選號燈

MOV R0,PCK;pck=********

ORL A,R0;a=***11***

MOV R0,#00011111B;a=00011***

ANL A,R0

MOVX @DPTR,A

ACALL D_40ms

MOV DPTR,#7F01H;

MOV A, SHW;

MOVX @DPTR,A

MOV DPTR,#7F03H; c地址

MOV A,#00101000B

ORL A,R0

MOV R0,#00101111B

ANL A,R0

MOVX @DPTR,A

ACALL D_40ms

MOV DPTR,#7F01H;

MOV A, GW;

MOVX @DPTR,A

MOV DPTR,#7F03H; c地址

MOV A, #00110000B;C口輸出片選號燈

ORL A,R0

MOV R0,#00110111B

ANL A,R0

MOVX @DPTR,A

ACALL D_40ms

mov a,#0ffh

MOVX @DPTR,A

RET

D_40ms:

MOV R7,#10

DELAYBB:

MOV R6,#10

NOP

DELAYNN:

DJNZ R6,DELAYNN; 2X198+2=398

DJNZ R7,DELAYBB; (398+2)X200+1=80ms

RET

;****************************各個位移位自程序***************************

MOVE:

MOV A,SHWS

MOV BWS,A

MOV A,GWS

MOV SHWS,A

RET

END