单片机汇编语言经典一百例.docx

上传人:b****8 文档编号:28219774 上传时间:2023-07-09 格式:DOCX 页数:49 大小:23.74KB
下载 相关 举报
单片机汇编语言经典一百例.docx_第1页
第1页 / 共49页
单片机汇编语言经典一百例.docx_第2页
第2页 / 共49页
单片机汇编语言经典一百例.docx_第3页
第3页 / 共49页
单片机汇编语言经典一百例.docx_第4页
第4页 / 共49页
单片机汇编语言经典一百例.docx_第5页
第5页 / 共49页
点击查看更多>>
下载资源
资源描述

单片机汇编语言经典一百例.docx

《单片机汇编语言经典一百例.docx》由会员分享,可在线阅读,更多相关《单片机汇编语言经典一百例.docx(49页珍藏版)》请在冰豆网上搜索。

单片机汇编语言经典一百例.docx

单片机汇编语言经典一百例

51单片机实用程序库

 

 

 流水灯

程序介绍:

利用P1口通过一定延时轮流产生低电平

输出,以达到发光二极管轮流亮的效果。

实际应用中例如:

广告灯箱彩灯、霓虹灯闪烁。

程序实例()

ORG0000H

AJMPMAIN

ORG0030H

MAIN:

9

MOVA,#00H

MOVP1,A;灭所有的灯

MOVA,#B

MAIN1:

MOVP1,A;开最左边的灯

ACALLDELAY;延时

RLA;将开的灯向右边移

AJMPMAIN;循环

DELAY:

MOV30H,#0FFH

D1:

MOV31H,#0FFH

D2:

DJNZ31H,D2

DJNZ30H,D1

RET

END

方波输出

程序介绍:

口输出高电平,延时后再输出低电

平,循环输出产生方波。

实际应用中例如:

波形发生器。

程序实例():

ORG0000H

MAIN:

;直接利用口产生高低电平地形成方波步移位

;显示个,十,百,千算机的内部计算都是二进

制,而二进制每除一个2,实际上是向右移一次。

所以为

了计算方便,我们选择取6个数,最后在算除法的时候,

只需要用单片机自带的右移位命令移2次就行了。

27

十六进制六位数加法(数码显示)

程序实例:

ORG0000H

MAIN:

ADNUMBEREQU30H;AD转换值

ADDNUMBEREQU31H;加数值1

ADLEQU32H;//

ADHEQU33H;ADL转换高低位值

DISLEQU34H;//

DISHEQU35H;显示高低位值

ADDTOTALEQU36H;第一次AD转换值

ADDJWEQU37H;加法进位数

ADDHOLDEQU38H

ADDFLAGEQU39H;加标志

ENDFLAGEQU40H

;赋初值////////////////////////////////////////////

MOVADDHOLD,#00H

MOVADDNUMBER,#00H

MOVADL,#00H

MOVADH,#00H

MOVDISL,#00H

MOVDISH,#00H

MOVADDJW,#00H

MOVADDFLAG,#00H

MOVENDFLAG,#00H

MOVADDTOTAL,#00H

;//////////////////////////////////////////////////

MAIN1:

28

;显示AD值//////////////////////////////////////////

ACALLDELAY

ACALLDELAY

ACALLAD

MAIN3:

ACALLCAIFEN

ACALLDISPLAY

;//////////////////////////////////////////////////

;加这次的AD值,并判是否加了六次,是的话就进入死循环

ACALLDELAY

ACALLADD1

ACALLDISPLAY

INCADDFLAG

MOVA,ADDFLAG

CJNEA,#06H,MAIN2

LOOP:

AJMPLOOP

;//////////////////////////////////////////////////

;没有加到六次,继续取值加,如果没有来新AD值,还是去

显示上次加的值,有新AD值来了,显示这次AD值,并加上上

次AD值,显示///////////////////////////////////////

MAIN2:

ACALLDELAY

ACALLAD

MOVA,ADNUMBER

CJNA,ADDTOTAL,MAIN3

AJMMAIN2

;//////////////////////////////////////////////////

;////////////////////////////////////////////AD转换

AD:

29

MOVDPTR,#7F00H;指向转换地址

MOVA,#03H;指向转换口

MOVX@DPTR,A;转换

MOVR1,#64H

D1:

DJNZR1,D1;等100微秒转换完

MOVXA,@DPTR;转换后的值给A

MOVADNUMBER,A;转换的值给30H

