广工2013接口与通讯实验报告 本文关键词:接口,实验,通讯,报告,广工
广工2013接口与通讯实验报告 本文简介:接口与通讯实验报告1、8253定时/计数器实验2、8255并行接口实验3、8259中断控制器实验4、D/A(数/模)转换实验5、A/D(模/数)转换实验学生学院专业班级学号学生姓名指导教师2013年12月9日实验题目8253定时器实验1、实验目的与要求(1)学习8253可编程定时器/计数器定时方法(
广工2013接口与通讯实验报告 本文内容:
接口与通讯实验报告
1、8253定时/计数器实验
2、8255并行接口实验
3、8259中断控制器实验
4、D/A(数/模)转换实验
5、A/D(模/数)转换实验
学生学院
专业班级
学
号
学生姓名
指导教师
2013
年
12
月
9
日
实验题目
8253定时器实验
1、
实验目的与要求
(1)
学习8253可编程定时器/计数器定时方法
(2)
学习8253多级串联实现大时间常数的定时方法
(3)
学习8088/86控制定时器的方法
2、
实验内容
(1)
实验原理
8253A既可以作定时器又可作计数器:
(1)
计数:计数器装入初值后,当GATE为高电平时,可用外部事件作为CLK,脉冲对计数值进行减一计数,对每来一个脉冲减一,当计数值减少到0时,OUT端输出一个标志信号。
(2)
定时:计数器装入初值后,当GATE为高电平时,由CLK脉冲触发开始自动计数,计数到零时,发计数结束定时信号。
(2)
实验方法
用8253对标准脉冲信号进行计数,就可以实现定时功能。用板上的1MHz作为标准信号,将8253可编程计数器/定时器的时间常数设在1000000次,就可以在定时器的管脚上输出1秒针高/1秒钟低的脉冲信号。因为8253每个计数器只有十六位,要用两个计数器才能实现一百万次的计数,实现每一秒输出状态发生一次反转。
(3)
实验接线
连接孔1
连接孔2
连接孔1
连接孔2
连接孔1
连接孔2
CS4
8253_CS
VCC
8253_GATE0
L0
8253_OUT0
8253_OUT1
8253_CLK0
VCC
8253_GATE1
1MHz
8253_CLK1
3、
实验程序
CONTROL
equ
0c003h
;控制端口地址
COUNT0
equ
0c000h
;计数器0的地址
COUNT1
equ
0c001h
;计数器1的地址
COUNT2
equ
0c002h
;计数器2的地址
code
segment
assume
cs:code
start
proc
near
mov
al,36h;
00110100B
;
计数器0,16位,方式2,二进制
mov
dx,CONTROL
out
dx,al
mov
ax,1000
;计数器0的时间常数
mov
dx,COUNT0
out
dx,al
;
计数器低字节
mov
al,ah
out
dx,al
;
计数器高字节
mov
al,76h;
01110100B
;
计数器1,16位,方式2,二进制
mov
dx,CONTROL
out
dx,al
mov
ax,1001
;计数器1的时间常数
mov
dx,COUNT1
out
dx,al
;
计数器低字节
mov
al,ah
out
dx,al
;
计数器高字节
jmp
$
start
endp
code
ends
end
start
实验题目
8255并行接口实验
1、
实验目的与要求
(1)
了解8255芯片结构以及编程方法
(2)
了解8255输入、输出实验方法
2、
实验内容
(1)
实验原理
可编程输入输出的并行接口芯片8255A,具有三个八位的I/O口,它有三种工作方式。本实验采用施方式0:PA,PC口输出,PB口输入。
(2)
实验方法
按照实验要求,本实验采用方式0,这种方式不需要任何选通信号,并且采用从C端口读入数据,从A、B端口并行地输出数据,为了效果明显,实验带有一定的延时。
(3)
实验接线
连接孔1
连接孔2
连接孔1
连接孔2
连接孔1
连接孔2
CS0
8255_CS
L0
8255-PA0
L1
8255-PA1
L2
8255-PA2
L3
8255-PA3
L4
8255-PA4
L5
8255-PA5
L6
8255-PA6
L7
8255-PA7
K0
8255-PB0
K1
8255-PB1
K2
8255-PB2
K3
8255-PB3
K4
8255-PB4
K5
8255-PB5
K6
8255-PB6
K7
8255-PB7
3、
实验程序
mode
equ
082h
;
方式0,PA,PC输出,PB输入
PortA
equ
8000h
;
Port
A
PortB
equ
8001h
;
Port
B
PortC
equ
8002h
;
Port
C
CAddr
equ
8003h
;
控制字地址
code
segment
assume
cs:code
start
proc
near
Start:
mov
al,mode
mov
dx,CAddr
out
dx,al
;
输出控制字
;实验2:
PortB
输入
PortA
输出
mov
dx,PortB
in
al,dx
;
读入PortB
mov
dx,PortC
out
dx,al
mov
dx,PortA
out
dx,al
;
输出到PortA
mov
ah,200
call
delay
;调用延时子程序
jmp
Start
endp
delay
proc
near
push
ax
mov
al,0
;
设置延时低位为0
push
cx
mov
cx,ax
;
设置延时CX的为0C800H
loop
$
pop
cx
pop
ax
ret
delay
endp
code
ends
end
start
思考题:
mov
dx,PortC
in
al,dx
;
读入PortC
mov
dx,PortB
out
dx,al
mov
dx,PortA
out
dx,al
;
输出到PortA
mov
ah,200
call
delay
;调用延时子程序
jmp
Start
endp
delay
proc
near
push
ax
mov
al,0
;
设置延时低位为0
push
cx
mov
cx,ax
;
设置延时CX的为0C800H
loop
$
pop
cx
pop
ax
ret
delay
endp
code
ends
end
start
实验题目
8259中断控制器实验
1、
实验目的与要求
(1)
学习8088/86与8259的连接方法。
(2)
学习8088/86对8259的控制方法.。
2、
实验内容
(1)
实验原理
8088/8086需要外接中断控制器才能对外部中断进行处理。
8259可外接8个中断源,本实验只响应INTO中断,8259也可以多级连接以影响多个中断源。将单脉冲信号接到8259的INTO脚。每次中断时,可看到LED显示会加一。
(2)
实验方法
用8088/86控制8259可编程中断控制器,实现对外部中断的响应和处理。要求程序中对每次中断进行计数,并将计数结果用8255的PA口输出到LED。
(3)
实验接线
CS0→8255CS
CS1→8259CS
单脉冲→8259——INTO
(L0—L7)→(8255PA0—PA7)
3、
实验程序
mode
equ
82h
;
8255
工作方式
PA8255
equ
8000h
;
8255
PA口输出地址
CTL8255
equ
8003h
ICW1
equ
00010011b
;
单片8259,上升沿中断,要写ICW4
ICW2
equ
00100000b
;
中断号为20H
ICW4
equ
00000001b
;
工作在8086/88
方式
OCW1
equ
11111110b
;
只响应INT0
中断
CS8259A
equ
09000h
;
8259地址
CS8259B
equ
09001h
data
segment
CNT
db
0
data
ends
code
segment
assume
cs:code,ds:
data
IEnter
proc
near
push
ax
push
dx
mov
dx,PA8255
inc
CNT
mov
al,CNT
out
dx,al
;
输出计数值
mov
dx,CS8259A
mov
al,20h
;
中断服务程序结束指令
out
dx,al
pop
dx
pop
ax
iret
IEnter
endp
IInit
proc
mov
dx,CS8259A
mov
al,ICW1
out
dx,al
mov
dx,CS8259B
mov
al,ICW2
out
dx,al
mov
al,ICW4
out
dx,al
mov
al,OCW1
out
dx,al
ret
IInit
endp
start
proc
near
mov
dx,CTL8255
mov
al,mode
out
dx,al
cli
mov
ax,0
mov
ds,ax
mov
bx,4*ICW2
;
中断号
mov
ax,code
shl
ax,4
;
x
16
add
ax,offset
IEnter
;
中断入口地址(段地址为0)
mov
[bx],ax
mov
ax,0
inc
bx
inc
bx
mov
[bx],ax
;
代码段地址为0
call
IInit
mov
ax,data
mov
ds,ax
mov
CNT,0
;
计数值初始为0
mov
al,CNT
mov
dx,PA8255
out
dx,al
sti
LP:
;
等待中断,并计数。
nop
jmp
LP
start
endp
code
ends
end
start
实验题目
D/A(数/模)转换实验
1、
实验目的与要求
(1)
了解D/A转换的基本原理。
(2)
了解D/A转换芯片0832的性能以及编程方法。
(3)
了解单片机系统中拓展D/A转换的基本方法
2、
实验内容
(1)
实验原理
D/A转换:这是把数字量转换为模拟量的变换,可以将计算机产生的控制量转换为模拟信号,其基本转换原理是把数字量的每一位代码按权的大小转换为相应的模拟分量,然后把各分量相加得到总的模拟量;8位、电流输出型D/A转换芯片,有直通、单缓存以及双缓存三种工作方式。在外部使用运算放大器后可以转换为电压输出,并且分为单极性输出和双极性输出。
(2)
实验方法
利用DAC0832,可以自行编制程序产生锯齿波、三角波、正弦波。三种波轮流显示,用示波器观看。
(3)
实验接线
连接孔1
连接孔2
CS2
DA_CS
-5V-+5V
逻辑波形L3
3、
实验程序
data
segment
assume
ds:
data
SinData:
;正弦数字量表
DB
0C0H,0C3H,0C6H,0C9H,0CCH,0CFH,0D2H,0D5H
DB
0D8H,0DBH,0DEH,0E0H,0E3H,0E6H,0E8H,0EAH
DB
0EDH,0EFH,0F1H,0F3H,0F5H,0F6H,0F8H,0F9H
DB
0FBH,0FCH,0FDH,0FEH,0FEH,0FFH,0FFH,0FFH
DB
0FFH,0FFH,0FFH,0FFH,0FEH,0FEH,0FDH,0FCH
DB
0FBH,0F9H,0F8H,0F6H,0F5H,0F3H,0F1H,0EFH
DB
0EDH,0EAH,0E8H,0E6H,0E3H,0E0H,0DEH,0DBH
DB
0D8H,0D5H,0D2H,0CFH,0CCH,0C9H,0C6H,0C3H
DB
0C0H,0BCH,0B9H,0B6H,0B3H,0B0H,0ADH,0AAH
DB
0A7H,0A4H,0A1H,9FH,9CH,99H,97H,95H
DB
92H,90H,8EH,8CH,8AH,89H,87H,86H
DB
84H,83H,82H,81H,81H,80H,80H,80H
DB
80H,80H,80H,80H,81H,81H,82H,83H
DB
84H,86H,87H,89H,8AH,8CH,8EH,90H
DB
92H,95H,97H,99H,9CH,9FH,0A1H,0A4H
DB
0A7H,0AAH,0ADH,0B0H,0B3H,0B6H,0B9H,0BCH
ends
code
segment
assume
cs:code
;延时子程序
proc
Delay
near
push
cx
mov
cx,ax
DelayLoop:
nop
nop
nop
nop
nop
nop
loop
DelayLoop
pop
cx
ret
endp
proc
OutputDA
near
mov
dx,CS0832
out
dx,al
ret
endp
proc
ShowSin
near
;
0832输出以转换
push
cx
mov
bx,400H
+
offset
SinData
mov
cx,80h
ShowSinLoop:
;正弦波
mov
al,[bx]
call
OutputDA
inc
bx
mov
ax,40
call
Delay
loop
ShowSinLoop
pop
cx
ret
endp
proc
ShowTri
near
push
cx
mov
bx,80h
mov
cx,80h
ShowTriLoop:
;
锯齿波
mov
al,bl
call
OutputDA
inc
bx
mov
ax,40
call
Delay
loop
ShowTriLoop
pop
cx
ret
endp
proc
ShowSq
near
;方波
push
cx
mov
al,80h
call
OutputDA
mov
cx,10
D1:
;
显示一段0V波形
mov
ax,200
call
Delay
loop
D1
mov
al,0ffh
call
OutputDA
mov
cx,10
D2:
;
显示一段5V波形
mov
ax,200
call
Delay
loop
D2
pop
cx
ret
endp
;
主程序
start
proc
near
mov
ax,0
mov
ds,ax
mov
es,ax
MLoop:
mov
cx,100
MD1:
call
ShowSin
loop
MD1
mov
cx,100
MD2:
call
ShowTri
loop
MD2
mov
cx,100
MD3:
call
ShowSq
loop
MD3
jmp
MLoop
start
endp
code
ends
end
start
实验题目
A/D(模/数)转换实验
1、
实验内容
(1)实验原理
利用实验板上的ADC0809做A/D转换器,实验板上的电位器提供模拟量输入,编制程序,将模拟量转换成二进制数字量,用8255的PA口输出到发光二极管显示。
(2)实验方法
通过电位器提供模拟量输入,利用0809芯片转换为二进制数字量,并通过LED灯管显示出来;0809转换结束后,输出高电平的EOC信号给8259的IN0中断源,并通过中断服务程序利用8255并行地把转换结果输出到LED灯。
(3)实验接线
连接孔1
连接孔2
连接孔1
连接孔2
CS1
8255CS
CS0
AD_CS
电位器输出
IN0
L0
8255-PA0
L1
8255-PA1
L2
8255-PA2
L3
8255-PA3
L4
8255-PA4
L5
8255-PA5
L6
8255-PA6
L7
8255-PA7
2、
实验程序
mode
equ
082h
;8255工作字10000010B,方式0,A、C口输入,B输入
PA
equ
09000h
;8255A口地址
CTL
equ
09003h
;8255A控制地址
CS0809
equ
08000h
;AD转换器端口
code
segment
assume
cs:code
start
proc
near
mov
bx,0f123h
mov
ax,5678h
mov
[bx],ax
mov
ax,[bx]
mov
ax,1234h
mov
bx,5678h
add
ax,bx
mov
bx,400h
mov
[bx],ax
mov
al,mode
;送8255方式字
mov
dx,CTL
out
dx,al
again:
mov
al,0
;虚写启动
mov
dx,CS0809
out
dx,al
;
起动
A/D
mov
cx,40h
loop
$
;
延时
>
100us
in
al,dx
;
读入结果
mov
dx,PA
;送到A口去
out
dx,al
jmp
again
code
ends
end
start
思考题:以中断方式实现数据采集,实现代码如下:
md8255
equ
82h
;
8255
工作方式,可用PA口方式0输出
pa8255
equ
9000h
;
8255
PA口输出地址
ctl8255
equ
9003h
;
8255
控制口地址
cs0809
equ
08000h
;0809芯片地址
icw1
equ
00010011b
;
单片8259,上升沿中断,要写ICW4
icw2
equ
00100000b
;
中断号为20H
icw4
equ
00000001b
;
工作在8086/88
方式
ocw1
equ
11111110b
;
只响应INT0
中断
cs8259a
equ
0a000h
;
8259偶地址
cs8259b
equ
0a001h
;
8259奇地址
code
segment
assume
cs:code
;中断服务程序
ienter
proc
near
push
ax
push
dx
;cli
mov
dx,cs0809
in
al,dx
;
读入转换结果
mov
dx,pa8255
out
dx,al
mov
al,0
mov
dx,cs0809
out
dx,al
;
启动
A/D转换
;sti
mov
dx,cs8259a
mov
al,20h
;
中断服务程序结束指令
out
dx,al
pop
dx
pop
ax
iret
ienter
endp
;8259初始化程序
iinit
proc
near
mov
dx,cs8259a
mov
al,icw1
out
dx,al
;向偶地址写入命令
mov
dx,cs8259b
mov
al,icw2
out
dx,al
;向奇地址写入中断类型
mov
al,icw4
out
dx,al
;写入工作方式
mov
al,ocw1
out
dx,al
;设置中断屏蔽
ret
iinit
endp
;主程序段
start
proc
near
cli
;关中断
mov
ax,0
mov
ds,ax
mov
al,md8255
mov
dx,ctl8255
out
dx,al
;设置8255工作方式
mov
bx,4*icw2
;中断向量
mov
ax,code
shl
ax,4
;
x
16
add
ax,offset
ienter
;
mov
[bx],ax
;中断服务程序IP
mov
ax,0
inc
bx
inc
bx
mov
[bx],ax
;中断服务程序CS
call
iinit
mov
al,0
mov
dx,cs0809
out
dx,al
;
启动
A/D转换
sti
;开中断
lp:
;
等待中断
nop
jmp
lp
start
endp
code
ends
end
start
篇2:微机原理与接口技术单片机软件报告
微机原理与接口技术单片机软件报告 本文关键词:微机,单片机,接口,原理,报告
微机原理与接口技术单片机软件报告 本文简介:实验报告课程名称:___微机原理与接口技术_指导老师:_____________成绩:__________________实验名称:__单片机软件实验_____一、实验目的和要求(必填)二、实验内容和原理(必填)三、主要仪器设备(必填)四、操作方法和实验步骤五、实验数据记录和处理六、实验结果与分析(
微机原理与接口技术单片机软件报告 本文内容:
实验报告
课程名称:___微机原理与接口技术_指导老师:_____________成绩:__________________
实验名称:__
单片机软件实验
_____
一、实验目的和要求(必填)二、实验内容和原理(必填)
三、主要仪器设备(必填)四、操作方法和实验步骤
五、实验数据记录和处理六、实验结果与分析(必填)
七、讨论、心得
装
订
线
实验一、内存操作
一、
实验目的
a)
掌握数据传送指令;
b)
掌握各种数据传送指令的寻址方式;
c)
熟练运用keil
环境对汇编程序进行调试;
d)
掌握数据传送、复制等程序的设计与调试方法。
二、
实验内容
基础型实验内容
1、
下列程序的功能是给外部RAM8000~80FFH的256个单元的内容赋值,赋值的内容取决于程序中A的赋值。在Keil环境运行该程序,并观察寄存器及内存单元的变化
2、
下列程序将3000H起始的256个字节存储块移动到4000H起始的256个字节存储块,在Keil环境运行如下程序,观察寄存器及存储单元的变化。
设计型实验内容
1、
在keil环境修改内部RAM
30H
~3FH的内容分别为#00H-#0FH,设计程序实现将内部RAM30H-3FH到40H-4FH的数据块拷贝。
2、
在keil环境修改内部RAM
30H
~3FH的内容分别为#00H-#0FH,设计程序实现将片内30H~3FH单元的内容复制到片外1030H~103FH中。
3、
在keil环境修改内部RAM
30H
~3FH的内容分别为#00H-#0FH,设计程序实现将内部RAM30H
~3FH内容逆序拷贝到外部数据XRAM:0000H
~000FH中。使用单步、断点方式调试程序,查看特殊功能寄存器、内部数据RAM、外部数据空间的变化。
三、
实验设备
计算机一台
四、
实验代码
基础型
1、
ORG
0000H
START
EQU
8000H
MAIN:
MOV
DPTR,#START
;起始地址
MOV
R0,#0
;设置256字节计数值
MOV
A,#1H
Loop:
MOVX
@DPTR,A
INC
DPTR
;指向下一个地址
DJNZ
R0,Loop
;计数值减一
NOP
SJMP
$
END
2、
ORG
0000H
MOV
DPTR,#3000H
MOV
A,#01H
MOV
R5,#0
;设置256字节计数值
LOOP:
MOVX
@DPTR,A
INC
DPTR
DJNZ
R5,LOOP
MOV
R0,#30H
MOV
R1,#00H
MOV
R2,#40H
MOV
R3,#00H
MOV
R7,#0
LOOP1:
MOV
DPH,R0
MOV
DPL,R1
;外部地址
MOVX
A,@DPTR
MOV
DPH,R2
MOV
DPL,R3
MOVX
@DPTR,A
INC
R1
INC
R3
DJNZ
R7,LOOP1
SJMP
$
END
设计型
1、
ORG
0000H
MAIN:MOVR2,#10H
;循环次数赋值
MOV
A,#00H
MOVR1,#30H
LOOP1:[email protected],A
INC
R1
INC
A
DJNZ
R2,LOOP1
;计数值减1
MOV
R2,#10H
;循环次数重新赋值
MOVR1,#30H
MOV
R0,#40H
;赋值完成
LOOP2:MOV
A,@R1
[email protected],A
INC
R1
INC
R0
DJNZR2,LOOP2
;拷贝完成
LJMP
1000H
END
2、
ORG
1000H
MAIN:MOV
R2,#10H
;循环次数赋值
MOV
A,#00H
MOV
R1,#30H
LOOP3:MOV
@R1,A
INC
R1
INC
A
DJNZ
R2,LOOP3
;计数值减1
MOV
R2,#10H
;循环次数重新赋值
MOV
DPTR,#1030H
MOV
R1,#30H
;赋值完成
LOOP4:MOV
A,@R1
MOVX
@DPTR,A
INC
R1
INC
DPTR
DJNZ
R2,LOOP4
;拷贝完成
LJMP
2000H
END
3、
ORG
2000H
MAIN:MOV
R2,#10H
;循环次数赋值
MOV
A,#00H
MOV
R1,#30H
LOOP5:MOV
@R1,A
INC
R1
INC
A
DJNZ
R2,LOOP5
;计数值减1
MOV
R2,#10H
;循环次数重新赋值
MOV
R1,#3FH
MOV
DPTR,#0000H
CLR
C
LOOP6:MOV
A,@R1
MOVX
@DPTR,A
DEC
R1
;减一,实现逆序
INC
DPTR
DJNZ
R2,LOOP6
SJMP
$
END
五、
实验结果
基础型
1、
2、
X:3000H
X:4000H
设计型
1、
2、
3、
六、
讨论心得
这次实验主要熟悉了keil环境的使用,简单练习了循环语句、赋值语句、对外部存储器的读取与赋值等,比较基础,主要积累经验。开始认识到代码规范、注释的重要性,以后注意。
实验二、数制与代码转换
一、
实验目的
a)
了解微机系统中的数制与代码表示方法;
b)
掌握计算机中使用的各种代码转换方法;
c)
掌握实现分支、循环的指令及其程序的编写方法;
二、
实验内容
基础型实验内容
1、
以下程序完成单字节的ASCII码到十六进制数转换,完成空白处程序填写,并在Keil环境运行程序,观察寄存器及内存单元的变化。
2、
以下程序完成单字节的BCD码到十六进制数转换,,在Keil环境运行程序,观察寄存器及内存单元的变化。
3、
以下程序将单字节十六进制数A的值转换为十进制数,存放在30H~32H中,完成空白处程序填写,并在Keil环境运行程序,观察寄存器及内存单元的变化。
设计型实验内容
1、
设一串字母的ASCII存于30H起始的单元中,设计程序判断字母是否为大写字母,是则将大写字母的ASCII字符转换成小写字母的ASCII字符,为小写则不转换。
2、
将单字节十六进制数D8H转换为十进制数,存放在30H~33H中。,
3、
设计程序,将十六进制数614EH转换成ASCII码,使用单步、断点方式调试程序,查看结果。
三、
实验设备
计算机一台
四、
实验代码
基础型
1、
RESULT
EQU
30H
ORG
0000H
MOV
A,#41H;“A”的ASCII码
CLR
C
SUBB
A,#37H
;
转换为十六进制
A
MOV
RESULT,A
LJMP
1000H
END
2、
RESULT
EQU
30H
ORG
1000H
MOV
A,#23H
MOV
R0,A
ANL
A,#0F0H
SWAP
A
MOV
B,#0AH
MUL
AB
MOV
RESULT,A
;转换高位
MOV
A,R0
MOV
B,#0FH
ANL
A,B
ADD
A,RESULT
MOV
RESULT,A
;
转换低位
LJMP
2000H
END
3、
RESULT
EQU
30H
ORG
2000H
MOV
A,#7BH
MOV
B,#64H
DIV
AB
MOV
RESULT,A
;除以100得百位数
MOV
A,B
MOV
B,#0AH
DIV
AB
MOV
RESULT+1,A
;除以10得十位数
MOV
RESULT+2,B
;余数为个位数
SJMP
$
END
设计型
1、
ORG
0000H
MOV
R0,#30H
MOV
30H,#41H
MOV
31H,#42H
MOV
32H,#43H
MOV
33H,#61H
MOV
34H,#62H
MOV
35H,#63H
L0:CJNE
@R0,#0,SUB1
LJMP
1000H
SUB1:
ACALL
HASC1
INC
R0
LJMP
L0
ORG
0200H;子程序:将大写字母ASCII码转换为小写字母ASCII码
HASC1:
CJNE
@R0,#41H,L1
;与A的ASCII码比较
MOV
@R0,#61H
RET
L1:
JC
L2
CJNE
@R0,#56H,L3
;与Z的ASCII码比较
MOV
@R0,#75H
RET
L2:RET
L3:JC
L4
RET
L4:MOV
A,@R0
;A与Z之间则转换为小写
ADD
A,#20H
MOV
@R0,A
RET
END
2、
RESULT
EQU
30H
ORG
1000H
MOV
A,#0D8H
MOV
B,#64H
DIV
AB
MOV
RESULT+1,A
;除以100得百位数
MOV
A,B
MOV
B,#0AH
DIV
AB
MOV
RESULT+2,A
;除以10得十位数
MOV
RESULT+3,B
;余数为个位数
LJMP
2000H
END
3、
ORG
2000H
MOV
30H,#61H
MOV
31H,#4EH
MOV
R1,#40H
MOV
R0,#30H
MOV
R2,#2
L5:MOV
A,@R0
MOV
B,#0F0H
ANL
A,B
SWAP
A
ACALL
HASC2
INC
R1
MOV
A,@R0
MOV
B,#0FH
ANL
A,B
ACALL
HASC2;调用子程序:将十六进制数转换为ASCII码
INC
R1
INC
R0
DJNZ
R2,L5
SJMP
$
HASC2:
CJNE
A,#0AH,L6
;与A的十六进制数比较
MOV
@R1,#41H
RET
L6:JC
L7
ADD
A,#37H
;0~9的数字加#37H
MOV
@R1,A
RET
L7:
ADD
A,#30H
;A~F的数字加#30H
MOV
@R1,A
RET
END
五、
实验结果
基础型
1、ASCII码41H为十六进制数0AH
3、
BCD码为23H的十六进制数为17H
3、十六进制数7BH转换为十进制数为123
设计型
1、
给30H及之后的地址赋值ABCabc的ASCII码
将大写字母转换为小写字母
2、将单字节十六进制数
D8H
转换为十进制数,存放在
30H~33H
中
3、十六进制数
614EH存放在30H、31H,转换后的ASCII码在40H到43H
六、
讨论心得
这次实验学习的内容主要是十六进制数、十进制BCD码、ASCII码之间的转换,以及子程序的书写与调用。对于判断是否为十六进制数、大小写字母,主要使用CJNE然后根据C的大小来判断比给定数大还是小,对于判断是否在一个区间需要使用两个CJNE来进行。
10
篇3:接口课设实验报告
接口课设实验报告 本文关键词:接口,实验,报告
接口课设实验报告 本文简介:接口课设实验报告计算机0206班熊兰君(012002013804)一.绪论本实验是一个利用接口硬件平台开发的微机模拟系统,它不仅考查了我们的对接口硬件的掌握和理解程度,同样了锻炼了我们的编程能力。在组长的带领下我们顺利完成了这次实验课设,并收获了很多的相关知识,而且锻炼了我们的团队精神,受益匪浅。二
接口课设实验报告 本文内容:
接口课设实验报告
计算机0206班
熊兰君(012002013804)
一.绪论
本实验是一个利用接口硬件平台开发的微机模拟系统,它不仅考查了我们的对接口硬件的掌握和理解程度,同样了锻炼了我们的编程能力。在组长的带领下我们顺利完成了这次实验课设,并收获了很多的相关知识,而且锻炼了我们的团队精神,受益匪浅。
二.实验目的
掌握接口硬件开发平台的使用方法,利用现有的实验平台和PC机,组成一个微机模拟应用系统;
掌握基本接口电路的综合应用
掌握接口电路的驱动程序和界面软件的设计与编制,学会调试与测试接口软件的一般方法
微机接口技术及接口芯片的综合应用(重点)
三.
实验题目及要求
选课系统
学生通过下位机进行选课,上位机对选课信息进行统计。进入系统需要密码,密码错误或者操作错误时报警。
系统由一个主控机监控和若干个下位机组成,主控机负责数据处理,下位机负责访问接口。
四.
实验内容
这次我们所做的选课系统功能还比较强大,它主要由主控机,下位机,执行部件构成。
1.机实现管理员的功能,界面如下:
主界面主要是方便管理员管理学生基本信息,课程基本信息,选课基本信息。它的功能有:1.增加基本信息;2.删除基本信息;3.查询基本信息。注意,所有的数据信息都存放在Sql
server
数据库上,程序先分析管理员的指令,然后通过ODBC(Open
DataBase
Connecttion)接口操作数据库。另外,主控机程序实现的另一个功能,也就是本程序的核心功能,就是接受下位机的选课信息。当操作员按下“接受选课”按钮后,主控机程序开始接受远程选课信息,接收后会将该信息存入Sql
server
数据库中。
2.下位机是给选课学生的信息窗口,它同时也起到了主控机和执行部件信息传送的作用,而实现这个功能是通过接口实验台上的可编程串行接口芯片8251。
但是选课还是通过执行部件,而不是通过下位机,这一点是十分重要的。以下就下位机的界面:
下位机程序的功能是接受用户选课信息,然后将该信息发送给上位机。需要选课的学生,可以先点击“开始选课”的按钮,然后用拨码开关输入想要选择的功能。
功能1代表选课,功能2代表查询所有课程,功能3表示结束选课。
选功能2后,程序会通过文本框输出所有可供选择的课程的相关信息。选功能1后,程序会一步一步提示用户来操作。这里有两个问题,第一是如果学生输入的密码错误,上位机会发送回代表错误的信息,下位机根据该信息驱动LED显示灯报警;第二,如果学生所选的课程不存在,上位机亦会发送回相应错误代号,下位机根据该代号启动报警程序。
3执行部件由接口实验台上的芯片:可编程的并行I/O接口芯片8255,可编程计数器8253,LED显示灯,手动开关和一个按钮开关组成。它主要做为学生选课的输入和警报提示。
学生通过手动开关拨出用户名密码,还有想选的课程号,按下按钮表示确定。还可以选择查看课程号和课程名。
以上就是本系统的大致功能,当然这只是一个模拟的系统,它实现的功能都很简单。真正要达到实用的阶段,还有很多细节需要完善。但基本的框架,在本系统中已经得到了体现。
五.实施计划及分工
分工如下:首先夏永同学负责整个系统框架的设计,odbc数据源的配置以及界面的设计。吴莎同学和武孟梦同学负责上位机各个功能的实现以及与下位机的通信。我和贾玉芳同学负责下位机各个功能的实现以及硬件连接。同时我们所有人都参与了系统的测试工作。
首先是硬件的连接,按照我们的大概的设计,下位机有一个很重要的的功能,就是反馈执行部件的选择信息,而这项功能除了软件的设计外,最重要的就是硬件连接。对于执行部件与下位机的通信重要是靠可编程并口8255实现的,对于8255我们用到了它的A口进行输出,B口进行输入,C口作为控制口。PA0~PA7依次连接的是实验台上的八个灯,其作用是当用户名和密码不符合主控机中已存的相应的用户名和密码时,这八个灯就会轮回闪烁产生报警的效果。PB0~PB7依次与实验台上八个拨码开关连接,当用户要输入数字信息时,通过这八个开关进行输入(注意这里的数字是用二进制输入而不是八位十进制数字),开始的时候我们将高低位接反了,直接导致整个系统混乱,因为功能项输入错误。PC0口作为SW1的输入口,当SW1按下时,会给PC0一个电平,程序轮询查看,若发现PC0口变为“1”时,就将拨码开关的数字传送给下位机进行处理,所以这里PC0作为控制作用,这里还要注意在连接SW1时,还要经过一个74SL373芯片,这个芯片的OE#口必须和8255的PC4口连接,用PC4口来控制74SL373,当PC4等于“1”时,74SL373关闭,这时SW1就没有任何作用了。还有就是负责双机通信的8251芯片,这里我们用一根连接线将主控机和下位机到26芯插座连接起来进行近距离通信,这个在实验平台已经完成好了,所以不再赘述。控制8251时钟的是8253芯片,它的OUT2端与
8251的
TxC和RxC相连进行控制,
而8253的时钟脉冲端CLK2与1MHZ脉冲信号进行连接,至于它的GATE2与8255的PC6口连接进行脉冲源的控制,以上就是下位机与执行部件的硬件连接。
接下来就是程序的设计了,我们开始用的C语言进行编写,后来因为要进一步完善系统功能,要用到ODBC连接数据库,还有界面的编写就将持续移植到VC上使用C++语言。程序主要实现的功能有:1.将用户名和密码输入并传给主控机进行正确性的判断;2.
当用户选择“1”号功能时,用户可以进行选课,下位机将选课信息(学生号和课程号)传给主控机并存储起来;3.
当用户选择“2”号功能时,用户可以查看选课信息(课程号和课程名);
4.当用户选择“3”功能时,退出选课系统。
这个程序按照功能来划分两大部分,一个是与传送信息有关程序,二者是与界面有关的程序。由于界面相关程序由夏永同学负责,所以这里就不多说了,我们主要负责的是传送信息有关的程序,大概如下:
#define
PORTTALK_TYPE
40001
#define
IOCTL_READ_PORT_UCHAR
/
CTL_CODE(PORTTALK_TYPE,0x904,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define
IOCTL_WRITE_PORT_UCHAR
/
CTL_CODE(PORTTALK_TYPE,0x905,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define
IOCTL_GETINTCODE_PORT_UCHAR
/
CTL_CODE(PORTTALK_TYPE,0x906,METHOD_BUFFERED,FILE_ANY_ACCESS)
unsigned
char
OpenPortTalk(void);
void
ClosePortTalk(void);
void
outportb(unsigned
short
PortAddress,unsigned
char
byte);
unsigned
char
inportb(unsigned
short
PortAddress);portb(unsigned
short
PortAddress);
//myport.cpp
#include
“stdafx.h“#include
“conio.h“#include
“windows.h“#include
#include
“myport.h“HANDLE
PortTalk_Handle
=
NULL;
/*界面相关*/
unsigned
char
OpenPortTalk()
{
PortTalk_Handle
=
CreateFile(“////.//MPNP1“,GENERIC_READ
|
GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(PortTalk_Handle
==
INVALID_HANDLE_VALUE)
{
return
-1;
}
return
0;
}
void
ClosePortTalk()
{
CloseHandle(PortTalk_Handle);
}
void
outportb(unsigned
short
PortAddress,unsigned
char
byte)
/*写字符传到对应地
{
/*址的端口
DWORD
dwError
=
0;
unsigned
int
error;
DWORD
BytesReturned;
unsigned
char
Buffer[3];
/*BUFFER和pBUFFER是传送过程中的
unsigned
char
pBuffer;
/*中间缓冲区
pBuffer
=
(unsigned
char)pBuffer
=
(unsigned
char)PortAddress
Buffer[2]
=
byte;
error
=
DeviceIoControl(PortTalk_Handle,IOCTL_WRITE_PORT_UCHAR,}
unsigned
char
inportb(unsigned
short
PortAddress)
/*读对应地址的端口的信息
{
unsigned
int
error;
DWORD
BytesReturned;
unsigned
char
Buffer[3];
/*BUFFER和pBUFFER是传送过程中的
unsigned
short
pBuffer;
/*中间缓冲区
pBuffer
=
(unsigned
short)pBuffer
=
(unsigned
char)PortAddress
error
=
DeviceIoControl(PortTalk_Handle,IOCTL_READ_PORT_UCHAR,return(Buffer[0]);
}
//
class
CClientDlg
:
public
CDialog
{
public:
CClientDlg(CWnd*
pParent
=
NULL);
void
Init8251(int
state,int
work);
/*初始化8251芯片
void
Trans(int
tran);
/*通过8251芯片传送数值tran
int
Recei();
/*接收发送到8251芯片的数值,便返回该值
void
set_bps(int
bps);
/*设置8253计数器的计数初值
void
sTrans(char
s);
/*传送字符串s
void
sRecei(char
s);
/*接受一个字符串,并存入s中
void
AddSC(int
sid,int
cid);
/*添加一个选课记录
void
sw();
/*检测开关sw1有没有按下,如没有按下,则等待
void
Warning(int
level);
/*当用户名和密码不对时进行报警
enum
{
IDD
=
IDD_SERVER_DIALOG
};
CEditm_Output;
/*系统信息
CStringm_sid;
/*学生信息中的学号信息
CStringm_sname;
/*学生信息中的学生姓名信息
CStringm_password;
/*密码信息
CStringm_cid;
/*课程信息中的课程号信息
CStringm_cname;
/*课程信息中的课程名信息
CStringm_ssid;
/*选课信息中的学生号信息
CStringm_ccid;
/*选课信息中的课程号信息
//}}AFX_DATA
//
ClassWizard
generated
virtual
function
overrides
//{{AFX_VIRTUAL(CServerDlg)
public:
virtual
LRESULT
DisplayMessage(WPARAM
wParam,LPARAM
lParam)
;
protected:
virtual
void
DoDataExchange(CDataExchange*
pDX);//
DDX/DDV
support
//}}AFX_VIRTUAL
protected:
//
Generated
message
map
functions
//{{AFX_MSG(CServerDlg)
virtual
BOOL
OnInitDialog();
afx_msg
void
OnSysCommand(UINT
nID,LPARAM
lParam);
afx_msg
void
OnPaint();
afx_msg
HCURSOR
OnQueryDragIcon();
afx_msg
void
OnDestroy();
afx_msg
void
OnButton1();//查询所有课程
afx_msg
void
OnButton2();//选课
afx_msg
void
OnButton3();//确定
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//
CClientDlg.cpp
#include
“StdAfx.h“#include
“Server.h“#include
“ServerDlg.h“#include
“ServerDlg.h“#include
#define
factor
16
/*波特率因子16
unsigned
long
int
clk
=
1193182;
/*8251输入时钟频率(十六进制表示)
CClientDlg::
CClientDlg
(CWnd*
pParent
)
:
CDialog(CClientDlg::IDD,pParent)
{
//{{AFX_DATA_INIT(CServerDlg)
m_sid
=
_T(““);
m_password
=
_T(““);
m_cid
=
_T(““);
//}}AFX_DATA_INIT
}
//以上是程序面板上文本框对应的变量的定义
void
CClientDlg::DoDataExchange(CDataExchange*
pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CServerDlg)
DDX_Control(pDX,IDC_EDIT1,m_Output);
DDX_Text(pDX,IDC_EDIT2,m_sid);
DDX_Text(pDX,IDC_EDIT4,m_password);
DDX_Text(pDX,IDC_EDIT5,m_cid);
//}}AFX_DATA_MAP
}
//以上是变量与资源的对应关系
BEGIN_MESSAGE_MAP(CServerDlg,CDialog)
//{{AFX_MSG_MAP(CServerDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_BUTTON3,OnButton3)
ON_BN_CLICKED(IDC_BUTTON1,OnButton1)
ON_BN_CLICKED(IDC_BUTTON2,OnButton2)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//以上是消息与按钮对应关系的说明
void
CClientDlg::Init8251(int
state,int
work){
/*8251的初始化*/
outportb(IO_BASE+9,0x0)
;
/*
空操作*/
outportb(IO_BASE+9,0x40)
;
/*
内部复位(使D6=1)*/
outportb(IO_BASE+9,0x4e)
;
/*
方式命令字,,查课本p180*/
outportb(IO_BASE+9,0x27)
;
/*工作命令字,例子p183*/
}
void
CClientDlg::set_bps(int
bps){
/*计数器设置
int
i,sendhigh,sendlow;
i=clk/bps;
i=i/factor;//计算计数初值
sendhigh
=
(i>>8)
sendlow
=
i
outportb(IO_BASE+7,0xb6);
outportb(IO_BASE+6,sendlow);//装计数初值低字节
outportb(IO_BASE+6,sendhigh);//装计数初值高字节
}
void
CClientDlg::Trans(int
tran){//发送字符
int
state;
do
state=inportb(IO_BASE+9);
while(!(state=state
outportb(IO_BASE+8,tran);/*发送字符*/
}
int
CClientDlg::Recei(){//接收字符
int
r,state;
do
state=inportb(IO_BASE+9);
while(!(state=state
r=inportb(IO_BASE+8);/*接收字符*/
return
r;
}
void
CClientDlg::sTrans(char
s){//传送字符串
int
length=strlen(s);
Trans(length);
int
i=0;
for(;i
#include
“myport.h“HANDLE
PortTalk_Handle
=
NULL;
/*
Handle
for
PortTalk
Driver/
unsigned
char
OpenPortTalk()
{
PortTalk_Handle
=
CreateFile(“////.//MPNP1“,GENERIC_READ
|
GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(PortTalk_Handle
==
INVALID_HANDLE_VALUE)
{
return
-1;
}
return
0;
}
void
ClosePortTalk()
{
CloseHandle(PortTalk_Handle);
}
void
outportb(unsigned
short
PortAddress,unsigned
char
byte)
{
DWORD
dwError
=
0;
unsigned
int
error;
DWORD
BytesReturned;
unsigned
char
Buffer[3];
unsigned
char
pBuffer;
pBuffer
=
(unsigned
char)pBuffer
=
(unsigned
char)PortAddress
Buffer[2]
=
byte;
error
=
DeviceIoControl(PortTalk_Handle,IOCTL_WRITE_PORT_UCHAR,}
unsigned
char
inportb(unsigned
short
PortAddress)
{
unsigned
int
error;
DWORD
BytesReturned;
unsigned
char
Buffer[3];
unsigned
short
pBuffer;
pBuffer
=
(unsigned
short)pBuffer
=
(unsigned
char)PortAddress
error
=
DeviceIoControl(PortTalk_Handle,IOCTL_READ_PORT_UCHAR,return(Buffer[0]);
}
//ServerDlg.h
:
class
CServerDlg
:
public
CDialog
{
public:
CServerDlg(CWnd*
pParent
=
NULL);
void
Init8251(int
state,int
work);//初始化8251芯片
void
Trans(int
tran);//通过8251芯片传送数值tran
int
Recei();//接收发送到8251芯片的数值,便返回该值
void
set_bps(int
bps);//设置8253计数器的计数初值
int
getPassword(int
ssid);//返回学号为ssid的同学的密码
int
checkCid(int
ccid);//检查课号为ccid的课程是否存在
void
sTrans(char
s);//传送字符串s
void
sRecei(char
s);//接受一个字符串,并存入s中
void
AddSC(int
sid,int
cid);//添加一个选课记录
enum
{
IDD
=
IDD_SERVER_DIALOG
};
CEditm_Output;
CStringm_sid;
CStringm_sname;
CStringm_password;
CStringm_cid;
CStringm_cname;
CStringm_ssid;
CStringm_ccid;
//}}AFX_DATA
//
ClassWizard
generated
virtual
function
overrides
//{{AFX_VIRTUAL(CServerDlg)
public:
virtual
LRESULT
DisplayMessage(WPARAM
wParam,LPARAM
lParam)
;
protected:
virtual
void
DoDataExchange(CDataExchange*
pDX);//
DDX/DDV
support
//}}AFX_VIRTUAL
protected:
//
Generated
message
map
functions
//{{AFX_MSG(CServerDlg)
virtual
BOOL
OnInitDialog();
afx_msg
void
OnSysCommand(UINT
nID,LPARAM
lParam);
afx_msg
void
OnPaint();
afx_msg
HCURSOR
OnQueryDragIcon();
afx_msg
void
OnDestroy();
afx_msg
void
OnButton3();
afx_msg
void
OnButton1();
afx_msg
void
OnButton2();
afx_msg
void
OnButton5();
afx_msg
void
OnButton4();
afx_msg
void
OnButton6();
afx_msg
void
OnButton7();
afx_msg
void
OnButton11();
afx_msg
void
OnButton12();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//
ServerDlg.cpp
#include
“StdAfx.h“#include
“Server.h“#include
“ServerDlg.h“#include
“ServerDlg.h“#include
#define
factor
16
//波特率因子16
unsigned
long
int
clk
=
1193182;//8251输入时钟频率(十六进制表示)
CServerDlg::CServerDlg(CWnd*
pParent
)
:
CDialog(CServerDlg::IDD,pParent)
{
//{{AFX_DATA_INIT(CServerDlg)
m_sid
=
_T(““);
m_sname
=
_T(““);
m_password
=
_T(““);
m_cid
=
_T(““);
m_cname
=
_T(““);
m_ssid
=
_T(““);
m_ccid
=
_T(““);
//}}AFX_DATA_INIT
}
//以上是程序面板上文本框对应的变量的定义
void
CServerDlg::DoDataExchange(CDataExchange*
pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CServerDlg)
DDX_Control(pDX,IDC_EDIT1,m_Output);
DDX_Text(pDX,IDC_EDIT2,m_sid);
DDX_Text(pDX,IDC_EDIT3,m_sname);
DDX_Text(pDX,IDC_EDIT4,m_password);
DDX_Text(pDX,IDC_EDIT5,m_cid);
DDX_Text(pDX,IDC_EDIT6,m_cname);
DDX_Text(pDX,IDC_EDIT7,m_ssid);
DDX_Text(pDX,IDC_EDIT8,m_ccid);
//}}AFX_DATA_MAP
}
//以上是变量与资源的对应关系
BEGIN_MESSAGE_MAP(CServerDlg,CDialog)
//{{AFX_MSG_MAP(CServerDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_BUTTON3,OnButton3)
ON_BN_CLICKED(IDC_BUTTON1,OnButton1)
ON_BN_CLICKED(IDC_BUTTON2,OnButton2)
ON_BN_CLICKED(IDC_BUTTON5,OnButton5)
ON_BN_CLICKED(IDC_BUTTON4,OnButton4)
ON_BN_CLICKED(IDC_BUTTON6,OnButton6)
ON_BN_CLICKED(IDC_BUTTON7,OnButton7)
ON_BN_CLICKED(IDC_BUTTON11,OnButton11)
ON_BN_CLICKED(IDC_BUTTON12,OnButton12)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//以上是消息与按钮对应关系的说明
void
CServerDlg::Init8251(int
state,int
work){
outportb(IO_BASE+9,0x0)
;
outportb(IO_BASE+9,0x40)
;
outportb(IO_BASE+9,0x4e)
;
outportb(IO_BASE+9,0x27)
;
}
void
CServerDlg::set_bps(int
bps){
int
i,sendhigh,sendlow;
i=clk/bps;
i=i/factor;//计算计数初值
sendhigh
=
(i>>8)
sendlow
=
i
outportb(IO_BASE+7,0xb6);
outportb(IO_BASE+6,sendlow);//装计数初值低字节
outportb(IO_BASE+6,sendhigh);//装计数初值高字节
}
void
CServerDlg::Trans(int
tran){//发送字符
int
state;
do
state=inportb(IO_BASE+9);
while(!(state=state
outportb(IO_BASE+8,tran);/*发送字符*/
}
int
CServerDlg::Recei(){//接收字符
int
r,state;
do
state=inportb(IO_BASE+9);
while(!(state=state
r=inportb(IO_BASE+8);/*接收字符*/
return
r;
}
int
CServerDlg::getPassword(int
ssid){//根据学号ssid查询数据库中该记录的pssword
CDatabase
database;
database.Open(_T(“select“));//数据源名称
CString
temp=““;
int
pass;
CRecordset
recset;
recset.m_pDatabase=
CString
str=““;
CDBVariant
var;
str.Format(“%d“,ssid);
CString
Req=“SELECT
FROM
St
where
sid=“+str+“;“;
str=““;
recset.Open(CRecordset::forwardOnly,Req,CRecordset::readOnly);
if(recset.IsEOF()){
m_Output.ReplaceSel(“用户不存在!“);
return
0;
}else{
m_Output.ReplaceSel(“该用户存在
!/r/n“);
recset.GetFieldValue(“password“,var
);
pass=var.m_iVal;
recset.Close();
return
pass;
}
}
int
CServerDlg::checkCid(int
ccid){
//检查课程号为ccid的课程是否存在
CDatabase
database;
database.Open(_T(“select“));//数据源名称
CString
temp=““;
CRecordset
recset;
recset.m_pDatabase=
CString
str=““;
CDBVariant
var;
str.Format(“%d“,ccid);
CString
Req=“SELECT
FROM
Co
where
cid=“+str+“;“;
str=““;
recset.Open(CRecordse