当前位置:文档之家› 微机原理及其应用 微型计算机温度控制系统设计课程设计报告

微机原理及其应用 微型计算机温度控制系统设计课程设计报告

微机原理及其应用  微型计算机温度控制系统设计课程设计报告
微机原理及其应用  微型计算机温度控制系统设计课程设计报告

创作编号:BG7531400019813488897SX

创作者:别如克*

《微机原理及其应用》课程设计报

2011年3月2日一、课程设计题目及系统功能介绍

微型计算机温度控制系统设计,假设工业现场温度范围为0~75℃,温度值经传感器检测后,经变送器变成0~5V范围内的电压信号。电压信号送A/D转换器ADC0809转换成对应的数字量。数字量经数字滤波后送入CPU作为本次采样值。在LED数码显示器上显示温度值(采用十进制显示),并对温度进行测试和控制,当检测温度到达温度上限60℃时红灯亮,蜂鸣器报警,低于下限30℃时黄灯亮,蜂鸣器报警,以达到监控温度的目的。

本设计采用程序控制方式。

系统功能:每隔0.1秒钟对现场温度连续采集三次取平均值作为本次采样的有效值;判断温度是否高于上限值60℃或低于下限值30℃,如超出该范围则分别用红、黄发光二极

管和报警;把采集来的电压值转化成温度值在LED显示器上显示;若键盘输入“R”则返回DOS,结束程序。

二、硬件设计

系统的硬件工作原理: CPU通过8255查询8253的定时时间是否已到,若到则对8253接口2重新初始化且用ADC0809模/数转换器采样,不到则继续七段数码管显示与LED灯和蜂鸣器的过程,循环以上。

系统框图如下:

地址分配: 8255 288h

8253 280h

ADC0809 298h-29fh

DAC0832 290h

重要芯片功能介绍:

1、可编程并行接口8255

采取工作方式0,输入控制字88h,即A口输出,C口高四位输入,C口低四位输出PA0—PA6对应接七段数码管a b c d e f g接口,PC0 PC1对应七段数码管的位码接口PC2 PC3对应黄红LED灯,PC4接8253计数器2的OUT2端口

2、可编程定时器/计数器(8253)

分别对8253的计数器1和计数器2初始化采用方式3和方式0,使计数器2产生每隔0 .1秒的高电平

3、ADC0809模/数转换器

如图虚线接线即可

3、DAC0832数/模转换器

DAC0832是用于蜂鸣器报警的

三、软件设计

先对硬件8255 8253进行初始化且用ADC0809第一次采样,通过8255的PC4端口查询8253的定时时间是否已到,若到则对8253接口2重新初始化且用ADC0809模/数转换器采样,不到则继续七段数码管显示与LED灯和蜂鸣器的过程,最后若有键按下则返回DOS,否则返回继续查询PC4端口、循环。

创作编号:BG7531400019813488897SX

创作者:别如克*

主程序流程图:

七段数码管流程图

红黄灯及蜂鸣器程序如下:

mov cl,[shuju]

cmp cl,60 ;采样得来的数据与30和60

进行比较,不在它们之间的红黄灯、蜂鸣器报警

jnc li

cmp cl,30

jc xiong

jmp exit

li: or al,08h

call beep

jmp exit

xiong: or al,04h

call beep

exit: mov dx,io8255a ;通过8255C端口输出到LED灯out dx,al

采样子程序

mov bx,0

mov cx,3

xun: mov dx,io0809

out dx,al

push cx

mov cx,0FFH ;延时

delay1: loop delay1

pop cx

in al,dx

mov ah,0

mov dl,5 ;将采样数据转化为0-75之间的温度值

mul dl

mov dl,17

div dl

mov ah,0

add bx,ax ;循环三次取样

loop xun

mov ax,bx

mov cl,3

div cl ;取三次数据后平均值

mov [shuju],al

mov ah,0

mov cl,10

div cl

mov di,offset buffer1 ;将采样三次得出的均值的个位与十位分别存在buffer与buffer+1中

mov [di],ah

mov [di+1],al

四、讨论和感想

首先感受最深的的是汇编的基础一定要扎实,否则很容易出现低级错误,比如说一些死循环之类的东西。

我们这组最开始的时候连硬件检测都没做就直接执行程序,当然做不出什么来的。后来又入入续续发现了一些低级错误,不过都一步步改正了。还有就是主程序一定要简洁易读,最好事先画好流程图。硬件不要频繁初始化,最好是在程序开头就全部初始化完毕,像8255 8253一类。

为保证程序易读、便于添加和修改,必要的注释是很好的,子程序中最好开头和结尾对子程序中用到的寄存器都进行入出栈操作,这能有效的防止一些低级错误。

以上是我碰到的问题及其解决方法、心得体会。

五、源程序的清单:

data segment

ioport equ 0c400h-0280h

io8255a equ ioport+28ah ;8255C口地址

io8255b equ ioport+28bh ;8255控制寄存器地址io8255c equ ioport+288h ;8255A口地址

