河北科技大学
《接口技术》课程设计报告
学生姓名: 学 号: 专业班级:
课程名称: 温度采集及显示控制 学年学期:
指导教师:
2 0 16年6 月
课程设计成绩评定表
学生姓名 专业班级 设计题目 课程设计小组验收结果: 硬件设计:优秀□ 良好□ 程序设计:优秀□ 良好□ 实验结果:优秀□ 良好□ 中等□ 中等□ 中等□ 及格□ 及格□ 及格□ 需努力□ 需努力□ 需努力□ 学 号 起止时间 成绩 验 收 内 容 课程设计个人验收结果: 操作能力:优秀□ 良好□ 软件理解:优秀□ 良好□ 硬件理解:优秀□ 良好□ 中等□ 中等□ 中等□ 及格□ 及格□ 及格□ 需努力□ 需努力□ 需努力□ 指导教师: 年 月 日
目 录
一、设计题目„„„„„„„„„„„„„„„„„„„„„„„„1 二、设计目的„„„„„„„„„„„„„„„„„„„„„„„„1 三、设计原理及方案
1、实验方案„„„„„„„„„„„„„„„„„„„„„„„„1 2、D/A转换„„„„„„„„„„„„„„„„„„„„„„„„2 3、A/D转换„„„„„„„„„„„„„„„„„„„„„„„„4 4、8255A„„„„„„„„„„„„„„„„„„„„„„„„„5 5、八段数码管显示„„„„„„„„„„„„„„„„„„„„„7 6、直流点击„„„„„„„„„„„„„„„„„„„„„„„„8 7、键盘„„„„„„„„„„„„„„„„„„„„„„„„„„8 四、实验方法
1、连线图„„„„„„„„„„„„„„„„„„„„„„„„11 2、实验流程图„„„„„„„„„„„„„„„„„„„„„„12 五、实验结果„„„„„„„„„„„„„„„„„„„„„„„„15 六、改进意见及建议„„„„„„„„„„„„„„„„„„„„„15 七、设计体会„„„„„„„„„„„„„„„„„„„„„„„„15 八、附录„„„„„„„„„„„„„„„„„„„„„„„„„„16
一、 设计题目: 温度采集及显示控制 二、 设计目的:
1、根据现有设备(实验箱及计算机)设计出使用接口原理图。
2、利用A/D、D/A转换,实现温度采集及显示控制。 3、实现根据设定温度进行显示控制。 三、 设计原理及方案:
1.实验方案:
本次试验主要用到A/D,D/A转换芯片8255A芯片等,利用电阻来模拟温度的变化方式,利用以下列举的芯片与器材显示输出到七段led译码管显示器上并带动直流电机正转反转以及控制转速来体现温度差。 代码中的变量定义如下:
CS0832 equ 0b000h
DC_P equ 1
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 ; 控制字地址
ADPort equ 0a000h ; AD采样输入片选 CS273 equ 0a000h ; 控制输出片选
UP equ 16h ; Next DOWN equ 15h ; Last LowLimit equ 10 HighLimit equ 30
LowTemp equ -99 ; A/D 0
1
HighTemp equ 99 ; A/D 255
Cool equ 1 ; 致冷控制 Heat equ 2 ; 加热控制
OUTBIT equ 09002h ; 位控制口 OUTSEG equ 09004h ; 段控制口 IN_KEY equ 09001h ; 键盘读入口
LEDBuf db 6 dup(?) ; 显示缓冲 Num db 1 dup(?) ; 显示的数据 DelayT db 1 dup(?)
CurTemp db 1 dup(?) ;当前温度 SetTemp db 1 dup(?) ; 设定温度 PortABuf db 1 dup(?)
2、D/A转换 工作原理
1)、D/A转换是把数字量转换成模拟量的变换,实验台上D/A电路输出的是模拟电压信号。要实现实验要求,比较简单的方法是产生三个波形的表格,然后通过查表来实现波形显示。
2)、产生锯齿波和三角波的表格只需由数字量的增减来控制,同时要注意三角波要分段来产生。
要产生正弦波,较简单的方法是造一张正弦数字量表。即查函数表得到的值转换成十六进制数填表。
D/A转换取值范围为一个周期,采样点越多,精度越高些。 3)、8位D/A转换器的输入数据与输出电压的关系为
U(0∽-5V)=Uref/256×N
U(-5V∽+5V)=2·Uref/256×N-5V (这里 Uref为+5V)
2
本实验的DA转换的作用就是把当前温度和所设定温度的差值转化为模拟量然后驱动直流电机旋转,代码如下:
startMotor proc near
OutLoop:
push dx push ax
mov dx,CS0832 mov al, settemp sub al, curtemp out dx,al
call delay ; 等待电机运转稳定 pop ax pop dx ret
startMotor endp
3
3、A/D转换 工作原理
A/D转换器大致有三类:一是双积分A/D转换器,优点是精度高,抗干扰性好;价格便宜,但速度慢;二是逐次逼近A/D转换器,精度,速度,价格适中;三是并行A/D转换器,速度快,价格也昂贵。
实验用的ADC0809属第二类,是八位A/D转换器。每采集一次一般需100us。本程序是用延时查询方式读入A/D转换结果,也可以用中断方式读入结果,在中断方式下,A/D转换结束后会自动产生EOC信号,将其与CPU的外部中断相接,有兴趣的同学可以试试编程用中断方式读回A/D结果. 原理图如下:
AD转换的作用就是把从电位器读取来的模拟量转为数字量,然后再转为处于以下数字区间的数字:
LowTemp equ -99 ; A/D 0 最低温度 HighTemp equ 99 ; A/D 255 最高温度
其代码如下:
4
ReadAD proc near
mov dx, ADPort mov al, 0 out dx, al
mov al, 100 rr:
dec al ; delay jnz rr
mov dx, ADPort in al, dx ret ReadAD endp
ReadTemp proc near mov bx, 0 mov cl, 16 RLoop:
call ReadAD mov ah, 0 add bx, ax dec cl jnz RLoop
shr bx, 4 mov ax, bx
mov cl, HighTemp - LowTemp mul cl
mov al, ah ; /256 add al, LowTemp mov CurTemp, al ret ReadTemp endp
4、 8255A 工作原理
可编程通用接口芯片8255A有三个八位的并行I/O口,它有三种工作方式。本实验采用的是方式0:PA,PC口输出,PB口输入。很多I/O实验都可以通过8255来实现。
5
8255作为主机与外设的连接芯片,必须提供与主机相连的3个总线接口,即数据线、地址线、控制线接口。同时必须具有与外设连接的接口A、B、C口。由于8255可编程,所以必须具有逻辑控制部分,因而8255内部结构分为3个部分:与CPU连接部分、与外设连接部分、控制部分。 1)与CPU连接部分
根据定义,8255能并行传送8位数据,所以其数据线为8根D0~D7。由于8255具有3个通道A、B、C,所以只要两根地址线就能寻址A、B、C口及控制寄存器,故地址线为两根A0~A1。此外CPU要对8255进行读、写与片选操作,所以控制线为片选、复位、读、写信号。 2)与外设接口部分
根据定义,8255有3个通道A、B、C与外设连接,每个通道又有8根线与外设连接,所以8255可以用24根线与外设连接,若进行开关量控制,则8255可同时控制24路开关。 3)控制器部分
8255将3个通道分为两组,即PA0~PA7与PC4~PC7组成A组,PB0~PB7与PC0~PC3组成B组。如图7.5所示,相应的控制器也分为A组控制器与B组控制器。
4)内部引脚图
6
5、八段数码管显示 1)实验引脚图
2)原理及注意事项
数据总线
段码输出 (0x004H)
位选通信号 (0x002H)
当用PIC5X驱动八段管时,是用I/O方式驱动,所以,驱动方式开关拨到“外驱”方式,PB0~PB7接八段的A~H段,PC0~PC5接G0~G5。当用LPC2103驱动时,用的是模拟总线方式,所以只需将八段管的KEY/LED_CS 片选接到CS0即可。 实验仪中 8位段码输出地址为0X004H,位码输出地址为 0X002H。此处X是由KEY/LED CS 决定。做键盘和LED实验时,需将KEY/LED CS 接到相应的地址译码上。以便用相应的地址来访问。
LEDMAP: ; 八段管显示码
db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h
7
db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h
8255主要用来和LED灯一起使用来造成模拟制冷或制热的效果,如果制冷,黄绿灯亮,如果需要制热,红灯亮,其代码已嵌入到主函数中,这里不再给出。6、直流电机 1)原理图
CS1 D/A变换电路 驱动 D/A 变换 控制电压 霍尔元件 直流电机 CS0 8255 PB.0
2)实验原理
在电压允许范围内,直流电机的转速随着电压的升高而加快,若加上的电压为负电压,则电机会反向旋转。本实验仪的D/A变换可输出-8V到+8V的电压,将电压经驱动后加在直流电机上,使其运转。在电机转盘上安装一个小磁芯,用霍尔元件感应电机转速,用单片机控制8255读回感应脉冲,从而测算出电机的转速。 让电机转速保持一定。若电机转速偏低,则提高输出电压,若电机转速偏高,则降低输出电压。
直流电机需要和“2、D/A转换”联用,代码已在“2、D/A转换”中给出; 7、键盘 1)原理及流程图
8
开始 显示缓冲区初始化 LED显示 否 有键输入?
键值转换为显示数据 是 读取键值 2)原理
实验仪提供了一个6×4的小键盘,向列扫描码地址(0X002H)逐列输出低电平,然后从行码地址(0X001H)读回。如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码为高。这样就可以通过输出的列码和读取的行码来判断按下的是什么键。在判断有键按下后,要有一定的延时,防止键盘抖动。地址中的X是由KEY/LED CS 决定,参见地址译码。做键盘和LED实验时,需将KEY/LED CS 接到相应的地址译码上。以便用相应的地址来访问。例如将KEY/LED CS信号接CS0上,则列扫描地址为08002H,行码地址为08001H。列扫描码还可以分时用作LED的位选通信号。 3)实验定义
KeyTable: ; 键码定义
db 16h, 15h, 14h, 0ffh
9
主程序框图
db 13h, 12h, 11h, 10h db 0dh, 0ch, 0bh, 0ah db 0eh, 03h, 06h, 09h db 0fh, 02h, 05h, 08h db 00h, 01h, 04h, 07h data ends
键盘部分的工作分为两部分
1.检测是否有键按下,如果没有,继续下一次循环,如果有,进入第2步 代码如下:
TestKey proc near
mov dx, OUTBIT mov al, 0
out dx, al ; 输出线置为0 mov dx, IN_KEY
in al, dx ; 读入键状态
not al
and al, 0fh ; 高四位不用 ret TestKey endp
2.如果有键按下,首先取得键值,然后根据键值来判断相应的动作,判断键值的代码在主函数中,取得键值的代码如下:
GetKey proc near
mov ch, 00100000b mov cl, 6 KLoop:
mov dx, OUTBIT
mov al, ch ; 找出键所在列 not al out dx, al shr ch, 1
mov dx, IN_KEY in al, dx not al
and al, 0fh
jne Goon_ ; 该列有键入 dec cl
10
jnz KLoop
mov cl, 0ffh ; 没有键按下, 返回 0ffh jmp Exit1 Goon_:
dec cl
shl cl, 2 ; 键值 = 列 X 4 + 行
mov ch, 4 LoopC:
test al, 1 jnz Exit1 shr al, 1 inc cl dec ch jnz LoopC Exit1:
mov dx, OUTBIT mov al, 0 out dx, al
mov ch, 0
mov bx, offset KeyTable add bx, cx
mov al, [bx] ; 取出键码 mov bl, al
WaitRelease:
mov dx, OUTBIT mov al, 0
out dx, al ; 等键释放
mov ah, 10 call Delay call TestKey jne WaitRelease mov al, bl ret GetKey endp
四、 实现方法(包括实验电路测试、软件调试等)
11
1,连线图:
2,实验流程图:
12
此逻辑主要在主函数中通过调用其它子函数实现,具体代码如下:
Start proc near
mov ax, data mov ds, ax mov al, mode mov dx, CAddr
out dx, al ; 输出控制字
13
mov SetTemp, 20 MLoop:
call TestKey jne KeyPressed
call DisplayResult call DisplayLED call ReadTemp call startMOtor
mov al, SetTemp
cmp CurTemp, al jge GN2
or PortABuf, Heat and PortABuf, not Cool jmp GN4 GN2:
mov al, SetTemp cmp CurTemp, al jle GN3
or PortABuf, Cool and PortABuf, not Heat jmp GN4 GN3:
and PortABuf, not (Cool+Heat) GN4:
mov dx, PortA mov al, PortABuf out dx, al jmp MLoop
KeyPressed:
call GetKey
cmp al, DOWN jne Key0
cmp SetTemp, LowLimit je Key1 dec SetTemp jmp Key1 Key0:
cmp al, UP jne Key1
cmp SetTemp, HighLimit je Key1
14
inc SetTemp Key1:
jmp MLoop
start endp
五、 实施结果:
本实验主要用到A/D,D/A转换芯片8255A芯片等,利用电阻来模拟温度的变化方式并显示输出到七段led译码管显示器上并带动直流电机正转反转以及控制转速来体现温度差。能够根据键盘输入的数据来模拟设定的阈值温度,利用电阻来模拟温度,可以通过调整电阻的值来模拟温度值的变化。并且能随时调节阈值温度,
,温度与键盘键入值差距越大,转速越慢,差距越小转速越快。
当模拟的温度超过阈值电压的时候,电机正转并且led灯红灯亮起,如果低于或者等于阈值电压,电机反转led灯绿灯亮起。显示提示温度的高低。
六、 改进意见及建议:
通过此次实习,本人了解了温度的采集与控制电路的设计,包括了、放大电路、AD转换电路、数码管显示电路、,此设计中的AD转换电路是本设计的精华部分,这种电路在以后也会有许多用处,可以说是受益匪浅。 此次设计还算是比较成功的,没有出现比较大的错误。经过此次的课程设计,对单片机的应用有了更深一步的了解。这对今后的学习以及在以后的工作都会起着很重要的作用,对动手能力的培养也非常的重要,让知识学以致用。 七、 设计体会:
通过本次课程设计,我们巩固了课本学习的知识点,尤其是该课程设计中用到的几个芯片的功能和特点,培养了收集相关资料和整理资料的能力,尤其是熟悉了8255A和转换器。学会了用所学的相关知识来解决实际操作中的困难,很有收
15
获感。在这次的设计过程中,我们的小组成员相互讨论共同完善。感谢指导老师给我们的耐心讲解和热心帮助,这样的机会很难得,我们会很好的去努力,争取做好每一个需要的设计任务。 八、附录: 完整代码 CS0832 equ 0b000h
DC_P equ 1
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 ; 控制字地址
ADPort equ 0a000h ; AD采样输入片选 CS273 equ 0a000h ; 控制输出片选
UP equ 16h ; Next DOWN equ 15h ; Last LowLimit equ 10 HighLimit equ 30
16
LowTemp equ -99 ; A/D 0 HighTemp equ 99 ; A/D 255
Cool equ 1 ; 致冷控制 Heat equ 2 ; 加热控制
OUTBIT equ 09002h ; 位控制口 OUTSEG equ 09004h ; 段控制口 IN_KEY equ 09001h ; 键盘读入口
data segment
LEDBuf db 6 dup(?) ; 显示缓冲 Num db 1 dup(?) ; 显示的数据 DelayT db 1 dup(?) CurTemp db 1 dup(?) SetTemp db 1 dup(?) PortABuf db 1 dup(?)
LEDMAP: ; 八段管显示码 db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h
KeyTable: ; 键码定义
17
db 16h, 15h, 14h, 0ffh db 13h, 12h, 11h, 10h db 0dh, 0ch, 0bh, 0ah db 0eh, 03h, 06h, 09h db 0fh, 02h, 05h, 08h db 00h, 01h, 04h, 07h data ends
code segment
assume cs:code, ds:data
DisplayLED proc near
mov bx, offset LEDBuf
mov cl, 6 ; 共6个八段管 mov ah, 00100000b ; 从左边开始显示 DLoop:
mov dx, OUTBIT mov al, 0
out dx,al ; 关所有八段管 mov al, [bx] mov dx, OUTSEG out dx,al
18
mov dx, OUTBIT mov al, ah
out dx, al ; 显示一位八段管
push ax mov ah, 1 call Delay pop ax
shr ah, 1 inc bx dec cl jnz DLoop
mov dx, OUTBIT mov al, 0
out dx,al ; 关所有八段管 ret DisplayLED endp
TestKey proc near
mov dx, OUTBIT
19
mov al, 0
out dx, al ; 输出线置为0 mov dx, IN_KEY
in al, dx ; 读入键状态
not al
and al, 0fh ; 高四位不用 ret TestKey endp
GetKey proc near
mov ch, 00100000b mov cl, 6 KLoop:
mov dx, OUTBIT
mov al, ch ; 找出键所在列 not al out dx, al shr ch, 1
mov dx, IN_KEY in al, dx not al
20
and al, 0fh
jne Goon_ ; 该列有键入 dec cl jnz KLoop
mov cl, 0ffh ; 没有键按下, 返回 0ffh jmp Exit1 Goon_:
dec cl
shl cl, 2 ; 键值 = 列 X 4 + 行
mov ch, 4 LoopC:
test al, 1 jnz Exit1 shr al, 1 inc cl dec ch jnz LoopC Exit1:
mov dx, OUTBIT mov al, 0 out dx, al
21
mov ch, 0
mov bx, offset KeyTable add bx, cx
mov al, [bx] ; 取出键码 mov bl, al
WaitRelease:
mov dx, OUTBIT mov al, 0
out dx, al ; 等键释放
mov ah, 10 call Delay call TestKey jne WaitRelease mov al, bl ret GetKey endp
; ===================================
DisplayResult proc near
22
mov al, CurTemp test al, 80h jz GE0
mov LEDBuf, 40h ; '-' dec al not al jmp Goon GE0:
mov LEDBuf, 0 ; ' ' Goon:
mov cl, 10 mov ah, 0 div cl
mov bl, al mov bh, 0
add bx, offset LEDMAP mov al, [bx] mov LEDBuf+1, al
mov bl, ah mov bh, 0
23
add bx, offset LEDMAP mov al, [bx] mov LEDBuf+2, al mov LEDBuf+3, 0 ; ' ' mov al, SetTemp mov ah, 0 mov cl, 10 div cl mov bl, al mov bh, 0
add bx, offset LEDMAP mov al, [bx] mov LEDBuf+4, al mov bl, ah mov bh, 0
add bx, offset LEDMAP mov al, [bx] mov LEDBuf+5, al 24
ret DisplayResult endp
Delay ss1:
Delay
proc near
push ax push cx mov ah, 01 mov al, 0 mov cx,ax push cx pop cx dec cx jnz ss1 pop cx pop ax ret endp ; 延时子程序25
startMotor proc near OutLoop: push dx push ax
mov dx,CS0832 mov al, settemp sub al, curtemp
;mov al,SetTemp - CurTemp out dx,al
call delay 定 ; 读取时间 pop ax pop dx ret startMotor endp ReadAD proc near mov dx, ADPort mov al, 0 out dx, al
26
等待电机运转稳 ;
mov al, 100 rr:
dec al ; delay jnz rr
mov dx, ADPort in al, dx ret ReadAD endp
ReadTemp proc near mov bx, 0 mov cl, 16 RLoop:
call ReadAD mov ah, 0 add bx, ax dec cl jnz RLoop
shr bx, 4 mov ax, bx
mov cl, HighTemp - LowTemp
27
mul cl
mov al, ah ; /256 add al, LowTemp mov CurTemp, al ret ReadTemp endp
Start proc near mov ax, data mov ds, ax mov al, mode mov dx, CAddr
out dx, al ; 输出控制字 mov SetTemp, 20 MLoop:
call TestKey jne KeyPressed
call DisplayResult call DisplayLED call ReadTemp call startMOtor
28
mov al, SetTemp
cmp CurTemp, al jge GN2
or PortABuf, Heat and jmp GN2:
mov cmp jle or and jmp GN3:
and GN4:
mov mov out jmp
KeyPressed:
PortABuf, not Cool GN4 al, SetTemp CurTemp, al GN3
PortABuf, Cool PortABuf, not Heat GN4 PortABuf, not (Cool+Heat) dx, PortA al, PortABuf dx, al MLoop 29
call GetKey
cmp al, DOWN jne Key0
cmp SetTemp, LowLimit je Key1 dec SetTemp jmp Key1 Key0:
cmp al, UP jne Key1
cmp SetTemp, je Key1 inc SetTemp Key1:
jmp MLoop
start endp code ends end start
HighLimit 30
31
因篇幅问题不能全部显示,请点此查看更多更全内容