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

设计思路:

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

键盘输入部分:

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

设计思路:

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

键盘输入部分:

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


相关内容

  • 微机原理及应用教学大纲
  • <微机原理及应用>课程教学大纲 [课程代码]: [英文译名]:MicroComputer Theory and Application [适用专业]:计算机科学与技术 [适用层次]:本科 [学 分 数]:6 [总学时数]:96 一.本课程教学目的和任务 本课程是全国网络教育计算机科学与技 ...

  • 低成本低功耗简易电子秤设计
  • [摘  要]本电子秤主要由以51系列为核心的单片机系统,hx710 A/D芯片.矩阵按键电路和数码管显示电路等组成.通过软硬件结合,电子秤实现称量.计价.金额累加和去皮等功能,具有成本低.功耗低和精度高的特点. [关键词]称重传感器  电子秤  A/D hx710芯片 中图分类号:TP212 文献标 ...

  • 红外测距仪总结报告
  • 红外测距仪的制作 姓名 班级 日期 一.摘要(5%) 本次设计任务是设计一个红外测距电路,它由硬件和软件两部分组成,硬件部分包括发射模块和接收模块,先由stc8051单片机产生一个1khz 的信号,经红外发射管发射,碰到障碍物后返回,接收管接收到信号通过放大.滤波.峰值检波.AD 转换后传回单片机, ...

  • 传感器设计报告
  • 传感器原理及技术应用 汽车转速的测量 设计性实验 [1**********]08 王胜 电子信息科学与技术 物理与电子科学学院 2011-10-28 汽车转速的测量 一.任务解析 对汽车进行实时速度的测量,显示出速度值 二.方案论证 核心传感器是霍尔元件,霍尔效应的表达式为U=KIB,当被测圆盘上装 ...

  • 数字电压表-量程20V
  • 本科学生设计性实验报告 项目组长____学号成 员 专 业 实验项目名称__基于单片机的数字电压表 _ 指导教师及职称___ _ _ 开课学期 至_学年_学期 上课时间 年月日 摘 要 本实验是利用单片机设计一个简易的数字电压表,能够测量交流直流电压值,通过LED数码管显示,使用的元器件数目较少.外 ...

  • 传感器原理课程设计
  • HUBEI NORMAL UNIVERSITY <传感器原理与应用> 实验报告 湖北师范学院计算机科学与技术学院 目录 实验一 Pt100铂电阻测温特性实验 ................................................................. ...

  • 研究性实验报告数字示波器测量声速
  • 大学物理研究性实验报告 专题:数字示波器测量声速 目 录 摘要 ............................................................................................................. - 3 - 实验 ...

  • 智能化仪器课程设计报告
  • 智能化仪器课程设计总结报告 测控071 0730221124 方晶晶 1.课程设计的目的和任务 本次课程设计是以AT89C51单片机为核心,设计一个具有实时时钟功能和直流电压测量功能的智能化测量仪器.要求具有实时时钟显示和校时功能,电压测量显示功能等.可作为通用的二次仪表使用,根据电压与被测物理量的 ...

  • 电子信息工程毕业论文范文
  • 分 类 号:TP213 单位代码:10452 临沂大学理学院 毕业论文(设计) 电阻电容电感测试仪的设计 姓 名 王 金 全 学 号 [1**********]9 年 级 2008 专 业 电子信息科学与技术 系 (院) 理学院 指导教师 刘 怀 强 2012年03月15日 摘 要 本设计是一种基于 ...