io0832a equ ioport+290h

io8253a equ ioport+283h ;8253工作方式控制寄存器地址

io8253b equ ioport+281h ;计数器1

io8253c equ ioport+282h ;计数器2

io0809 equ ioport+298h ;蜂鸣器

led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;段码

buffer1 db 0,0 ;存放要显示的十位和个位

bz dw ? ;位码

创作编号:BG7531400019813488897SX

创作者:别如克*

data1 db 80h,0,0,0,0,0,0,0

db 0ffh,0,0,0,0,0,0,0

db 80h,0,0,0,0,0,0,0

db 00h,0,0,0,0,0,0,0 ;红灯正弦波数据

data2 db 80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh

db 0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96h

db 80h,66h,4eh,38h,25h,15h,09h,04h

db 00h,04h,09h,15h,25h,38h,4eh,66h ;黄灯正

弦波数据

shuju db 0 ;存放采样三次后的均值

data ends

code segment

assume cs:code,ds:data

start: mov ax,data

mov ds,ax

mov dx,io8255b ;将8255设为A口输出 C 高4位输入低四位输出

mov al,88h

out dx,al

mov al,70h ;设8253通道1工作方式0

mov dx,io8253a

out dx,al

mov ax,100 ;写入计数器初值2000

mov dx,io8253b

out dx,al

mov al,ah

out dx,al

mov al,0b6h ;设8253通道2工作方式3

mov dx,io8253a

out dx,al

mov ax,1000 ;写入计数器初值500

mov dx,io8253c

out dx,al

mov al,ah

out dx,al

call adcy

panduan: mov dx,io8255a ;从8255的c口输入

in al,dx

and al,10h

jz xianshi ;Pc4不为1跳到显示

call delay

call adcy

xianshi: call qiduan

push ax ;LED灯与蜂鸣器程序段

push cx

push dx

mov cl,[shuju]

cmp cl,60

jnc li

cmp cl,30

jc xiong

jmp exit

li: or al,08h

call beep

jmp exit

xiong: or al,04h

call beep

exit: mov dx,io8255a

out dx,al

pop dx

pop cx

pop ax

mov dx,0ffh

mov ah,06

int 21h

je panduan ;有按键退出否则循环

创作编号:BG7531400019813488897SX

创作者:别如克*

mov ah,4ch ;返回

int 21h

qiduan proc near ;七段数码管子程序

push di

push si

push bx

push cx

push dx

mov di,offset buffer1 ;设di为显示缓冲区loop2: mov bh,02

lll: mov byte ptr bz,bh

push di

dec di

add di, bz

mov bl,[di] ;bl为要显示的数

pop di

mov al,0

mov dx,io8255a

out dx,al

mov bh,0

mov si,offset led ;置led数码表偏移地址为SI

add si,bx ;求出对应的led数码mov al,byte ptr [si]

mov dx,io8255c ;自8255a的口输出

out dx,al

mov al,byte ptr bz ;使相应的数码管亮mov dx,io8255a ;位选变化

out dx,al

mov cx,3000

delay2: loop delay2 ;延时 mov bh,byte ptr bz

shr bh,1

jnz lll

pop dx

pop cx

pop bx

pop si

pop di

ret ;子程序返回qiduan endp

adcy proc near ;AD采样子程序push ax

push bx

push cx

push dx

push di

mov bx,0

mov cx,3

xun: mov dx,io0809

out dx,al

push cx

mov cx,0FFH ;延时

delay1: loop delay1

pop cx

in al,dx

mov ah,0

mov dl,5

mul dl

mov dl,17

div dl

mov ah,0

add bx,ax ;循环三次取样loop xun

mov ax,bx

mov cl,3

div cl ;取三次数据后平均值

mov [shuju],al

mov ah,0

mov cl,10

div cl

mov di,offset buffer1

mov [di],ah

mov [di+1],al

pop di

pop dx

pop cx

pop bx

pop ax

ret

adcy endp

创作编号:BG7531400019813488897SX

创作者:别如克*

delay proc near

push ax ;8253初始化

push dx

mov al,70h ;设8253通道0工作方式0

mov dx,io8253a

out dx,al

mov ax,500 ;写入计数器初值500

mov dx,io8253b

out dx,al

mov al,ah

out dx,al

pop dx

pop ax

ret ;子程序返回

delay endp

beep proc near ;蜂鸣器子程序push cx

push ax

push dx

push si

mov cx,60 ;取60次32个正弦波数据

dd: mov si,0

ooo: mov al,data1[si] ;取正弦波数据

mov dx,io0832a

out dx,al ;放音

push cx

mov cx,6000

delay6: loop delay6 ;软件延时

pop cx

inc si

cmp si,32 ;是否取完32个数据

jl ooo ;若没有,则继续

loop dd ;总循环次数60是否完,没有,则继续

pop si

pop dx

pop ax

pop cx

ret ;子程序返回

相关主题
文本预览
相关文档 最新文档