当前位置:首页 > 作文大全 > [8251单片机测量电压实验报告]8259实验报告
 

[8251单片机测量电压实验报告]8259实验报告

发布时间:2019-07-17 15:17:19 影响了:

设计思路:

程序整体上分为三个部分:

键盘输入部分:

AD 转换部分:

AD 转换共有两种触发方式:执行HSO 的0F 通道命令或者向A/D命令寄存器的GO 位写一个1,本程序采用后者,并将结果保存在0C00AH-0C00DH 中。

LED 显示部分:

AD 转换后的结果为2进制数,转换完以后要先转换成BCD 码,再将BCD 码转换成相应的LED 代码,然后对4个LED 进行扫描显示。

程序清单:

CPU 80C196KB

AX EQU 20H

AL EQU 20H

AH EQU 21H

BX EQU 22H

BL EQU 22H

BH EQU 23H

CX EQU 24H

CL EQU 24H

CH EQU 25H

DX EQU 26H

DL EQU 26H

DH EQU 27H

EX EQU 28H

EL EQU 28H

EH EQU 29H

FX EQU 2AH

FL EQU 2AH

FH EQU 2BH

PA8255 EQU 0BF00H

PB8255 EQU 0BF02H

PC8255 EQU 0BF04H

C8255 EQU 0BF06H

HSIRES EQU 0C00AH

0C00AH-0C00DH (4字节).

HSIRESH EQU 0C00CH

BCD EQU 0C00EH

TABLE EQU 0C014H

;**********变量************

ADSEL EQU 50H

LEDSEL EQU 4FH

DT EQU 4CH

CHANNAL EQU 4BH

TSP EQU 48H

SP1 EQU 46H

HSISEL EQU 45H

AA EQU 44H

;TEMPH EQU 43H

TEMP EQU 42H

SIGNAL EQU 41H

COUNT1 EQU 32H

COUNT2 EQU 30H

LOOPK EQU 2EH

C EQU 2DH

ADKEY EQU 2CH

ORG 2000H

DW 3500H

ORG 2004H ;8255的PA 口地址 ;8255的PB 口地址 ;8255的PC 口地址 ;8255的控制字地址 ; 频率或AD 计算结果(二进制) 存放地址为;BCD 码存放地址为0C00EH-0C013H (6字节). ; 段码存放地址为0C014H-0C01BH (8字节) ;AD 转换通道选择变量 ;LED 扫描显示位选变量 ; 延时系数 ; 显示通道号 ;TSP 地址不能为4AH ; 段码查找时的段码地址偏移量 ;HSI 通道选择变量HSISEL ; 显示清零的时间延时系数 ; ;HSI 中T1与T2之间的时间差 ;HSI 中断次数标志 ;T1与T2之间的定时器1溢出次数 ;B/BCD转换中十进制结果位数记录变量 ; 循环显示功能开动标志 ; 循环显示时的时间间隔计数器 ;AD 转换开关标志 ; 定义定时器1中服程序首地址 ; 定义HSI 中服程序首地址

DW 3600H

;**********初始化**********

ORG 2080H

出。

LD LD LDB STB LDB LDB STB LD LD LD ST ST SP ,#00C0H AX,#C8255 BL,#10000010B BL,[AX] CHANNAL,#60H CL,#00000001B CL,PC8255 CX,#HSIRES DX,#0 EX,#0 DX,[CX]+ EX,[CX]

N,#1

AA

HSIMOD,#0

SIGNAL

COUNT1

COUNT2

ADKEY

ADSEL,#00001110B ;

INTPEN

INTMAS,#00000101B

IOC1,#00000100B

; 清AD 转换开关标志 ; 清中断挂号寄存器 ; 开HSI 和定时器1溢出中断 ;HSI 中断于保持寄存器被加载,T1溢出中断允许 ; 开中断 ; 设堆栈指针首地址 ;8255初始化. ;A,B,C 口均工作在方式0, B 口做输入,A,C 口做输; 写8255控制字 ; 开始时显示第一通道 ; ;HSIRES 存储区清零 ; ; ; LDB CLRB LDB CLRB CLRB 次数变量清零 ;CLRB CLRB ;LDB CLRB LDB LDB ;HSI 事件触发方式标志N=1 ; 无HSI 事件触发的时间计数变量 ;HSI 选方式0 ;HSI 触发次数标志SIGNAL ;HSI 第一次与最后一次触发事件之间定时器溢出 EI

;**********主程序************

MAIN: LDB AH,PC8255

XORB AH,#00000011B

STB AH,PC8255

LDB AL,PB8255

CMPB AL,#0FFH

JE NEXT2

LCALL DISPLAY

LDB AL,PB8255

LDB AH,PC8255

ANDB AH,#00000011B ; 读PC 口状态 ;PC1,PC0两位进行异或 ; 键盘扫描移位 ; 读PB 口状态 ; 是否有键按下? ; 否,转到NEXT2 ; 是,去抖(调用显示来实现延时) ; 读PB 口状态 ; 读PC 口状态 ; 提取键码

K3:

K6:

K7:

NEXT2:

