程序清单
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数码管显示
;主程序
my8255_A EQU 0BFFCH
my8255_B EQU 0BFFDH
my8255_C EQU 0BFFEH
my8255_MODE EQU 0BFFFH
ORG 0000H
LJMP START
ORG 0100H
START: MOV A,#89H ;8255的PA、PB输出、PC输入
MOV DPTR,#my8255_MODE ;8255控制字地址
MOVX @DPTR,A ;8255 初始化
MOV 65H,#8
MOV 66H,#6
MOV 67H,#0
MOV 68H,#6
MOV 69H,#0
MOV 6AH,#4
MAIN: LCALL DIS ;调显示子程序
LJMP MAIN
;显示子程序DIS
;8位数码管从右到左动态显示内部RAM 65H~6CH单元中的数据
DIS: MOV R0,#65H ;要动态显示数据所存放的首地址
MOV R3,#20H ;8个数码管位选初始值
MOV A,R3 ;R3中暂存位选值
LD0: MOV P1,A ;LED位选,选中一个LED
MOV A,@R0
MOV DPTR,#TABLE ;数码管共阴极码表首地址
MOVC A,@A+DPTR ;查表,查到内部RAM 某单元中的数据的共阴极码送入A中
MOV DPTR,#my8255_B ;8255 PB口地址
MOVX @DPTR,A ;LED段选,显示内部RAM 某单元中的数据
ACALL DL1ms ;调延时1ms子程序
MOV A,R3 ;取出当前位选值
JB Acc.0,LD1 ;判断是否扫描到最右边的LED,若Acc.0=1,则已显示到最右
;边,返回
RR A ;若Acc.7=0,则未显示到最右边,位选码向右移一位,准备让右; 边的下一位LED亮
MOV R3,A ;位选码送R3中保存
INC R0 ;指针指向下一个数据单元
LJMP LD0
LD1: RET
TABLE: DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H
DL1ms: MOV R7,#02H ;延时1ms子程序
DL: MOV R6,#0FFH
DL6: DJNZ R6,DL6
DJNZ R7,DL
RET
END
模数转换
ADR_IN0 EQU 0FF78H ;ADC0809的IN0通道地址
my8255_A EQU 0BFFCH
my8255_B EQU 0BFFDH
my8255_C EQU 0BFFEH
my8255_MODE EQU 0BFFFH
ORG 0000H
MOV A,#89H ;8255的PA输出,PB、PC输入
MOV DPTR,#my8255_MODE ;8255控制字地址
MOVX @DPTR,A ;8255 初始
LJMP START
ORG 0100H
START: MOV DPTR , # ADR_IN0
MOVX @DPTR , A ;启动0809的0#通道
LCALL DELAY1MS
MOVX A , @DPTR ;读取0809的7#通道转换结束的数据
MOV DPTR,#0BFFCH ; 读单片机的A口
MOVX @DPTR,A ; 将结果在8个发光二极管中显示出来
LJMP START ;循环采样
DELAY1MS:MOV R7 , #0FFH ;延时子程序
DJNZ R7 , $
RET
END
模数转换之数码管显示
ADR_IN0 EQU 0FF78H ;ADC0809的IN0通道地址
my8255_A EQU 0BFFCH
my8255_B EQU 0BFFDH
my8255_C EQU 0BFFEH
my8255_MODE EQU 0BFFFH
ORG 0000H
LJMP START
ORG 0100H
START: MOV A,#89H ;8255的PA输出,PB、PC输入MOV DPTR,#my8255_MODE ;8255控制字地址
MOVX @DPTR,A ;8255 初始化
MOV 65H,#0
MOV 66H,#0
; MOV 69H,#0
; MOV 6AH,#0
MOV DPTR , # ADR_IN0
MOVX @DPTR , A ;启动0809的0#通道
LCALL DL1ms
MOVX A , @DPTR ;读取0809的7#通道转换结束的数据
MOV R4,A
MOV R3,#0
LCALL BINBCD
; MOV R3,#00H
; MOV R4,A
MOV A,21H
ANL A,#0FH
MOV 68H,A
MOV A,21H
SWAP A
ANL A,#0FH
MOV 67H,A
MOV A,22H
ANL A,#0FH
MOV 6AH,A
MOV A,22H
SWAP A
ANL A,#0FH
MOV 69H,A
LCALL DIS
LJMP START ;循环采样
BINBCD: NOP ; 二进制整数(16位)转换为十进制整数(组合BCD)子程序MOV R0, #22H ;转换结果低位地址
MOV A, R0
PUSH ACC ;ACC表示累加器A的直接地址
MOV R7, #03H
CLR A
LP1: MOV @R0, A ;结果存储地址清零
DEC R0
DJNZ R7, LP1
POP ACC
MOV R0, A
MOV R7, #16
LP2: PUSH ACC
CLR C
MOV A, R4 ;R4中为二进制数的低位
RLC A
MOV R4, A
MOV A, R3 ;R3中为二进制数的高位
RLC A
MOV R3, A
MOV B, #03H
LP3: MOV A, @R0
ADDC A, @R0 ;执行乘2操作
DA A ;十进制调整
MOV @R0, A ;结果保存
DEC R0
DJNZ B, LP3
POP ACC
MOV R0, A
DJNZ R7, LP2
RET
DIS: MOV R0,#65H ;要动态显示数据所存放的首地址
MOV R3,#20H ;8个数码管位选初始值
MOV A,R3 ;R3中暂存位选值
LD0: MOV P1,A ;LED位选,选中一个LED
MOV A,@R0
MOV DPTR,#TABLE ;数码管共阴极码表首地址
MOVC A,@A+DPTR ;查表,查到内部RAM 某单元中的数据的共阴极码送入A中
MOV DPTR,#my8255_B ;8255 PB口地址
MOVX @DPTR,A ;LED段选,显示内部RAM 某单元中的数据
ACALL DL1ms ;调延时1ms子程序
MOV A,R3 ;取出当前位选值
JB Acc.0,LD1 ;判断是否扫描到最右边的LED,若Acc.0=1,则已显示到最右
;边,返回
RR A ;若Acc.7=0,则未显示到最右边,位选码向右移一位,准备让右; 边的下一位LED亮
MOV R3,A ;位选码送R3中保存
INC R0 ;指针指向下一个数据单元
LJMP LD0
LD1: RET
DL1ms: MOV R7,#02H ;延时1ms子程序
DL: MOV R6,#0FFH
DL6: DJNZ R6,DL6
DJNZ R7,DL
RET
TABLE: DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H
END
串口接受与发送
ORG 0000H
MOV A, #10001001B
MOV DPTR,#1011111111111111B
MOVX @DPTR,A
mov scon,#50h; 串行口方式1,波特率设置成1200
mov tmod,#20h ; 定时器T1产生波特率
mov th1,#0e6h
mov tl1,#0e6h
setb tr1
aa1:
clr p3.5 ; ;
lcall DL1ms
lcall DL1ms
jnb ri,$ ; ;等待接受串行口发来的数据
clr ri
mov a,sbuf
setb p3.5
lcall DL1ms
lcall DL1ms
mov sbuf,a ; ;将串行口收到的数据从串行口发出去。
jnb ti,$
clr ti
MOV DPTR,#1011111111111100B
MOVX @DPTR,A
sjmp $ ;ljmp aa1
DL1ms: MOV R7,#02H ;延时1ms子程序
DL: MOV R6,#0FFH
DL6: DJNZ R6,DL6
DJNZ R7,DL
RET
End
串行接口开关状态:
ORG 0000H
MOV A, #10001001B
MOV DPTR,#1011111111111111B
MOVX @DPTR,A
mov scon,#50h; 串行口方式1,波特率设置成1200
mov tmod,#20h ; 定时器T1产生波特率
mov th1,#0e6h
mov tl1,#0e6h
setb tr1
aa1:
; clr p3.5 ; ;
; lcall DL1ms
; lcall DL1ms
; jnb ri,$ ; ;等待接受串行口发来的数据
; clr ri
; mov a,sbuf
mt: MOV DPTR,#10111111111110B
MOVX A,@DPTR
setb p3.5
lcall DL1ms
lcall DL1ms
mov sbuf,a ; ;将串行口收到的数据从串行口发出去。
jnb ti,$
clr ti
MOV DPTR,#1011111111111100B
MOVX @DPTR,A
sjmp $ ;ljmp aa1
DL1ms: MOV R7,#02H ;延时1ms子程序
DL: MOV R6,#0FFH
DL6: DJNZ R6,DL6
DJNZ R7,DL
RET
end
总程序
ADR_IN0 EQU 0FF78H ;ADC0809的IN0通道地址
my8255_A EQU 0BFFCH
my8255_B EQU 0BFFDH
my8255_C EQU 0BFFEH
my8255_MODE EQU 0BFFFH
ORG 0000H
LJMP START
ORG 0100H
START:
MOV A, #10001001B
MOV DPTR,#1011111111111111B
MOVX @DPTR,A
mov scon,#50h; 串行口方式1,波特率设置成1200
mov tmod,#20h ; 定时器T1产生波特率
mov th1,#0e6h
mov tl1,#0e6h
setb tr1
DD1:
clr p3.5 ; ;
lcall DL1ms
lcall DL1ms
jnb ri,$ ; ;等待接受串行口发来的数据
clr ri
mov a,sbuf
setb p3.5
lcall DL1ms
lcall DL1ms
mov sbuf,a ; ;将串行口收到的数据从串行口发出去。
jnb ti,$
clr ti
; sjmp $ ;ljmp aa1
AA1:MOV DPTR,#0BFFEH ;读开关状态
MOVX A,@DPTR
MOV DPTR,#0BFFCH ;读灯的状态
MOVX @DPTR,A
CJNE A,#0FFH,AA1; ;判断是否全为1
;SJMP $
;MOV A,#89H ;8255的PA输出,PB、PC输入
;MOV DPTR,#my8255_MODE ;8255控制字地址
; MOVX @DPTR,A ;8255 初始化
; 'MOV 65H,#0
; MOV 66H,#0
; MOV 69H,#0
; MOV 6AH,#0
AA3: MOV DPTR , # ADR_IN0
MOVX @DPTR , A ;启动0809的0#通道
LCALL DL1ms
MOVX A , @DPTR ;读取0809的7#通道转换结束的数据
; ;将采样到的数字D变为温度T
; ;mov a,#A
mov b,#80
mul ab
mov r6,b ; ;高8位送R6单元
mov r5,a ; ;低8位送R5单元
mov r2,#255; 除255
lcall DIV16 ; ;调子程序,注意观察商
mov r3,#0
mov A,R5
mov r4,A
lcall BINBCD ; 调子程序,注意观察商内部RAM 20H、21H、22H中数据; sjmp $
MOV R3,#0
MOV A,R5
MOV R4,A
LCALL BINBCD
MOV A,21H
ANL A,#0FH
MOV 66H,A
MOV A,21H
SWAP A
ANL A,#0FH
MOV 65H,A
MOV A,22H
ANL A,#0FH
MOV 68H,A
MOV A,22H
SWAP A
ANL A,#0FH
MOV 67H,A
mov A,R6
mov B,#100
mul ab
mov r6,b ; ;高8位送R6单元
mov r5,a ; ;低8位送R5单元
mov r2,#255; 除255
lcall DIV16 ; ;调子程序,注意观察商
mov r3,#0
mov A,R5
MOV R4,A
lcall BINBCD ; 调子程序,注意观察商内部RAM 20H、21H、22H中数据MOV A,22H
ANL A,#0FH
MOV 6AH,A
MOV A,22H
SWAP A
ANL A,#0FH
MOV 69H,A
;sjmp $
LCALL DIS
LJMP AA3 ;循环采样
DIV16: MOV R7,#08H ;设计数初值
DV1: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV A,R6
RLC A ; ;将(R5)*(R6)左移一位
MOV P1.7,C ; ;将移出的一位保存
CLR C
SUBB A,R2 ; ;余数(高位)- 除数
JB P1.7, GOV ; ;若标志位为1,说明够减
JNC GOV ; ;无进位,也说明够减
ADD A,R2 ; ;否则,恢复余数
AJMP DV2
GOV: INC R5 ; ;商上1
DV2: M OV R6,A ; ;保存余数(高位)
DJNZ R7,DV1
RET
BINBCD: NOP ; 二进制整数(16位)转换为十进制整数(组合BCD)子程序MOV R0, #22H ;转换结果低位地址
MOV A, R0
PUSH ACC ;ACC表示累加器A的直接地址
MOV R7, #03H
CLR A
LP1: MOV @R0, A ;结果存储地址清零
DEC R0
DJNZ R7, LP1
POP ACC
MOV R0, A
MOV R7, #16
LP2: PUSH ACC
CLR C
MOV A, R4 ;R4中为二进制数的低位
RLC A
MOV R4, A
MOV A, R3 ;R3中为二进制数的高位
RLC A
MOV R3, A
MOV B, #03H
LP3: MOV A, @R0
ADDC A, @R0 ;执行乘2操作
DA A ;十进制调整
MOV @R0, A ;结果保存
DEC R0
DJNZ B, LP3
POP ACC
MOV R0, A
DJNZ R7, LP2
RET
DIS: MOV R0,#65H ;要动态显示数据所存放的首地址
MOV R3,#20H ;8个数码管位选初始值
MOV A,R3 ;R3中暂存位选值
LD0: MOV P1,A ;LED位选,选中一个LED
MOV A,@R0
MOV DPTR,#TABLE ;数码管共阴极码表首地址
MOVC A,@A+DPTR ;查表,查到内部RAM 某单元中的数据的共阴极码送入A中
MOV B,A
MOV A,R3
JNB Acc.2,NEXT
MOV A,B
ORL A,#00000001B
MOV B,A
NEXT:MOV A,B
MOV DPTR,#my8255_B ;8255 PB口地址
MOVX @DPTR,A ;LED段选,显示内部RAM 某单元中的数据
ACALL DL1ms ;调延时1ms子程序
MOV A,R3 ;取出当前位选值
JB Acc.0,LD1 ;判断是否扫描到最右边的LED,若Acc.0=1,则已显示到最右
;边,返回
RR A ;若Acc.7=0,则未显示到最右边,位选码向右移一位,准备让右; 边的下一位LED亮
MOV R3,A ;位选码送R3中保存
INC R0 ;指针指向下一个数据单元
LJMP LD0
LD1: RET
DL1ms: MOV R7,#02H ;延时1ms子程序
DL: MOV R6,#0FFH
DL6: DJNZ R6,DL6
DJNZ R7,DL
RET
TABLE: DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H
END。