RET

;//////////////////////////////////////////////////

;拆分AD值程序//////////////////////////////////////

CAIFEN:

MOVA,ADNUMBER

ANLA,#0FH

MOVADL,A;取低位

MOVA,ADNUMBER

ANLA,#0F0H

SWAPA

MOVADH,A;取高位

MOVDISL,ADL

MOVDISH,ADH;给显示值

RET

;//////////////////////////////////////////////////

;显示//////////////////////////////////////////////

DISPLAY:

MOVA,DISL

MOVDPTR,#SETTAB

MOVCA,@A+DPTR

MOVSBUF,A

30

D3:

JNBTI,D3

CLRTI

MOVA,DISH

MOVDPTR,#SETTAB

MOVCA,@A+DPTR

MOVSBUF,A

D4:

JNBTI,D4

CLRTI

MOVA,ADDJW

MOVDPTR,#SETTAB

MOVCA,@A+DPTR

MOVSBUF,A

D5:

JNBTI,D5

CLRTI

MOVSBUF,#00H

D6:

JNBTI,D6

CLRTI

RET

;//////////////////////////////////////////////////

;加法程序//////////////////////////////////////////

ADD1:

CLRC

MOVADDTOTAL,ADNUMBER

MOVA,ADNUMBER

ADDCA,ADDHOLD

MOVADDHOLD,A

JNCADDJW1

INCADDJW

31

ADDJW1:

ANLA,#0FH

MOVDISL,A;加值取低位

MOVA,ADDHOLD

ANLA,#0F0H

SWAPA

MOVDISH,A;加值取高位

RET

;///////////////////////////////////////////////

DELAY:

;延时

MOVR3,#0AH

DD1:

MOVR1,#0FFH

D2:

MOVR2,#0FFH

DJNZR2,$

DJNZR1,D2

DJNZR3,DD1

RET

SETTAB:

DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,

0FEH,0F6H

DB0EEH,3EH,9CH,7AH,9EH,8EH

END

求六位和中的最大值和最小值(数码显示)

程序实例():

ORG0000H

MAIN:

ADNUMBEREQU30H;AD转换值

ADLEQU32H;//

32

ADHEQU33H;ADL转换高低位值

DISLEQU34H;//

DISHEQU35H;显示高低位值

ADDTOTALEQU36H;第一次AD转换值

ADDJWEQU37H;加法进位数

ADDHOLDEQU38H

ADDFLAGEQU39H;加标志

ENDFLAGEQU40H

ADH1EQU41H;AD中最大的值

ADL1EQU42H;AD中最小的值

ADHOLDHEQU43H

ADHOLDLEQU44H;求AD最大值与最小

值时AD的比较值,即以此两个值为比较中转

FOUREQU45H

SUBEQU46H;减去高低位后的值

JWHOLDEQU47H;保存进位值

;赋初值////////////////////////////////////////////

MOVADDHOLD,#00H

MOVADL,#00H

MOVADH,#00H

MOVDISL,#00H

MOVDISH,#00H

MOVADDJW,#00H

MOVADDFLAG,#00H

MOVENDFLAG,#00H

MOVADDTOTAL,#00H

MOVADH1,#00H

MOVADL1,#00H

33

MOVADHOLDH,#00H

MOVFOUR,#00H

MOVADHOLDL,#00H

MOVJWHOLD,#00H

MOVSUB,#00H

;//////////////////////////////////////////////////

MAIN1:

ACALLDELAY

ACALLDELAY

ACALLAD;取AD值

MAIN3:

ACALLCAIFEN

ACALLDISPLAY;显示

ACALLDELAY

ACALLDELAY

;算最大值和最小值//////////////////////////////////

ACALLADDH

ACALLADDL

;//////////////////////////////////////////////////

;加和值显示///////////////////////////////////////

ACALLADD1

ACALLDISPLAY

;//////////////////////////////////////////////////

;判是否加到了6次///////////////////////////////////

INCADDFLAG

MOVA,ADDFLAG

CJNEA,#06H,MAIN2

;/////////////////////////////////////////////////

ACALLDELAY

34

ACALLDELAY

ACALLDELAY

ACALLDELAY

ACALLDELAY

ACALLDELAY

ACALLCAIFEN1;拆最小值

ACALLCAIFEN2;拆最大值

ACALLDISPLAY;显示最大值最小值

LOOP:

AJMPLOOP

