单片机汇编语言一百例doc.docx
《单片机汇编语言一百例doc.docx》由会员分享,可在线阅读,更多相关《单片机汇编语言一百例doc.docx(84页珍藏版)》请在冰豆网上搜索。
![单片机汇编语言一百例doc.docx](https://file1.bdocx.com/fileroot1/2023-1/26/6d43cd9d-a89f-4412-8c05-6dde2f6fac41/6d43cd9d-a89f-4412-8c05-6dde2f6fac411.gif)
单片机汇编语言一百例doc
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转;换的值给RET
30H
;//////////////////////////////////////////////////
;拆分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,#