集美大学信息单片机实验.docx
- 文档编号:25500845
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:29
- 大小:20.01KB
集美大学信息单片机实验.docx
《集美大学信息单片机实验.docx》由会员分享,可在线阅读,更多相关《集美大学信息单片机实验.docx(29页珍藏版)》请在冰豆网上搜索。
集美大学信息单片机实验
1.实验2-1
EXTRNCODE(Display8,GetBCDKey)
BUFFER2DATA70H
;8字节显示缓冲区
BUFFERDATA30H
BLOCKdata50H
RESULTDATA40H
F1BIT0D1H;PSW.1
ORG0000H
LJMPSTART
ORG0100H
START:
MOVSP,#60H
CLRF1
;先清除显示,再接收键输入
START1:
MOVR0,#BUFFER
MOVA,#4
;按键次数
LCALLGetBCDKey
;得到双字节十进制数(乘数)
MOVR0,#BUFFER
ACALLBCD2B
;转换成二进制数
MOVBLOCK,R3
MOVBLOCK+1,R4
SETBF1
;接收到第一个键,才清除显示
MOVR0,#BUFFER
MOVA,#4
;按键次数
LCALLGetBCDKey
;得到双字节十进制数(减数)
MOVR0,#BUFFER
ACALLBCD2B
MOVBLOCK+2,R3
MOVBLOCK+3,R4
MOVR4,BLOCK
;四个BCD入口参数
MOVR5,BLOCK+1
MOVR6,BLOCK+2
MOVR7,BLOCK+3
MOVR0,#RESULT
lCALLMLTY
MOVR3,RESULT
MOVR2,RESULT+1
MOVR1,RESULT+2
MOVR0,RESULT+3
ACALLB4toD4
;字节二进制数转十进制数;R0R1R2R3为二进制数,R4R5R6R7为压缩BCD码
MOVA,R7
ANLA,#0FH
MOVBUFFER2,A
MOVA,R7
ANLA,#0F0H
SWAPA
MOVBUFFER2+1,A
MOVA,R6
ANLA,#0FH
MOVBUFFER2+2,A
MOVA,R6
ANLA,#0F0H
SWAPA
MOVBUFFER2+3,A
MOVA,R5
ANLA,#0FH
MOVBUFFER2+4,A
MOVA,R5
ANLA,#0F0H
SWAPA
MOVBUFFER2+5,A
MOVA,R4
ANLA,#0FH
MOVBUFFER2+6,A
MOVA,R4
ANLA,#0F0H
SWAPA
MOVBUFFER2+7,A
MOVR0,#BUFFER2
LCALLDisplay8
sjmp$
BCD2B:
MOVR1,#BUFFER
MOVR2,#2
S:
MOVA,@R1
PUSHACC
ANLA,#0FH
MOVR0,A
POPACC
JNBACC.4,NEXT1
;分别判断4,5,6,7位是否为1,分别加上10,20,40,80
XCHA,R0
ADDA,#10
XCHA,R0
NEXT1:
JNBACC.5,NEXT2
XCHA,R0
ADDA,#20
XCHA,R0
NEXT2:
JNBACC.6,NEXT3
XCHA,R0
ADDA,#40
XCHA,R0
NEXT3:
JNBACC.7,NEXT4
XCHA,R0
ADDA,#80
XCHA,R0
NEXT4:
MOVA,R0
PUSHACC
INCR1
DJNZR2,S
POPACC
MOVR0,A
POPACC
MOVB,#100
;高2位(千位、百位)乘以100
MULAB
ADDA,R0
MOVR3,A
;转换成的二进制数放在R4R3中
MOVA,B
ADDCA,#0
MOVR4,A
RET
;字节二进制数转十进制数
;R0R1R2R3为二进制数,R4R5R6R7为压缩BCD码
;;;;;;;;该子程序也可以模仿书上(胡汉才)例4.22,采用除以10、其余数为个位数字,其商继续除以10得十位数字,依次类推
B4toD4:
CLRA
MOVR4,A
MOVR5,A
MOVR6,A
MOVR7,A
MOVB,#32
LOOP:
CLRC
MOVA,R3
RLCA
MOVR3,A
MOVA,R2
RLCA
MOVR2,A
MOVA,R1
RLCA
MOVR1,A
MOVA,R0
RLCA
MOVR0,A
MOVA,R7
;算法举例:
例如数据为00100100(36),则过程为
ADDCA,R7
;AR7
DAA
;00
MOVR7,A
;00
MOVA,R6
;11
ADDCA,R6
;22
DAA
;44
MOVR6,A
;99
MOVA,R5
;1818
ADDCA,R5
;3636
DAA
MOVR5,A
MOVA,R4
ADDCA,R4
DAA
MOVR4,A
DJNZB,LOOP
RET
MLTY:
MOVA,R6
MOVB,R4
MULAB
MOV@R0,A
MOVR3,B
MOVA,R7
MOVB,R4
MULAB
ADDA,R3
MOVR3,A
MOVA,B
ADDCA,#00H
MOVR2,A
MOVA,R6
MOVB,R5
MULAB
ADDA,R3
INCR0
MOV@R0,A
MOVA,R2
ADDCA,B
MOVR2,A
MOVR1,#00H
JNCNXT1
INCR1
NXT1:
MOVA,R7
MOVB,R5
MULAB
ADDA,R2
INCR0
MOV@R0,A
MOVA,B
ADDCA,R1
INCR0
MOV@R0,A
RET
end
2.实验2-2
ORG0000H
LJMPMAIN
ORG1000H
MAIN:
MOVR7,#15
CLRF0
LOOP1:
PUSH07H
MOVR0,#30H
MOVR1,#31H
SJMPLOOP2
LOOP4:
DECR7
SJMPLOOP1
LOOP2:
MOVA,@R0
SUBBA,@R1
JCLOOP3
SETBF0
MOVA,@R0
XCHA,@R1
XCHA,@R0
LOOP3:
INCR0
INCR1
DJNZR7,LOOP2
POP07H
JBF0,LOOP4
END
3.实验3-1电子钟
EXTRNCODE(GetbcdkEY,Display8)
BUFFER1DATA40H
BUFFER2DATA60H
ORG0000H
LJMPMAIN
ORG000BH
LJMPITOP
ORG1000H
MAIN:
CLRPSW.1
MOVR0,#BUFFER1
MOVA,#06H;
LCALLGetBCDKey
MOV20H,#20
MOVTMOD,#01H
MOVTL0,#0b0H
MOVTH0,#3cH
SETBTR0
SETBET0
SETBEA
SJMP$
ITOP:
PUSHPSW
PUSHACC
MOVTL0,#0b0H
MOVTH0,#3cH
DJNZ20H,LOOP
MOV20H,#20;重置中断次数
MOVA,#01H;秒增加1
ADDA,42H
DAA;秒单元十进制调整
MOV42H,A
CJNEA,#60H,LOOP
;是否到60秒,未到返回
MOV42H,#00H
;记满30秒,秒单元请零
MOVA,#01H;分单元增1
ADDA,41H
DAA
;分单元十进制调整
MOV41H,A
CJNEA,#60H,LOOP;
MOV41H,#00H
MOVA,#01H
ADDA,40H
DAA
MOV40H,A
CJNEA,#24H,LOOP
MOV40H,#00H
LOOP:
MOVR0,#40H
MOVR6,#03H
MOVR1,#50H
DECOMP:
MOVA,@R0
SWAPA
ANLA,#0FH
MOV@R1,A
INCR1
MOVA,@R0
ANLA,#0FH
MOV@R1,A
INCR0
INCR1
DJNZR6,DECOMP
MOVR0,#BUFFER2
MOVBUFFER2,55H
MOVBUFFER2+1,54H
MOVBUFFER2+2,53H
MOVBUFFER2+3,52H
MOVBUFFER2+4,51H
MOVBUFFER2+5,50H
MOVBUFFER2+6,#10H
MOVBUFFER2+7,#10H
LCALLDisplay8
POPACC
POPPSW
RETI
END
4.秒表
EXTRNCODE(GetbcdkEY,Display8)
BUFFER1DATA40H
BUFFER2DATA60H
ORG0000H
LJMPMAIN
ORG000BH;定时器T0中断
LJMPITOP
ORG1000H
MAIN:
CLRPSW.1
;先清显示,再接收键盘输入
MOVR0,#BUFFER1
MOVA,#06H
;按键次数6次
LCALLGetBCDKey
;调键盘程序
MOV20H,#1;循环次数
MOVTMOD,#01H
;计时器T0选择方式一16位计数器
MOVTL0,#18H
MOVTH0,#0FCH
SETBTR0;开计时器T0
SETBET0
SETBEA
DAN:
JBP1.0,$
;比较P1.0口(暂停口),若为0,则往下执行,若为1,则在本行等待
CLRTR0
;关计时器,暂停秒表计数
JNBP1.0,$
;比较P1.0口(暂停口),若为1则往下执行,若为0,则在本行等待
SETBTR0
;开计时器,继续秒表计数
JBP1.1,DAN
;比较P1.1口(清零口),若为1,则跳DAN(继续等待),若为0,则往下执行(全部清零)
MOV40H,#00;微秒单元清零
MOV41H,#00;毫秒单元清零
MOV42H,#00;秒单元清零
SJMPDAN
ITOP:
PUSHPSW
PUSHACC
MOVTL0,#18H
;计时器T0重新赋初值
MOVTH0,#0FCH
DJNZ20H,LOOP
;减1,比较是否为0,不为0则跳LOOP
MOV20H,#1
;重新赋循环次数
MOVA,#01H
;微秒单元+1
ADDA,40H
DAA;十进制调整
MOV40H,A
CJNEA,#99H,LOOP
;微秒单元中的数字和99H比较,若小于等于99H,则跳转到LOOP
MOV40H,#00H;微秒单元零
MOVA,#01H;毫秒单元+1
ADDA,41H
DAA
MOV41H,A
CJNEA,#10H,LOOP
MOV41H,#00H;毫秒单元清零
MOVA,#01H;秒单元+1
ADDA,42H
DAA
MOV42H,A
CJNEA,#60H,LOOP
;比较是否过了60秒?
过了则清零
MOV42H,#00H;秒单位请零
LOOP:
MOVR0,#40H
;寄存器赋初值,为下面做准备
MOVR6,#03H;次数3次
MOVR1,#50H
;保存到50H单位中
DECOMP:
MOVA,@R0
SWAPA;高低字节互换
ANLA,#0FH;取高字节
MOV@R1,A
;高字节存到R1
INCR1;R1地址+1
MOVA,@R0
ANLA,#0FH
MOV@R1,A;低字节存到R1
INCR0
INCR1
DJNZR6,DECOMP
;上面从LOOP开始整个的意思就是把40H中的微秒,毫秒,秒的数据放到50H中,然后下面开始在LED上显示
MOVR0,#BUFFER2
MOVBUFFER2,51H
MOVBUFFER2+1,50H
MOVBUFFER2+2,53H
MOVBUFFER2+3,52H
MOVBUFFER2+4,55H
MOVBUFFER2+5,54H
MOVBUFFER2+6,#10H
MOVBUFFER2+7,#10H
LCALLDisplay8
POPACC
POPPSW
RETI
END
6、航标灯
ORG0000H
LJMPMAIN
ORG0003H
LJMPIIE0
ORG000BH;定时器T0中断
LJMPITOP
ORG1000H
MAIN:
SETBEX0;
SETBEA
L:
JBP3.2,L
CLRTR0
SETBp1.0
LJMPL
IIE0:
pushpsw
pushACC
MOV20H,#40
;循环次数
MOVTMOD,#01H;
计时器T0选择方式一16位计数器
MOVTL0,#0B0H;50ms
MOVTH0,#3CH
SETBET0
SETBTR0
POPACC
POPPSW
RETI
ITOP:
PUSHPSW
PUSHACC
MOVTL0,#0B0H
MOVTH0,#3CH
DJNZ20H,LOOP;减1,比较是否为0,不为0则跳LOOP
MOV20H,#40;重新赋循环次数
CPLP1.0
LOOP:
POPACC
POPPSW
RETI
END
7、串行口接收
ORG0000H
LJMPMAIN
ORG0023H
LJMPSINT
ORG0100H
MAIN:
MOVSP,#60H
MOVTMOD,#20H;T1方式2
MOVTH1,#0E8H
MOVTL1,#0E8H
MOVSCON,#0D0H;串行口3
MOVPCON,#80H
SETBES
CLRET1
SETBEA
SETBTR1
MOVR0,#41H;存入41H开始单元
MOVR7,#0DH;接收次数13次
SJMP$
SINT:
CLRRI
MOVA,SBUF
MOVC,P
CPLC
JNCL1
JNBRB8,ERR
AJMPL2
L1:
JBRB8,ERR
L2:
MOV@R0,A
INCR0
DJNZR7,L3;比较是否接收13次
CLRES
CLRET1
CLRTR1
AJMPL3
ERR:
CLRP1.0;点亮LED
L3:
RETI
END
8、串行口发送
ORG0000H
LJMPMAIN
ORG0023H
LJMPSINT
ORG0100H
MAIN:
MOVSP,#60H
MOVTMOD,#20H;T1方式2
MOVTH1,#0E8H
MOVTL1,#0E8H
MOVSCON,#0D0H;串行口3
MOVPCON,#80H
SETBES
CLRET1
SETBEA
SETBTR1
MOVDPTR,#TAB;要发送的数据存入DPTR
MOVR7,#0DH;发送次数13次
SETBTI
SJMP$
SINT:
CLRTI
CLRA
MOVCA,@A+DPTR
MOVC,P
MOVTB8,C
MOVSBUF,A
INCDPTR
DJNZR7,L1
JNBTI,$
CLRES
CLRET1
CLRTR1
L1:
RETI
TAB:
DB'J','M','U'
DB'2','0','0','9','8','2','0','0','2','0'
END
9、并转串
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
clrp1.3;SER
INIT:
CLRP1.2;SH
NOP
SETBP1.2;;SH上升沿
CLRP1.3
;;P1.3(CLK口)清零
MOVR5,#8;;循环次数8次
PRO:
JBP3.0,NEXT
;;查询P3.0口....
CLRC
SJMPNEXT1
NEXT:
SETBC
NEXT1:
RLCA
SETBP1.3;CLK一次
NOP
CLRP1.3
DJNZR5,PRO
CPLA;;取反A
MOVP2,A;;P1整个排线
LJMPINIT
DELAY:
MOVR7,#200
DELAY1:
MOVR6,#125
DELAY2:
DJNZR6,DELAY2
DJNZR7,DELAY1
RET
END
10、串转并
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
CLRP1.3;CLK清零
SETBC
MOVA,#0FeH
INIT:
MOVR5,#8;循环次数8次
PRO:
RRCA
;;A中内容带进位右移一位
JCNEXT;;下面就是比较进位端
CLRP1.2
SJMPNEXT1
NEXT:
setbP1.2;;然后开关P1.2口
NEXT1:
SETBP1.3
NOP;;CLK一次
CLRP1.3
DJNZR5,PRO
CALLDELAY;;延时程序
CALLDELAY
LJMPINIT
DELAY:
MOVR7,#255;200
DELAY1:
MOVR6,#255;125
DELAY2:
DJNZR6,DELAY2
DJNZR7,DELAY1
RET
END
11、iic总线
SDABITP1.2
SCLBITP1.3
A24C02_WRITEEQU0A8H
A24C02_READEQU0A9H
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVSP,#60H
MOVDPTR,#TAB
;;要发送的内容存入DPTR
MOVR0,#30H
MOVB,#0FH
LOOP:
CLRA
MOVCA,@A+DPTR
MOV@R0,A
INCDPTR
INCR0
DJNZB,LOOP
;;上面到这是把TAB存入30H以后单元
MOVR1,#30H
;;这部分开始是发送的
MOVR2,#40H
MOVR0,#0FH;;次数15次
WRITE_BYTE:
LCALLSTART;;发送起始信号
MOVA,#A24C02_WRITE;器件写地址,表示写操作
LCALLWRITE_8BITS;;写入8位
LCALLACKNOWLEDGE;;等待从机应答
MOVA,R2;写入地址
LCALLWRITE_8BITS
LCALLACKNOWLEDGE
MOVA,@R1;写入数据
LCALLWRITE_8BITS
LCALLACKNOWLEDGE
LCALLSTOP
;;停止信号
LCALLACKPOLLING
INCR2
INCR1
DJNZR0,WRITE_BYTE
;;是否发送15次?
MOVR1,#50H
;;这部分开始是接收的
MOVR2,#40H
MOVR0,#0FH
READ_BYTE:
LCALLSTART
MOVA,#A24C02_WRITE
LCALLWRITE_8BITS
LCALLACKNOWLEDGE
MOVA,R2
LCALLWRITE_8BITS
LCALLACKNOWLEDGE
currentread:
LCALLSTART
MOVA,#A24C02_READ
LCALLWRITE_8BITS
LCALLACKNOWLEDGE
LCALLREAD_8BITS
MOV@R1,A
INCR1
DJNZR0,currentread
LCALLSTOP
SJMP$
WRITE_8BITS:
MOVR7,#8
WRITE_8BITS_1:
RLCA
CLRSCL
LCALLDELAY_TIME
MOVSDA,C
SETBSCL
LCALLDELAY_TIME
DJNZR7,WRITE_8BITS_1
CLRSCL
RET
READ_8BITS:
MOVR7,#8
READ_8BITS_1:
CLRSCL
LCALLDELAY_TIME
SETBSCL;SCL为
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 大学 信息 单片机 实验