单片机程序清单
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ORG 0000H
LJMP MAIN ;进入主程序
ORG 0003H ;外部中断0入口地址
LJMP INT_INT0 ;外部中断0服务程序
ORG 000BH ;定时器T0中断入口程序
LJMP INT_T0 ;定时器T0中断服务程序
ORG 0013H ;外部中断1入口地址
LJMP INT_INT1 ;外部中断1服务程序
ORG 001BH ;定时器T1中断入口程序
LJMP INT_T1 ;定时器T1中断服务程序
ORG 0030H
MAIN: CLR P1.3 ;关闭蜂鸣
MOV R5,#40 ;初始化
MOV TMOD,#11H
MOV TH0,#3CH
MOV TL0,#0B0H
MOV TH1,#0FFH
MOV TL1,#0D9H
MOV IE,#8FH ;打开中断允许位
MOV SCON,#00H ;串行口方式0工作
MOV SP,#50H ;设置堆栈初值
SETB IT1 ;外部中断1设置为边沿触发方式
SETB IT0 ;外部中断0设置为边沿触发方式
C1: LCALL NUM ;调用学号显示子程序
SJMP C1
INT_INT1: MOV R6,#06H ;赋初值
CLR P1.0
CLR P1.2
LK3: JNB P1.4,LK1 ;判断是否有键按下
JNB P1.5,LK1
RETI
LK1: LCALL DELAY_2 ;去抖动
JNB P1.4,LK2 ;是否真的有键按下
JNB P1.5,LK2
RETI
LK2: SETB P1.3 ;蜂鸣启动
SETB P1.2
SETB TR0 ;启动定时器T0
JNB P1.4,L0 ;判断是否为0键按下,按下则跳转
JNB P1.5,L1 ;判断是否为1键按下,按下则跳转
CLR P1.2
SETB P1.0
JNB P1.4,L2 ;判断是否为2键按下,按下则跳转
JNB P1.5,L3 ;判断是否为3键按下,按下则跳转
L0: MOV R2,#3FH ;显示6个0
AJMP L4
AJMP L5
L1:MOV R2,#06H ;显示6个1
AJMP L4
AJMP L5
L2:MOV R2,#5BH ;显示6个2
AJMP L4
AJMP L5
L3:MOV R2,#4FH ;显示6个3
AJMP L4
AJMP L5
L4: MOV SBUF,R2 ;显示6个相同数的子程序
JNB TI,$ ;等待数据全部发送完
CLR TI
DJNZ R6,L4
L5: MOV R6,#06H ;再赋初值
CLR P1.0
CLR P1.2
LK4:JNB P1.4,$ ;判断是否按键弹起
JNB P1.5,$
LCALL DELAY_2 ;去抖动
JNB P1.4,LK4 ;判断是否真的弹起
JNB P1.5,LK4
CLR P1.3 ;关蜂鸣
CLR TR0 ;关定时器T0
MOV TH0,#3CH ;赋初值
MOV TL0,#0B0H
CJNE R5,#00H,K8 ;判断按键是否达到2s
CJNE R2,#06H,K6 ;判断是否为1号键
LCALL ADC ;启动A/D功能
K6: CJNE R2,#5BH,K7 ;判断是否为2号键
LCALL DAC ;启动D/A功能
K7: CJNE R2,#4FH,K8 ;判断是否为3号键
LCALL NUM ;调用显示学号子程序
K8: MOV R5,#40 ;赋初值
RETI ;返回
NUM: SETB RS0 ;学号子程序(使用第一组工作寄存器)
PUSH ACC ;保护现场
PUSH DPH
PUSH DPL
MOV 70H,#06H
MOV 71H,#00H
MOV 72H,#00H
MOV 73H,#00H
MOV 74H,#00H
MOV 75H,#00H
LCALL DISP ;数码管显示 1
LCALL DELAY_1 ;延时1s
MO
V 70H,#06H
MOV 71H,#3FH
MOV 72H,#00H
MOV 73H,#00H
MOV 74H,#00H
MOV 75H,#00H
LCALL DISP ;数码管显示 10
LCALL DELAY_1 ;延时1s
MOV 70H,#06H
MOV 71H,#3FH
MOV 72H,#6FH
MOV 73H,#00H
MOV 74H,#00H
MOV 75H,#00H
LCALL DISP ;数码管显示 109
LCALL DELAY_1 ;延时1s
MOV 70H,#06H
MOV 71H,#3FH
MOV 72H,#6FH
MOV 73H,#5BH
MOV 74H,#00H
MOV 75H,#00H
LCALL DISP ;数码管显示 1092
LCALL DELAY_1 ;延时1s
MOV 70H,#06H
MOV 71H,#3FH
MOV 72H,#6FH
MOV 73H,#5BH
MOV 74H,#07H
MOV 75H,#00H
LCALL DISP ;数码管显示 10927
LCALL DELAY_1 ;延时1s
MOV 70H,#06H
MOV 71H,#3FH
MOV 72H,#6FH
MOV 73H,#5BH
MOV 74H,#07H
MOV 75H,#6FH
LCALL DISP ;数码管显示109279
LCALL DELAY_1 ;延时1s
CLR RS0
POP DPL
POP DPH
POP ACC ;恢复现场
RET ;返回
DISP: MOV R3,#06H
MOV R0,#70H
LOOP: MOV A,@R0 ;数码管显示子程序
MOV SBUF,A
JNB TI,$ ;等待数据全部发送完
CLR TI
INC R0
DJNZ R3,LOOP
RET ;返回
DELAY_1: MOV R7 ,#10 ;延时1s子程序
D4:MOV R6 ,#200
D3:MOV R5 ,#250
DJNZ R5 ,$
DJNZ R6 ,D3
DJNZ R7 ,D4
DELAY_2: MOV R0,#0AH ;延时10ms
DL2: MOV R1,#7DH
DL1: NOP
NOP
DJNZ R1,DL1
DJNZ R0,DL2
RET ;返回
INT_T0: MOV TH0,#3CH ;赋初值
MOV TL0,#0B0H
DJNZ R5,LP
LP: RETI
DAC:MOV DPTR,#3FFFH ;D/A功能子程序
MOV A,#0FFH
SETB TR1
RET
INT_T1: MOV DPTR,#3FFFH
MOVX @DPTR,A ;定时器T1中断入口程序
DEC A
MOV TH1,#0FFH ;再重新赋初值
MOV TL1,#0D9H
RETI
ADC: MOV DPTR,#0BFFBH ;A/D功能子程序
MOVX @DPTR,A
RET
INT0: PUSH ACC
SETB RS1
CLR RS0
MOV 10H,#40H;
MOV R2,#4
MOV DPTR,#0BFFBH
MOVX A,@DPTR;读数
MOV B,#51
DIV AB;相除求出整数部分
MOV @R0,A;将整数部分存入数据暂存区
INC R0;更新暂存单元
MOV @R0,#0BH;将小数点偏移量存入数据暂存区
INC R0;更新暂存单元
MOV A,B;余数部分存入累加器A
MOV B,#5
DIV AB;求出小数部分第一位
MOV @R0,A;将小数第一位存入数据暂存区
INC R0;更新存储单元
MOV A,#10
MUL AB
MOV B,#5
DIV AB;求出小数部分第二位
MOV @R0,A;将小数部分第二位存入数据暂存区
GL0:MOV A,@R0;取出数据作为查表偏移量
MOV DPTR,#TAB3;取出字型码数据列表首地址
MOVC A,@A+DPTR;查找字型码
MOV SBUF,A;发送显示
GL1:JNB TI,GL1;判断有没有发送完
CLR TI;清除中断标志位,准备下次发送
DEC R0
DJNZ R2,GL0;判断数据有没有全部显示
RETI
TAB3:DB 3FH,06H,5BH,4FH,66H;0,1,2,3,4
DB 6FH,7DH,07H,7FH,6FH;9,6,7,8,9
DB 80H;小数点
END