;判有没有来新AD值,没有显示以前,有显示现在的///////

MAIN2:

ACALLDELAY

ACALLAD

MOVA,ADNUMBER

CJNEA,ADDTOTAL,MAIN3

AJMPMAIN2

;//////////////////////////////////////////////////

;AD转换////////////////////////////////////////////

AD:

MOVDPTR,#7F00H;指向转换地址

MOVA,#03H;指向转换口

MOVX@DPTR,A;转换

MOVR1,#64H

D1:

DJNZR1,D1;等100微秒转换完

MOVXA,@DPTR;转换后的值给A

MOVADNUMBER,A;转换的值给30H

RET

;//////////////////////////////////////////////////

;拆分AD值程序//////////////////////////////////////

35

CAIFEN:

MOVA,ADNUMBER

ANLA,#0FH

MOVADL,A;取低位

MOVA,ADNUMBER

ANLA,#0F0H

SWAPA

MOVADH,A;取高位

MOVDISL,ADL

MOVDISH,ADH;给显示值

RET

;//////////////////////////////////////////////////

;显示//////////////////////////////////////////////

DISPLAY:

MOVA,DISL

MOVDPTR,#SETTAB

MOVCA,@A+DPTR

MOVSBUF,A

D3:

JNBTI,D3

CLRTI

MOVA,DISH

MOVDPTR,#SETTAB

MOVCA,@A+DPTR

MOVSBUF,A

D4:

JNBTI,D4

CLRTI

MOVA,ADDJW

MOVDPTR,#SETTAB

36

MOVCA,@A+DPTR

MOVSBUF,A

D5:

JNBTI,D5

CLRTI

MOVA,FOUR

MOVDPTR,#SETTAB

MOVCA,@A+DPTR

MOVSBUF,A

D6:

JNBTI,D6

CLRTI

RET

;////////////////////////////////////////////////

;加法程序////////////////////////////////////////

ADD1:

CLRC

MOVADDTOTAL,ADNUMBER

MOVA,ADNUMBER

ADDCA,ADDHOLD

MOVADDHOLD,A

JNCADDJW1

INCADDJW

ADDJW1:

ANLA,#0FH

MOVDISL,A;加值取低位

MOVA,ADDHOLD

ANLA,#0F0H

SWAPA

MOVDISH,A;加值取高位

RET

37

;//////////////////////////////////////////////////

;AD值中的最大值////////////////////////////////////

ADDH:

MOVA,ADH1

CJNEA,#00H,ADDH1

MOVADH1,ADNUMBER

AJMPRE

ADDH1:

MOVA,ADNUMBER

CLRC

SUBBA,ADH1

JCRE

MOVADH1,ADNUMBER

RE:

RET

;//////////////////////////////////////////////////

;AD值中的最小值////////////////////////////////////

ADDL:

MOVA,ADL1

CJNEA,#00H,ADDL1

MOVADL1,ADNUMBER

AJMPRE1

ADDL1:

MOVA,ADNUMBER

CLRC

SUBBA,ADL1

JNCRE1

MOVADL1,ADNUMBER

RE1:

RET

;//////////////////////////////////////////////////

;分解AD最小值的个,十位////////////////////////////

38

CAIFEN1:

MOVA,ADL1

ANLA,#0FH

MOVADL,A;取低位

MOVA,ADL1

ANLA,#0F0H

SWAPA

MOVADH,A;取高位

MOVDISL,ADL

MOVDISH,ADH;给显示值

RET

;/////////////////////////////////////////////

;分解AD最大值的个,十位///////////////////////

CAIFEN2:

MOVA,ADH1

ANLA,#0FH

MOVADL,A;取低位

MOVA,ADH1

ANLA,#0F0H

SWAPA

MOVADH,A;取高位

MOVJWHOLD,ADDJW

MOVADDJW,ADL

MOVFOUR,ADH;给显示值

RET

;//////////////////////////////////////////////////

DELAY:

;延时

MOVR3,#0AH

39

DD1:

MOVR1,#0FFH

D2:

MOVR2,#0FFH

DJNZR2,$

DJNZR1,D2

DJNZR3,DD1

RET

;//////////////////////////////////////////////////

SETTAB:

DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,

0FEH,0F6H

DB0EEH,3EH,9CH,7AH,9EH,8EH

END

求减去最大和最小值后的值(数码显示)

程序实例()

ORG0000H

MAIN:

ADNUMBEREQU30H;AD转换值

