单片机实验
由于此随笔为毕业4年后所写,仿真电路图片以及仿真软件都无法还原大学时期的情况。因此此随笔仅仅写一下代码。
一、 串行通信
ORG 0000H
LJMP START
ORG 0100H
START:MOV SCON,#50H
MOV TMOD,#20H
MOV TL1,#0F3H
MOV TH1,#0F3H
SETB TR1
MOV R0,#30H
MOV R7,#8
RWAIT:JBC RI,RNEXT
SJMP RWAIT
RNEXT:MOV A,SBUF
MOV @R0,A
INC R0
DJNZ R7,RWAIT
CLR REN
MOV A,#55H
MOV SBUF,A
TWAIT1:JBC TI,TNEXT
SJMP TWAIT1
TNEXT:MOV A,#0AAH
MOV SBUF,A
TWAIT2:JBC TI,TEND
SJMP TWAIT2
TEND:
END
二、 数模模数转换
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INT
MAIN:
MOV IE,#81H
MOV A,#40H
MOV DPTR,#8000H
LP:
MOVX @DPTR,A
MOV DPTR,#9000H
MOV A,#01H
MOVX @DPTR,A
SJMP $
INT:
MOVX A,@DPTR
MOV P1,A
RETI
END
三、 显示数字代码
ORG 0000H
LJMP MAIN
ORG 0040H
MAIN:
MOV 30H,#87H
MOV 31H,#19H
MOV 32H,#45H ; 三个单元中存入数据
MOV R0,#30H ; R0指向30H单元,用做指针
MOV R1,#33H ; R1指向31H单元,用作指针
MOV R2,#3 ; 控制BCD码转换3次,共6个数
MOV R3,#01H ; 作为显示数码管亮的有效信号
MOV DPTR ,#TAB ; 数据指针指向表头
L1: LCALL TRANS ; 调用转化程序
MOV R1,#33H ; R1再次指向33H单元
L2: LCALL SHOW ; 调用显示子程序
TRANS: ; 将压缩的BCD码转换为显示码
MOV A,@R0 ; R0指向单元的内容送给A
ANL A,#0FH ; 取低半字节数据
MOVC A,@A+DPTR ; 查表
MOV @R1,A ; 找到的数送给R1指向的单元
INC R1 ; R1指针下移
MOV A,@R0 ; R0指向单元的内容送给A
ANL A,#0F0H ; 取高半字节数据
SWAP A ; A的高低字节数据交换
MOVC A,@A+DPTR ; 查表
MOV @R1,A ; 找到的数送给R1指向的单元
INC R1 ; R1指针下移
INC R0 ; R0指针下移
DJNZ R2,TRANS ; R2减1判断6个数是否都已转化
RET ; 完成6个数转化,并存放在33H-38H单元内
SHOW: ; 显示子程序
MOV A,R3 ; 位码有效位送到A中
MOV DPTR,#8002H; 传送位地址
MOVX @DPTR,A ; 某一位的显示数码管能亮
MOV A,@R1 ; 将显示段码送到A中
MOV DPTR,#8004H; 传送段地址
MOVX @DPTR,A ; 显示数字
LCALL DELAY ; 延时1ms
INC R1 ; 数据指针下移
JB ACC.5,LOOP ; 是否到了最高位,是,就结束
MOV A,R3 ; 不是,就将位码有效位送到A中
RL A ; 将1左移
MOV R3,A ; 再送回R3中
AJMP SHOW ; 返回显示程序
LOOP: RET ; 显示程序结束
DELAY: ; 延时1ms子程序
MOV R7,#02
DL: MOV R6,#0F8H
DJNZ R6,$
NOP
DJNZ R7,DL
RET
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
SJMP $
END
四、 键盘扫描代码
ORG 0000H
LJMP MAIN
ORG 0500H
LJMP PRESS
ORG 0550H
LJMP DELAY
ORG 0600H
LJMP TABLE
MAIN: LCALL PRESS ; 检测有无按键
JNZ LK1 ; 有按键,跳转
N1: LCALL DELAY ; 无按键则延时
LJMP MAIN ; 返回
LK1: LCALL DELAY ; 有按键,延时,去抖动
LCALL PRESS ; 再次确认
JNZ LK2 ; 确实有按键,跳转
LCALL DELAY ; 没有按键,抖动造成,延时去抖
LJMP MAIN ; 返回
LK2: MOV R5,#0FEH ; 第0列为低电平
MOV R4,#00H ; 作为列号计数器
LK4: MOV DPTR,#0F002H;列地址
MOV A,R5 ;
MOVX @DPTR,A ; 第0列输出为低电平
MOV DPTR,#0F001H;行地址
MOVX A,@DPTR ; 将行线电平读进单片机
H0: ; 第0行检测
JB Acc.0,H1 ; 若高电平,此行无键按下跳下一行
MOV A,#00H ; 有键按下,记录键盘第0行行码
LJMP LKP ; 跳转计算键号
H1: ; 第1行检测
JB Acc.1,H2 ; 若高电平,此行无键按下跳下一行
MOV A,#06H ; 有键按下,记录键盘第1行行码
LJMP LKP ; 跳转计算键号
H2: ; 第2行检测
JB Acc.2,H3 ; 若高电平,此行无键按下跳下一行
MOV A,#0CH ; 有键按下,记录键盘第2行行码
LJMP LKP ; 跳转计算键号
H3: ; 第3行检测
JB Acc.3,XYLIE ; 若高电平,此行无键按下转下一列
MOV A,#12H ; 有键按下,记录键盘第3行行码
LKP: ; 计算键号子程序
ADD A,R4 ; 行码+列码=键号
MOV R3,A ; 保存键号
MOV R2,#01H ;
MOV A,R2 ;
MOV DPTR,#0F002H;位地址
MOVX @DPTR,A ; 只让数字显示在最后一个数码管中
MOV DPTR,#TABLE; 查表
MOV A,R3 ; 键号送到A中
MOVC A,@A+DPTR ; 查表,找到对应的显示码
MOV DPTR,#0F004H;显示数码管段地址
MOVX @DPTR,A ; 将显示码送到数码管中显示
LCALL DELAY ; 延时,以便人眼看到
SFANJ: ; 按键释放检测
LCALL DELAY ; 延时
LCALL PRESS ; 调用按键检测子程序
JNZ SFANJ ; 按键是否释放,未释放则等待
LJMP MAIN ; 按键释放,再次返回主程序等待按键产生
XYLIE: ;下一列检测
INC R4 ; 前一列无按键产生,检测下一列,保存列号到R4中
MOV A,R5 ;
JNB Acc.5,NEW ; 若到达最后一列,则从头开始
RL A ; 未到达最后一列,将低电平后移
MOV R5,A ; 保存低电平到下一列
LJMP LK4 ; 再次从第0行开始检测
NEW: LJMP MAIN ; 重新从头开始检测
PRESS: ;检测按键子程序
MOV DPTR,#0F002H;列地址
MOV A,#00H ; 某一列为低电平
MOVX @DPTR,A ; 列线为低电平
MOV DPTR,#0F001H;行地址
MOVX A,@DPTR ; 读取行线电平
CPL A ; 行中的低电平被反转成为唯一的高电平
ANL A,#0FH ; 若有按键,则A中有一位是1,高4位被屏蔽
RET ; 矩阵键盘一共4行,至多6列
DELAY: ;延时10ms子程序
MOV R7,#250
DL: MOV R6,#250
DJNZ R6,$
DJNZ R7,DL
RET
TABLE:
DB 76H,38H,5EH,79H,71H,3FH
DB 76H,38H,39H,4FH,5BH,06H
DB 76H,38H,7CH,7DH,6DH,66H
DB 76H,38H,77H,6FH,7FH,07H
END
五、 定时器
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INT
ORG 0040H
MAIN:
MOV P1,#00H
SETB EX0
SETB PX0
SETB IT0
SETB EA
SJMP $
INT:
CPL P1.0
RETI
END
ORG 0000H
LJMP MAIN
ORG 001BH
LJMP DVT1
ORG 0100H
MAIN:
MOV TMOD,#01H
MOV TH1,#15536/256
MOV TL1,#15536MOD256
MOV R7,#2
SETB ET1
SETB EA
SETB TR1
SJMP $
DVT1:
DJNZ R7,NT1
MOV R7,#2
CPL P1.0
NT1:
MOV TH1,#15536/256
MOV TL1,#15536MOD256
SETB TR1
RETI
END
ORG 0000H
LJMP MAIN
ORG 001BH
LJMP DVT1
ORG 0100H
MAIN:
MOV TMOD,#60H
MOV P1,#0
MOV TH1,#0FFH
MOV TL1,#0FFH
SETB ET1
SETB EA
SETB TR1
SJMP $
DVT1:
INC P1
RETI
END
六、 电子钟
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP DSQZD
ORG 00080H
MAIN:
MOV SP,70H
MOV TMOD,#01H
MOV TH0,#60
MOV TL0,#176
SETB ET0
SETB EA
SETB TR0
SMGXS: ;数码管显示
;PUSH ACC
PUSH PSW
MOV PSW,#08H
MOV R0,#30H ; R0指向30H单元,用做指针
MOV R1,#33H ; R1指向31H单元,用作指针
MOV R2,#3 ; 控制BCD码转换3次,共6个数
MOV R3,#01H ; 作为显示数码管亮的有效信号
MOV DPTR ,#TAB ; 数据指针指向表头
L1: LCALL TRANS ; 调用转化程序
MOV R1,#33H ; R1再次指向33H单元
L2: LCALL SHOW ; 调用显示子程序
POP PSW
;POP ACC
TRANS: ; 将压缩的BCD码转换为显示码
MOV A,@R0 ; R0指向单元的内容送给A
ANL A,#0FH ; 取低半字节数据
MOVC A,@A+DPTR ; 查表
MOV @R1,A ; 找到的数送给R1指向的单元
INC R1 ; R1指针下移
MOV A,@R0 ; R0指向单元的内容送给A
ANL A,#0F0H ; 取高半字节数据
SWAP A ; A的高低字节数据交换
MOVC A,@A+DPTR ; 查表
MOV @R1,A ; 找到的数送给R1指向的单元
INC R1 ; R1指针下移
INC R0 ; R0指针下移
DJNZ R2,TRANS ; R2减1判断6个数是否都已转化
RET ; 完成6个数转化,并存放在33H-38H单元内
SHOW: ; 显示子程序
MOV A,R3 ; 位码有效位送到A中
MOV DPTR,#0F002H; 传送位地址
MOVX @DPTR,A ; 某一位的显示数码管能亮
MOV A,@R1 ; 将显示段码送到A中
MOV DPTR,#0F004H; 传送段地址
MOVX @DPTR,A ; 显示数字
LCALL DELAY ; 延时1ms以便人眼看到
MOV A,R3 ; 不是,就将位码有效位送到A中
INC R1 ; 数据指针下移
JB ACC.5,LOOP ; 是否到了最高位,是,就结束
RL A ; 将1左移
MOV R3,A ; 再送回R3中
AJMP SHOW ; 返回显示程序
LOOP:RET ; 显示程序结束
DELAY: ; 延时1ms子程序
MOV R7,#04
DL: MOV R6,#0F8H
DJNZ R6,$
NOP
DJNZ R7,DL
RET
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
DSQZD: ;定时器中断;T0中断程序
;PUSH ACC
PUSH PSW
MOV TH0,#60
MOV TL0,#176
MOV P1,#55H ;检测点
MOV R7,#20 ;T0计数50ms,20次产生一次中断
DJNZ R7,RENEW
MOV R7,#20
SECOND:
INC 30H
MOV A,30H
DA A
MOV 30H,A ;16进制到BCD码调整
CJNE A,#60,RENEW ;比较不等转移
MOV 30H,#00H
MINUTE:
INC 31H
MOV A,31H
DA A
MOV 31H,A ;16进制到BCD码调整
CJNE A,#60,RENEW ;比较不等转移
MOV 30H,#00H
HOUR:
INC 32H
MOV A,32H
DA A
MOV 32H,A ;16进制到BCD码调整
CJNE A,#24,RENEW ;
MOV 32H,#00H
RETI
RENEW: ;又一次的50ms计数
POP PSW
;POP ACC
RETI
SJMP $
END
标签:LJMP,R0,R1,MOV,单片机,实验,DPTR,ORG From: https://www.cnblogs.com/xjlnl/p/16760405.html