JE CMP JE CMP JE SJMP LCALL SJMP LCALL SJMP LCALL LCALL CMPB JNE LDB JBS LDB SHR MULU ST ST LDB SJMP K3 AX,#02BFH K6 AX,#027FH K7 NEXT2 KEY3 NEXT2 KEY6 NEXT2 KEY7 DISPLAY ADKEY ,#1 MAIN AL,AD AL,3,MAIN AH,ADH AX,#6 AX,#5 AX,HSIRES R0,HSIRESH ADCOM,ADSEL MAIN ; 是,转去K3 ; 是‘6’键按下吗? ; 是,转去K6 ; 是‘7’键按下吗? ; 是,转去K7 ; 跳转到NEXT2 ; 调用KEY3子程序 ; 跳转到NEXT2 ; 调用KEY6子程序 ; 跳转到NEXT2 ; 调用KEY7子程序 ; 调用显示子程序 ;AD 转换开关标志=1吗? ; 否,跳转到MAIN ; 是,读AD 转换结果的低8位 ;AD 转换完吗?否,跳转到MAIN ; 是,读AD 转换结果的高8位 ;AD 转换结果右移6位 ; 计算电压值 ; 电压值存入HSIRES 存放区 ;HSIRES 存放区的高16位为0 ; 再次开动AD 转换 ; 跳转到MAIN

;**********显示子程序****************

ORG 3000H

DISPLAY:LCALL BTOBCD ; 二进制转换成BCD 码

LCALL BCDTOL ;BCD 码转换成段码

LDB AL,PC8255 ; 读PC 口

ANDB AL,#00000011B ; 高3位清零,PC0,PC1位不变

LDB LEDSEL,AL ; 指向最右一个LED

LDB TSP ,#0 ; 指向第一个显示段码

LDB CL,#8 ;LED 扫描次数=8

LOOP: LDB BL,#0 ;BL=0

LD AX,#PA8255

STB BL,[AX] ; 灭LED

LD AX,#PC8255

STB LEDSEL,[AX] ; 送出LED 位选

LD AX,#PA8255

LDB BL,TABLE[TSP] ; 取段码放入BL

STB BL,[AX] ; 送出段码

LCALL DELAY ; 延时(约1ms)

MAIN1:

JE ADDB INCB T SP SJMP RET MAIN1 ; 是,转到MAIN LEDSEL,#00100000B ; 否,位选左移一位 ; 取下一段码 LOOP ; 继续显示下一个LED

;**********延时子程序(1ms)***********

DELAY: LD DT,#420 ; 循环次数=420

DLOOP: NOP ;(2+2+9)*420*0.182=1ms

NOP ;

DJNZ DT,DLOOP ;DT-1=0吗?否,继续循环

RET ; 返回

;**********B to BCD转换子程序******

BTOBCD: CLRB

LD

LD

LD

LD COUNT2 AX,#HSIRES EX,[AX]+ FX,[AX] AX,#BCD ; 清十进制结果位数记录变量 ; 低16位送到EX ; 高16位送到FX

BLOOP: LD CX,FX ;FX 放入CX

CLR DX ; 高16位扩展成32位

DIVU CX,#10 ;DX,CX 组成的32位除以10

LD FX,DX ; 余数存入FX

DIVU EX,#10 ;FX,EX 组成的32位除以10

STB FL,[AX]+ ; 余数存入BCD 存储区

INCB C OUNT2 ; 记下十进制结果的位数

LD FX,CX ; 高位商存入FX

CMP EX,#0 ; 低位商为0吗?

JNE BLOOP ; 否,跳转到BLOOP

RET ; 返回

;**********BCD to 段码 子程序*************

BCDTOL: LD AX,#BCD

LD EX,#TABLE

;LD DX,#LED

LDB BL,CHANNAL

STB BL,7[EX] ; 通道号存入TABLE 区的第八个单元,在第一个LED 显示

LDB CL,COUNT2

NEXT: LDB SP1,[AX]+ ; 取BCD 码放到SP1中

LDB BH,LED[SP1] ; 查找BCD 码对应的段码放到BH 中

STB BH,[EX]+ ; 段码存入TABLE 存放区

DJNZ CL,NEXT ; 是否转换完?否,再转换。 LDB CL,#7

SUBB CL,COUNT2 ; 是,7-COUNT2

CLEAN: STB R0,[EX]+ ; 把0存入剩下的TABLE 单元 DJNZ CL,CLEAN

RET

;**********KEY3********************

KEY3:

EI LDB ST ST LOOPK,#1 R0,HSIRES R0,HSIRESH ; 开中断 ; 开循环显示功能 ; 使显示为0

RET ; 返回

;**********KEY6********************

KEY6: DI ; 关中断

LDB CHANNAL,#0BEH ; 通道号=6

LDB ADKEY ,#1 ; 开AD 转换开关

LDB ADSEL,#00001110B ; 选择ACH6通道

LDB ADCOM,ADSEL ; 立即启动AD 转换 RET ; 返回

;**********KEY7********************

KEY7: DI ; 关中断

LDB CHANNAL,#0E0H ; 通道号=7

LDB ADKEY ,#1 ; 开AD 转换开关

LDB ADSEL,#00001111B ; 选择ACH7通道

LDB ADCOM,ADSEL ; 立即启动AD 转换 RET ; 返回

;**********段码表******************

LED: DB 0FCH,60H,0DAH,0F2H,66H ;0,1,2,3,4

DB 0B6H,0BEH,0E0H,0FEH,0F6H ;5,6,7,8,9

END

猜你想看
相关文章

Copyright © 2008 - 2022 版权所有 职场范文网

工业和信息化部 备案号:沪ICP备18009755号-3