ADLEQU32H;//

ADHEQU33H;ADL转换高低位值

DISLEQU34H;//

DISHEQU35H;显示高低位值

ADDTOTALEQU36H;第一次AD转换值

ADDJWEQU37H;加法进位数

ADDHOLDEQU38H

ADDFLAGEQU39H;加标志

ENDFLAGEQU40H

ADH1EQU41H;AD中最大的值

40

ADL1EQU42H;AD中最小的值

ADHOLDHEQU43H

ADHOLDLEQU44H;求AD最大值与最小

值时AD的比较值,即以此两个值为比较中转

FOUREQU45H

SUBEQU46H;减去高低位后的值

JWHOLDEQU47H;保存进位值

;赋初值///////////////////////////////////////////

MOVADDHOLD,#00H

MOVADL,#00H

MOVADH,#00H

MOVDISL,#00H

MOVDISH,#00H

MOVADDJW,#00H

MOVADDFLAG,#00H

MOVENDFLAG,#00H

MOVADDTOTAL,#00H

MOVADH1,#00H

MOVADL1,#00H

MOVADHOLDH,#00H

MOVFOUR,#00H

MOVADHOLDL,#00H

MOVJWHOLD,#00H

MOVSUB,#00H

;//////////////////////////////////////////////////

MAIN1:

ACALLDELAY

ACALLDELAY

41

ACALLAD;取AD值

MAIN3:

ACALLCAIFEN

ACALLDISPLAY;显示

ACALLDELAY

ACALLDELAY

;算最大值和最小值//////////////////////////////////

ACALLADDH

ACALLADDL

;//////////////////////////////////////////////////

;加和值显示///////////////////////////////////////

ACALLADD1

ACALLDISPLAY

;/////////////////////////////////////////////////

;判是否加到了6次//////////////////////////////////

INCADDFLAG

MOVA,ADDFLAG

CJNEA,#06H,MAIN2

;//////////////////////////////////////////////////

ACALLDELAY

ACALLDELAY

ACALLDELAY

ACALLDELAY

ACALLDELAY

ACALLDELAY

ACALLCAIFEN1;拆最小值

ACALLCAIFEN2;拆最大值

ACALLDISPLAY;显示最大值最小值

ACALLDELAY

42

ACALLDELAY

ACALLJIAN1;呼叫减最大值最小

值程序

ACALLCAIFEN3;拆分

ACALLDISPLAY;显示减去最大值最

小值后的值

ACALLDELAY

ACALLDELAY

ACALLDELAY

LOOP:

AJMPLOOP

;判有没有来新AD值,没有显示以前,有显示现在的///

MAIN2:

ACALLDELAY

ACALLAD

MOVA,ADNUMBER

CJNEA,ADDTOTAL,MAIN3

AJMPMAIN2

;/////////////////////////////////////////////////

;AD转换///////////////////////////////////////////

AD:

MOVDPTR,#7F00H;指向转换地址

MOVA,#03H;指向转换口

MOVX@DPTR,A;转换

MOVR1,#64H

D1:

DJNZR1,D1;等100微秒转换完

MOVXA,@DPTR;转换后的值给A

MOVADNUMBER,A;转换的值给30H

RET

43

;//////////////////////////////////////////////////

;拆分AD值程序//////////////////////////////////////

CAIFEN:

MOVA,ADNUMBER

ANLA,#0FH

MOVADL,A;取低位

MOVA,ADNUMBER

ANLA,#0F0H

SWAPA

MOVADH,A;取高位

MOVDISL,ADL

MOVDISH,ADH;给显示值

RET

;//////////////////////////////////////////////////

;显示//////////////////////////////////////////////

DISPLAY:

MOVA,DISL

MOVDPTR,#SETTAB

MOVCA,@A+DPTR

MOVSBUF,A

D3:

JNBTI,D3

CLRTI

MOVA,DISH

MOVDPTR,#SETTAB

MOVCA,@A+DPTR

MOVSBUF,A

D4:

JNBTI,D4

CLRTI

44

MOVA,ADDJW

MOVDPTR,#SETTAB

MOVCA,@A+DPTR

MOVSBUF,A

D5:

JNBTI,D5

CLRTI

MOVA,FOUR

MOVDPTR,#SETTAB

MOVCA,@A+DPTR

MOVSBUF,A

D6:

JNBTI,D6

CLRTI

RET

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 成人教育 > 专升本

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1