《数字式温度计系统设计》
课程设计
姓名: 许红升 专业: 通信工程 学号: P01214179 性别: 男 邮箱: [email protected] 联系方式: [1**********] 指导老师: 李斌 张宏伟
一、最终要实现的设计要求(或摘要)
1、以微机系统作为主控,利用并行输入输出接口芯片对温度计的控制时序进行模拟,实现温度采集、处理、数据显示等功能。
2、为了充分理解温度计DS18B20的控制时序并实现正确的时序模拟,前期先用自己较为熟悉的MC9S128XS128单片机作为微控制器,采集温度数据,并显示在高精度OLED 上。为后期用微机系统采集温度打好基础。
3、比较用微机系统与单片机作为主控进行温度采集的相同点和不同点。
二、内容设计(方法论) 1、硬件电路(微机系统) 1.1硬件电路方案论证
⏹ 方案一
由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用微机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。 ⏹ 方案二
由于现在市场上有很多集成的温度传感器,有模拟温度传感器,如AD590,也有数字式温度传感器,如DS18B20。DS18B20采用单总线协议,内部集成了较高精度的A/D转换器,采用数字量输出。
通过比较以上两种方案,并从简化外围电路以及保证较高精度的角度出发,最终确定方案二,即采用数字式温度传感器DS18B2O 。
1.2硬件框图
硬件电路总体框图如下。主控采用8086微机系统,温度计采用数字式的DS18B20,通过并行输入输出接口芯片8255对温度计的时序进行模拟,将采集到的数据显示在七段数码管上。
图1、硬件框图
1.3电路原理图
本设计涉及的电路有温度测量/控制电路、8255接口电路、LED 控制电路、数码管显示电路等。采用Altium designer绘制部分电路原理图如下:
图2、温度测量/控制电路原理图
图3、数码管显示电路
图4、8279键盘/LED控制器
2、软件设计(微机系统)
2.1程序设计思路
控制程序设计思路说明:本程序主要功能分为初始化、读温度量、写操作及LED 的显示输出。 初始化主要实现写8255方式控制字,设置控制字为89h ,, 即10001001,8255芯片工作于方式0,PA 口作输出段选, PB 口作输出位选,PC 口作为输入。 然后向DS18B20发送读温度指令,准备读温度前先复位,跳过ROM 匹配,发出读温度命令,调用读18B20子程序, 先读低8位再读高8位,读出转换后的温度值存在AX 中。再调用显示子程序,将温度值显示出来。实现二进制到十六进制数字型码的转化主要通过二进制数从段选码中查表找出相应的字型码并从8255中送出在LED 显示器中显示。
2.2软件流程图
2.2.1主程序流程图
2.2.2读DS18B20子程序
由于DS18B20采用的是单总线协议,为了读取到DS18B20的内部数据,在查阅DS18B20的数据手册里描述的控制时序,汇编程序中利用8255对控制时序进行模拟。为了正常模拟时序,延时语句显得非常重要,这直接决定所编写的时序是否符合DS18B20的单总线协议的要求。程序流程图如下:
图6、读DS18B20程序流程
3、硬件电路(单片机)
3.1、MC9S12XS128介绍及电路原理图
因为之前参加比赛的过程中学习过几款单片机,如8位的51单片机、飞思卡尔公司的16位MC9S12XS18和32位的MK60DN512LL10、microchip 公司的8位PIC 单片机。这几款单片机各有特点,其中我更倾向于使用16位的MC9S12XS128微控制器。该款单片机相比51单片机,不仅有更高的处理速度以及更多的双向I/O口,同时内部集成了很多接口电路,如A\D转换器,IIC 、SPI 、CAN 总线等。下面为MC9S12XS128的封装图:
图7、MC9S12XS128封装(112LQFP )
为了更快的熟悉DS18B20的功能和使用方法,在课程设计前期我采用MC9S12XS128单片机作为主控,并搭建相关外围电路,如高精度的OLED 的显示电路。下面为部分电路原理图:
图8、MC9S12XS128核心板
图9、DS18B20温度采集电路
图10、高精度OLED 与MC9S12XS128的连接图
3.2、OLED 简介
OLED ,即有机发光二极管(Organic Light-Emitting Diode),又称
为有机电激光显示(Organic Electroluminesence Display, OELD)。因为具备轻薄、省电等特性,因此从 2003 年开始,这种显示设备在 MP3播放器上得到了广泛应用,而对于同属数码类产品的 DC 与手机,此前只是在一些展会上展示过采用 OLED 屏幕的工程样品。自 2007 年后,寿命得到很大提高,具备了许多 LCD 不可比拟的优势。 下面为OLED 的外观图:
图11、OLED 外观图
4、开发环境(单片机)
以IAR System公司的IAR for ARM 为开发环境,该IDE 适用很多半导体
厂商的上百种微控制器、微处理器等,具有友好的设计界面,集成了编辑器、编译器、模拟器等。软件界面如下:
图12、IAR 界面
5、测试结果图(单片机)
图13、测试结果
三、设计说明
微机系统设计部分所使用的系统资源介绍如下:
1、8086微处理器及其体系结构
1.1、8086微处理器的一般性能特点
(1) 16位的内部结构,16位双向数据信号线;
(2)20位地址信号线,可寻址1M 字节存储单元;
(3)较强的指令系统;
(4)利用第16位的地址总线来进行I/O端口寻址,可寻址64K 个I/O端口;
(5)中断功能强,可处理内部软件中断和外部中断,中断源可达256个;
(6)单一的+5V 电源,单相时钟5MHz 。
另外,Intel 公司同期推出的Intel8088微处理器一种准16位微处理器,其内部寄存器,内部操作等均按16位处理器设计,与Intel8088微处理器基本上相同,不同的是其对外数据线只有8位,目的是为了方便地与8位I/O接口芯片相兼容。
1.2、8086CPU 的编程结构
编程结构:是指从程序员和使用者的角度看到的结构,亦可称为功能结构。从功能上来看,8086CPU 可分为两部分,即总线接口部件BIU (Bus Interface Unit)和执行部件EU (Execution Unit)。8086CPU 的内部功能结构如图14所示:
图14、8086CPU 内部功能结构图
1.3、8086CPU 引脚图
8086CPU 采用40条引脚的双列直插(DIP )封装,如图15所示,由于有16条数据总线,20条地址总线,一些引脚必须分时复用。
图15、8086CPU 引脚图
2、并行输入输出接口芯片8255
2.1、8086的可编程外设接口电路
8255的数据口D0-D7与CPU 的6根控制线相连接,控制8255A 内部的各种操作。控制线RESET 用来使8255A 复位。CS 和地址线A1及A0用于芯片选择和通道寻址。分别与8086的高位地址线A19,A1,A0相连接。
图16、 8086的可编程外设接口电路
2.2、8255A 并行I\O接口
8255A 芯片内包含有3个8位的端口,它们是A 口,B 口和C 口。这3个端口均可作为CPU 与外设通讯时的缓冲器或锁存器,当需要“状态”或“联络”信号时,C 口可以提供,此时,将C 口的高4位为A 口所用,C 口的低4位为B 口所用。3个端口通过各自的输入/输出线与外设联系。
并行输入/输出端口:
一个并行输入/输出的LSI 芯片,多功能的I/O器件,可作为CPU 总线与外围的接口。具有24个可编程设置的I/O口,即使3组8位的I/O口为PA 口,PB 口和PC 口。它们又可分为两组12位的I/O口,A 组包括A 口及C 口(高4位,PC4~PC7),B 组包括B 口及C 口(低4位,PC0~PC3)。A 组可设置为基本的I/O口,闪控(STROBE)的I/O闪控式,双向I/O3种模式;B 组只能设置为基本I/O或闪控式I/O两种模式,而这些操作模式完全由控制寄存器的控制字决定。 8255引脚功能:
①RESET:复位输入线,当该输入端处于高电平时,所有内部寄存器(包括控制寄存器)均被 清除,所有I/O口均被置成输入方式。
②CS:芯片选择信号线,当这个输入引脚为低电平时,即CS=0时,表示芯片被选中,允许8255与CPU 进行通讯;CS=1时,8255无法与CPU 做数据传输。 ③RD:读信号线,当这个输入引脚为低电平时,即RD=0且CS=0时,允许8255通过数据总线向CPU 发送数据或状态信息,即CPU 从8255读取信息或数据。 WR:写入信号,当这个输入引脚为低电平时,即WR=0且CS=0时,允许CPU 将数据或控制字写入8255。
④D0~D7:三态双向数据总线,8255与CPU 数据传送的通道,当CPU 执行输入输出指令时,通过它实现8位数据的读/写操作,控制字和状态信息也通过数据总线传送。
⑤PA0~PA7:端口A 输入输出线,一个8位的数据输出锁存器/缓冲器, 一个8位的数据输入锁存器。PB0~PB7:端口B 输入输出线,一个8位的I/O锁存器, 一个8位的输入输出缓冲器。
⑥ PC0~PC7:端口C 输入输出线,一个8位的数据输出锁存器/缓冲器, 一个8位的数据输入缓冲器。端口C 可以通过工作方式设定而分成2个4位的端口, 每个4位的端口包含一个4位的锁存器,分别与端口A 和端口B 配合使用,可作
为控制信号输出或状态信号输入端口。
⑦A0、A1:地址选择线,用来选择8255的PA 口,PB 口,PC 口和控制寄存器。 当A0=0,A1=0时,PA 口被选择;
当A0=0,A1=1时,PB 口被选择;
当A0=1,A1=0时,PC 口被选择;
当A0=1。A1=1时,控制寄存器被选择。
3、温度传感器
3.1、DS18B20简介
DALLAS 最新单线数字温度传感器DS18B20是一种新型的“一线器件”,其体积更小、更适用于多种场合、且适用电压更宽、更经济。DALLAS 半导体公司的数字化温度传感器DS18B20是世界上第一片支持“一线总线”接口的温度传感器。温度测量范围为-55~+125 摄氏度,可编程为9位~12 位转换精度,测温分辨率可达0.0625摄氏度,分辨率设定参数以及用户设定的报警温度存储在EEPROM 中,掉电后依然保存。被测温度用符号扩展的16位数字量方式串行输出;多个DS18B20可以并联到3 根或2 根线上,CPU 只需一根端口线就能与诸多DS18B20 通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。
表1、 DS18B20分辩率的定义规定
由表1可见,DS18B20温度转换的时间比较长,而且设定的分辩率越高,所需要的温度数据转换时间就越长。因此,在实际应用中要将分辩率和转换时间权衡考虑。
3.2、DS18B20内部框图
图17、DS18B20内部框图
DS18B20依靠一个单总线端口通讯。在单线端口条件下,必须先建立ROM 操作协议,才能进行存储器和控制操作。因此,控制器必须首先提供下面5个ROM 操作命令之一:1)读ROM ,2)匹配ROM ,3)搜索ROM ,4)跳过ROM ,
5)报警搜索。这些命令对每个期间的激光ROM 部分进行操作,在单总线上挂有多个器件时,同时可以向总线控制器指明有多少个器件或是什么型号的器件。成功执行完一条ROM 操作序列后,即可进行存储器和控制操作,控制器可以提供6条存储器和控制操作指令中的任一条。
一条控制操作命令指示DS18B20完成一次温度测量。测量结果放在DS18B20的暂存器里,用一条读暂存器内容的存储器操作命令可以把暂存器中数据读出。温度报警触发器TH 和TL 各有一个EEPROM 字节构成。如果没有对DS18B20使用报警搜索命令,这些寄存器可以作为一般用途的用户存储器使用。可以用一条存储器操作命令对TH 和TL 进行写入,这些寄存器的读出需要通过暂存器。所有数据都是以最低有效位在前面的方式进行读写。
3.3、DS18B20读写时序
图18、DS18B20读写时序
四、可提炼的可验证性数据
本次课程设计微机系统设计部分主要以实验室的微机原理及接口技术试验箱为平台。在硬件电路调试过程中,利用示波器来测试相关波形是否正确;调试程序时,利用星研集成开发环境集成的模拟调试器对程序进行调试。经过几天的努力,最终完成了整个数字温度计微机系统设计任务。
1、实验效果图
2、示波器调试
五、最终结论
课程设计的这几天里,经过查阅资料、方案选择、设计电路、编写汇编程序、调试电路、软件调试,最终将数字式温度计的微机系统设计任务完成了。整个系统能实时地读取当前的温度,并显示在数码管上。
六、小结
和以前的所有课程设计不同的是,这是我第一次利用微机进行系统设计,从以前使用C 语言进行程序设计到这次的利用汇编语言编写程序,使我们从中学会了很多知识。本次课程设计使我们学会了微机原理、汇编程序编写和对其他器件的认识。在课设过程中,我们不仅认识到了微机系统的构架,而且通过不断查阅相关资料,学会了微机的应用。可以说,通过这次微机系统的实践学习,我们学到了很多,而且对微机的有关知识以及其在现实生活中的多方面应用有了更深层次的认识,这对于我们以后的学习和步入社会后参加工作都有很大的帮助。
在此次课程设计的进程中,我遇到了很多问题,例如,一开始我们在确定课设题目后,不知道怎么把温度显示在数码管上,用什么元件来采集温度,
还有微
机该如何控制DS18B20;对新器件DS18B20智能测温的相关知识我们很模糊甚至可以说一无所知,不过后来,我们通过查找一些相关的资料书以及寻求基地同学的帮助,终于用Altium designer将原理图绘制出来以及写出正确的程序。在仿真时,由于我们有了之前的数模电课设仿真经验,所以此时我们课设进行的很顺利,并没有受到什么大的阻碍。
通过此次微机课程设计,从找资料到原理图的绘制再到去实验室做板,我们明白了很多,理论指导实践,但是理论也需要实践给予证明,凡事都要通过自己的思考推敲和动手去做,否则自己不会取的大的进步。而且在平时的学习生活中应该多和周围的同学相互学习,交流经验,遇到不会的东西时,切忌焦躁,首先要经过自己的独立思考,有了一定想法后,可以去查找相关的资料书刊或者找同学讨论,如果实在解释不了,再去找辅导老师,在这个遇到问题解决问题的过程中,不断加强自我的动脑能力,进而去指导动手能力,也只有这样,你才能学到真正的知识!
附录1、微机系统汇编程序
assume cs:code,ds:_data,ss:_stack
mov ax,_data
mov ds,ax
mov es,ax
nop
call init8255
main:call start_temperature
jb main
call delaytime
call rd_temperature
call dis_bcd
jmp main
dis_bcd proc near
mov bx,ax
lea di,buffer+7
std
mov al,10h
stosb
stosb
stosb
stosb
test ah,08h jnz dis_bcd1 stosb
jmp dis_bcd2 dis_bcd1: mov al,11h stosb
neg bx dis_bcd2:
shl bx,1 shl bx,1 shl bx,1 shl bx,1 mov ax,10 xchg al,bh div bh cmp al,0 jnz dis_bcd3 mov al,10h xchg al,[di+1] stosb
jmp dis_bcd4 dis_bcd3:stosb dis_bcd4:mov al,ah or al,80h stosb
xor al,al test bl,10h jz dis_bcd5 mov al,6
dis_bcd5:test bl,20h jz dis_bcd6 add al,12h daa
dis_bcd6:test bl,40h jz dis_bcd7 add al,25h daa
dis_bcd7:test bl,40h jz dis_bcd8 add al,50h daa
dis_bcd8:mov cl,4 ror al,cl and al,0fh
stosb
cld
lea si,buffer call display8 ret
dis_bcd endp
delaytime proc near xor cx,cx loop $ loop $ loop $ ret
delaytime endp w_l proc near push ax
mov dx,con_8255 mov al,80h out dx,al pop ax ret
w_l endp
w_h proc near push ax
mov dx,con_8255 mov al,01h out dx,al pop ax ret
w_h endp
init_18b20 proc near call w_l mov cx,136 loop $
mov dx,con_8255 mov ax,89h out dx,al dec dx dec dx mov cx,15
init_18b20_1:in al,dx test al,01h
jz init_18b20_2 loop init_18b20_1 stc
ret
init_18b20_2:mov cx,136
loop $
clc
ret
init_18b20 endp
write_18b20 proc near
mov cx,8
wri:push ax
mov dx,con_8255
mov al,80h
out dx,al
pop ax
ror al,1
jnb wri1
push ax
mov dx,con_8255
mov al,01h
out dx,al
pop ax
wri2:push cx
mov cx,7
loop $
pop cx
call w_h
loop wri
ret
wri1:push cx
nop
pop cx
jmp wri2
write_18b20 endp
read_18b20 proc near
mov cx,8
read:mov dx,con_8255
mov al,80h
out dx,al
mov al,89h
out dx,al
nop
nop
nop
nop
nop
mov dx,pc_8255
in al,dx
ror al,1
rcr bl,1
push cx
mov cx,11
loop $
pop cx
loop read
mov al,bl
ret
read_18b20 endp
start_temperature:
call init_18b20
jb get_t
mov al,0cch
call write_18b20
mov al,44h
call write_18b20
clc
get_t:ret
rd_temperature:call init_18b20
mov al,0cch
call write_18b20
mov al,0beh
call write_18b20
call read_18b20
mov ah,al
call read_18B20
xchg al,ah
ret
init8255 proc near
mov dx,con_8255
mov al,80h
out dx,al
dec dx
dec dx
mov al,0ffh
out dx,al
ret
init8255 endp
start endp
code ends
end start
附录2、单片机C 语言程序(部分)
/********************************************
MC9S12XS128温度采集程序
------------------------------------
Code Warrior 5.0/1
Target : MC9S12XS128
Crystal: 16.000Mhz
busclock:16.000MHz
pllclock:32.000MHz
使用说明:
OLED 电源使用3.3V 。
----------------
G 电源地
3.3V 接3.3V 电源
D0 PORTA_PA0
D1 PORTA_PA1
RST PORTA_PA2
DC PORTA_PA3
CS 已接地,不用接
============================================
OLED 电源使用5V 。
----------------
G 电源地
3.3V 接5V 电源,电源跟模块之间串接100欧姆电阻,并加3.3V 钳位二极管
D0 PORTA_PA0 单片机跟模块之间串接1k-3.3k 电阻
D1 PORTA_PA1 单片机跟模块之间串接1k-3.3k 电阻
RST PORTA_PA2 单片机跟模块之间串接1k-3.3k 电阻
DC PORTA_PA3 单片机跟模块之间串接1k-3.3k 电阻
CS 已接地,不用接
============================================
如果用户使用的是5V 单片机,请看用户手册,切勿烧毁模块!
============================================*/
#include "derivative.h"
#include
#include
#include "LQ12864.h"
// PLL初始化子程序 BUS Clock=16M
void SetBusCLK_16M(void)
{
CLKSEL=0X00; // disengage PLL to system
PLLCTL_PLLON=1; // turn on PLL
SYNR=0x00 | 0x01; // VCOFRQ[7:6];SYNDIV[5:0]
// fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1)
// fPLL= fVCO/(2 × POSTDIV)
// fBUS= fPLL/2
// VCOCLK Frequency Ranges VCOFRQ[7:6]
// 32MHz
// 48MHz
// Reserved 10
// 80MHz
REFDV=0x80 | 0x01; // REFFRQ[7:6];REFDIV[5:0]
// fREF=fOSC/(REFDIV + 1)
// REFCLK Frequency Ranges REFFRQ[7:6]
// 1MHz
// 2MHz
// 6MHz
// fREF > 12MHz 11 // pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;
POSTDIV=0x00; // 4:0, fPLL= fVCO/(2xPOSTDIV)
// If POSTDIV = $00 then fPLL is identical to fVCO
(divide by one).
_asm(nop); // BUS CLOCK=16M
_asm(nop);
while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it;
CLKSEL_PLLSEL =1; //engage PLL to system;
}
void Dly_ms(int ms)
{
int ii,jj;
if (ms
for(ii=0;ii
for(jj=0;jj
//for(jj=0;jj
//for(jj=0;jj
}
//============================MAIN()==========================
=
/*********************主函数************************************/
void main(void)
{
byte i=0;
SetBusCLK_16M();
DDRB=0XFF;
DDRA=0XFF;
PORTB=0XFF;
LCD_Init();
DisableInterrupts;
for(;;)
{
LCD_Fill(0xff);//黑屏
Dly_ms(1000);
LCD_Fill(0x00);//亮屏
Dly_ms(1000);
LCD_Print(8,0,"北京龙丘智能科技"); //汉字字符串显示 LCD_Print(15,2,"智能车首选液晶"); //汉字字符串显示 LCD_P8x16Str(48,4,"OLED"); //英文字符串显示 LCD_P6x8Str(16,6,"[email protected]");//英文字符串显示 LCD_P6x8Str(34,7,"2011-09-03"); //英文字符串显示 Dly_ms(2000);
LCD_CLS(); //清屏 Draw_BMP(16,0,112,7,longqiu96x64); //图片显示 Dly_ms(2000);
/*
for(i=0;i
{
LCD_CLS();
Draw_BMP(i,0,i+96,7,longqiu96x64);
Dly_ms(300);
LED4=~ LED4;
}
for(i=32;i>1;i-=2)
{
LCD_CLS();
Draw_BMP(i,0,i+96,7,longqiu96x64);
Dly_ms(300);
LED1=~ LED1;
}
*/
Dly_ms(500);
PORTB_PB7=~ PORTB_PB7;
}
/* please make sure that you never leave main */
}
《数字式温度计系统设计》
课程设计
姓名: 许红升 专业: 通信工程 学号: P01214179 性别: 男 邮箱: [email protected] 联系方式: [1**********] 指导老师: 李斌 张宏伟
一、最终要实现的设计要求(或摘要)
1、以微机系统作为主控,利用并行输入输出接口芯片对温度计的控制时序进行模拟,实现温度采集、处理、数据显示等功能。
2、为了充分理解温度计DS18B20的控制时序并实现正确的时序模拟,前期先用自己较为熟悉的MC9S128XS128单片机作为微控制器,采集温度数据,并显示在高精度OLED 上。为后期用微机系统采集温度打好基础。
3、比较用微机系统与单片机作为主控进行温度采集的相同点和不同点。
二、内容设计(方法论) 1、硬件电路(微机系统) 1.1硬件电路方案论证
⏹ 方案一
由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用微机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。 ⏹ 方案二
由于现在市场上有很多集成的温度传感器,有模拟温度传感器,如AD590,也有数字式温度传感器,如DS18B20。DS18B20采用单总线协议,内部集成了较高精度的A/D转换器,采用数字量输出。
通过比较以上两种方案,并从简化外围电路以及保证较高精度的角度出发,最终确定方案二,即采用数字式温度传感器DS18B2O 。
1.2硬件框图
硬件电路总体框图如下。主控采用8086微机系统,温度计采用数字式的DS18B20,通过并行输入输出接口芯片8255对温度计的时序进行模拟,将采集到的数据显示在七段数码管上。
图1、硬件框图
1.3电路原理图
本设计涉及的电路有温度测量/控制电路、8255接口电路、LED 控制电路、数码管显示电路等。采用Altium designer绘制部分电路原理图如下:
图2、温度测量/控制电路原理图
图3、数码管显示电路
图4、8279键盘/LED控制器
2、软件设计(微机系统)
2.1程序设计思路
控制程序设计思路说明:本程序主要功能分为初始化、读温度量、写操作及LED 的显示输出。 初始化主要实现写8255方式控制字,设置控制字为89h ,, 即10001001,8255芯片工作于方式0,PA 口作输出段选, PB 口作输出位选,PC 口作为输入。 然后向DS18B20发送读温度指令,准备读温度前先复位,跳过ROM 匹配,发出读温度命令,调用读18B20子程序, 先读低8位再读高8位,读出转换后的温度值存在AX 中。再调用显示子程序,将温度值显示出来。实现二进制到十六进制数字型码的转化主要通过二进制数从段选码中查表找出相应的字型码并从8255中送出在LED 显示器中显示。
2.2软件流程图
2.2.1主程序流程图
2.2.2读DS18B20子程序
由于DS18B20采用的是单总线协议,为了读取到DS18B20的内部数据,在查阅DS18B20的数据手册里描述的控制时序,汇编程序中利用8255对控制时序进行模拟。为了正常模拟时序,延时语句显得非常重要,这直接决定所编写的时序是否符合DS18B20的单总线协议的要求。程序流程图如下:
图6、读DS18B20程序流程
3、硬件电路(单片机)
3.1、MC9S12XS128介绍及电路原理图
因为之前参加比赛的过程中学习过几款单片机,如8位的51单片机、飞思卡尔公司的16位MC9S12XS18和32位的MK60DN512LL10、microchip 公司的8位PIC 单片机。这几款单片机各有特点,其中我更倾向于使用16位的MC9S12XS128微控制器。该款单片机相比51单片机,不仅有更高的处理速度以及更多的双向I/O口,同时内部集成了很多接口电路,如A\D转换器,IIC 、SPI 、CAN 总线等。下面为MC9S12XS128的封装图:
图7、MC9S12XS128封装(112LQFP )
为了更快的熟悉DS18B20的功能和使用方法,在课程设计前期我采用MC9S12XS128单片机作为主控,并搭建相关外围电路,如高精度的OLED 的显示电路。下面为部分电路原理图:
图8、MC9S12XS128核心板
图9、DS18B20温度采集电路
图10、高精度OLED 与MC9S12XS128的连接图
3.2、OLED 简介
OLED ,即有机发光二极管(Organic Light-Emitting Diode),又称
为有机电激光显示(Organic Electroluminesence Display, OELD)。因为具备轻薄、省电等特性,因此从 2003 年开始,这种显示设备在 MP3播放器上得到了广泛应用,而对于同属数码类产品的 DC 与手机,此前只是在一些展会上展示过采用 OLED 屏幕的工程样品。自 2007 年后,寿命得到很大提高,具备了许多 LCD 不可比拟的优势。 下面为OLED 的外观图:
图11、OLED 外观图
4、开发环境(单片机)
以IAR System公司的IAR for ARM 为开发环境,该IDE 适用很多半导体
厂商的上百种微控制器、微处理器等,具有友好的设计界面,集成了编辑器、编译器、模拟器等。软件界面如下:
图12、IAR 界面
5、测试结果图(单片机)
图13、测试结果
三、设计说明
微机系统设计部分所使用的系统资源介绍如下:
1、8086微处理器及其体系结构
1.1、8086微处理器的一般性能特点
(1) 16位的内部结构,16位双向数据信号线;
(2)20位地址信号线,可寻址1M 字节存储单元;
(3)较强的指令系统;
(4)利用第16位的地址总线来进行I/O端口寻址,可寻址64K 个I/O端口;
(5)中断功能强,可处理内部软件中断和外部中断,中断源可达256个;
(6)单一的+5V 电源,单相时钟5MHz 。
另外,Intel 公司同期推出的Intel8088微处理器一种准16位微处理器,其内部寄存器,内部操作等均按16位处理器设计,与Intel8088微处理器基本上相同,不同的是其对外数据线只有8位,目的是为了方便地与8位I/O接口芯片相兼容。
1.2、8086CPU 的编程结构
编程结构:是指从程序员和使用者的角度看到的结构,亦可称为功能结构。从功能上来看,8086CPU 可分为两部分,即总线接口部件BIU (Bus Interface Unit)和执行部件EU (Execution Unit)。8086CPU 的内部功能结构如图14所示:
图14、8086CPU 内部功能结构图
1.3、8086CPU 引脚图
8086CPU 采用40条引脚的双列直插(DIP )封装,如图15所示,由于有16条数据总线,20条地址总线,一些引脚必须分时复用。
图15、8086CPU 引脚图
2、并行输入输出接口芯片8255
2.1、8086的可编程外设接口电路
8255的数据口D0-D7与CPU 的6根控制线相连接,控制8255A 内部的各种操作。控制线RESET 用来使8255A 复位。CS 和地址线A1及A0用于芯片选择和通道寻址。分别与8086的高位地址线A19,A1,A0相连接。
图16、 8086的可编程外设接口电路
2.2、8255A 并行I\O接口
8255A 芯片内包含有3个8位的端口,它们是A 口,B 口和C 口。这3个端口均可作为CPU 与外设通讯时的缓冲器或锁存器,当需要“状态”或“联络”信号时,C 口可以提供,此时,将C 口的高4位为A 口所用,C 口的低4位为B 口所用。3个端口通过各自的输入/输出线与外设联系。
并行输入/输出端口:
一个并行输入/输出的LSI 芯片,多功能的I/O器件,可作为CPU 总线与外围的接口。具有24个可编程设置的I/O口,即使3组8位的I/O口为PA 口,PB 口和PC 口。它们又可分为两组12位的I/O口,A 组包括A 口及C 口(高4位,PC4~PC7),B 组包括B 口及C 口(低4位,PC0~PC3)。A 组可设置为基本的I/O口,闪控(STROBE)的I/O闪控式,双向I/O3种模式;B 组只能设置为基本I/O或闪控式I/O两种模式,而这些操作模式完全由控制寄存器的控制字决定。 8255引脚功能:
①RESET:复位输入线,当该输入端处于高电平时,所有内部寄存器(包括控制寄存器)均被 清除,所有I/O口均被置成输入方式。
②CS:芯片选择信号线,当这个输入引脚为低电平时,即CS=0时,表示芯片被选中,允许8255与CPU 进行通讯;CS=1时,8255无法与CPU 做数据传输。 ③RD:读信号线,当这个输入引脚为低电平时,即RD=0且CS=0时,允许8255通过数据总线向CPU 发送数据或状态信息,即CPU 从8255读取信息或数据。 WR:写入信号,当这个输入引脚为低电平时,即WR=0且CS=0时,允许CPU 将数据或控制字写入8255。
④D0~D7:三态双向数据总线,8255与CPU 数据传送的通道,当CPU 执行输入输出指令时,通过它实现8位数据的读/写操作,控制字和状态信息也通过数据总线传送。
⑤PA0~PA7:端口A 输入输出线,一个8位的数据输出锁存器/缓冲器, 一个8位的数据输入锁存器。PB0~PB7:端口B 输入输出线,一个8位的I/O锁存器, 一个8位的输入输出缓冲器。
⑥ PC0~PC7:端口C 输入输出线,一个8位的数据输出锁存器/缓冲器, 一个8位的数据输入缓冲器。端口C 可以通过工作方式设定而分成2个4位的端口, 每个4位的端口包含一个4位的锁存器,分别与端口A 和端口B 配合使用,可作
为控制信号输出或状态信号输入端口。
⑦A0、A1:地址选择线,用来选择8255的PA 口,PB 口,PC 口和控制寄存器。 当A0=0,A1=0时,PA 口被选择;
当A0=0,A1=1时,PB 口被选择;
当A0=1,A1=0时,PC 口被选择;
当A0=1。A1=1时,控制寄存器被选择。
3、温度传感器
3.1、DS18B20简介
DALLAS 最新单线数字温度传感器DS18B20是一种新型的“一线器件”,其体积更小、更适用于多种场合、且适用电压更宽、更经济。DALLAS 半导体公司的数字化温度传感器DS18B20是世界上第一片支持“一线总线”接口的温度传感器。温度测量范围为-55~+125 摄氏度,可编程为9位~12 位转换精度,测温分辨率可达0.0625摄氏度,分辨率设定参数以及用户设定的报警温度存储在EEPROM 中,掉电后依然保存。被测温度用符号扩展的16位数字量方式串行输出;多个DS18B20可以并联到3 根或2 根线上,CPU 只需一根端口线就能与诸多DS18B20 通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。
表1、 DS18B20分辩率的定义规定
由表1可见,DS18B20温度转换的时间比较长,而且设定的分辩率越高,所需要的温度数据转换时间就越长。因此,在实际应用中要将分辩率和转换时间权衡考虑。
3.2、DS18B20内部框图
图17、DS18B20内部框图
DS18B20依靠一个单总线端口通讯。在单线端口条件下,必须先建立ROM 操作协议,才能进行存储器和控制操作。因此,控制器必须首先提供下面5个ROM 操作命令之一:1)读ROM ,2)匹配ROM ,3)搜索ROM ,4)跳过ROM ,
5)报警搜索。这些命令对每个期间的激光ROM 部分进行操作,在单总线上挂有多个器件时,同时可以向总线控制器指明有多少个器件或是什么型号的器件。成功执行完一条ROM 操作序列后,即可进行存储器和控制操作,控制器可以提供6条存储器和控制操作指令中的任一条。
一条控制操作命令指示DS18B20完成一次温度测量。测量结果放在DS18B20的暂存器里,用一条读暂存器内容的存储器操作命令可以把暂存器中数据读出。温度报警触发器TH 和TL 各有一个EEPROM 字节构成。如果没有对DS18B20使用报警搜索命令,这些寄存器可以作为一般用途的用户存储器使用。可以用一条存储器操作命令对TH 和TL 进行写入,这些寄存器的读出需要通过暂存器。所有数据都是以最低有效位在前面的方式进行读写。
3.3、DS18B20读写时序
图18、DS18B20读写时序
四、可提炼的可验证性数据
本次课程设计微机系统设计部分主要以实验室的微机原理及接口技术试验箱为平台。在硬件电路调试过程中,利用示波器来测试相关波形是否正确;调试程序时,利用星研集成开发环境集成的模拟调试器对程序进行调试。经过几天的努力,最终完成了整个数字温度计微机系统设计任务。
1、实验效果图
2、示波器调试
五、最终结论
课程设计的这几天里,经过查阅资料、方案选择、设计电路、编写汇编程序、调试电路、软件调试,最终将数字式温度计的微机系统设计任务完成了。整个系统能实时地读取当前的温度,并显示在数码管上。
六、小结
和以前的所有课程设计不同的是,这是我第一次利用微机进行系统设计,从以前使用C 语言进行程序设计到这次的利用汇编语言编写程序,使我们从中学会了很多知识。本次课程设计使我们学会了微机原理、汇编程序编写和对其他器件的认识。在课设过程中,我们不仅认识到了微机系统的构架,而且通过不断查阅相关资料,学会了微机的应用。可以说,通过这次微机系统的实践学习,我们学到了很多,而且对微机的有关知识以及其在现实生活中的多方面应用有了更深层次的认识,这对于我们以后的学习和步入社会后参加工作都有很大的帮助。
在此次课程设计的进程中,我遇到了很多问题,例如,一开始我们在确定课设题目后,不知道怎么把温度显示在数码管上,用什么元件来采集温度,
还有微
机该如何控制DS18B20;对新器件DS18B20智能测温的相关知识我们很模糊甚至可以说一无所知,不过后来,我们通过查找一些相关的资料书以及寻求基地同学的帮助,终于用Altium designer将原理图绘制出来以及写出正确的程序。在仿真时,由于我们有了之前的数模电课设仿真经验,所以此时我们课设进行的很顺利,并没有受到什么大的阻碍。
通过此次微机课程设计,从找资料到原理图的绘制再到去实验室做板,我们明白了很多,理论指导实践,但是理论也需要实践给予证明,凡事都要通过自己的思考推敲和动手去做,否则自己不会取的大的进步。而且在平时的学习生活中应该多和周围的同学相互学习,交流经验,遇到不会的东西时,切忌焦躁,首先要经过自己的独立思考,有了一定想法后,可以去查找相关的资料书刊或者找同学讨论,如果实在解释不了,再去找辅导老师,在这个遇到问题解决问题的过程中,不断加强自我的动脑能力,进而去指导动手能力,也只有这样,你才能学到真正的知识!
附录1、微机系统汇编程序
assume cs:code,ds:_data,ss:_stack
mov ax,_data
mov ds,ax
mov es,ax
nop
call init8255
main:call start_temperature
jb main
call delaytime
call rd_temperature
call dis_bcd
jmp main
dis_bcd proc near
mov bx,ax
lea di,buffer+7
std
mov al,10h
stosb
stosb
stosb
stosb
test ah,08h jnz dis_bcd1 stosb
jmp dis_bcd2 dis_bcd1: mov al,11h stosb
neg bx dis_bcd2:
shl bx,1 shl bx,1 shl bx,1 shl bx,1 mov ax,10 xchg al,bh div bh cmp al,0 jnz dis_bcd3 mov al,10h xchg al,[di+1] stosb
jmp dis_bcd4 dis_bcd3:stosb dis_bcd4:mov al,ah or al,80h stosb
xor al,al test bl,10h jz dis_bcd5 mov al,6
dis_bcd5:test bl,20h jz dis_bcd6 add al,12h daa
dis_bcd6:test bl,40h jz dis_bcd7 add al,25h daa
dis_bcd7:test bl,40h jz dis_bcd8 add al,50h daa
dis_bcd8:mov cl,4 ror al,cl and al,0fh
stosb
cld
lea si,buffer call display8 ret
dis_bcd endp
delaytime proc near xor cx,cx loop $ loop $ loop $ ret
delaytime endp w_l proc near push ax
mov dx,con_8255 mov al,80h out dx,al pop ax ret
w_l endp
w_h proc near push ax
mov dx,con_8255 mov al,01h out dx,al pop ax ret
w_h endp
init_18b20 proc near call w_l mov cx,136 loop $
mov dx,con_8255 mov ax,89h out dx,al dec dx dec dx mov cx,15
init_18b20_1:in al,dx test al,01h
jz init_18b20_2 loop init_18b20_1 stc
ret
init_18b20_2:mov cx,136
loop $
clc
ret
init_18b20 endp
write_18b20 proc near
mov cx,8
wri:push ax
mov dx,con_8255
mov al,80h
out dx,al
pop ax
ror al,1
jnb wri1
push ax
mov dx,con_8255
mov al,01h
out dx,al
pop ax
wri2:push cx
mov cx,7
loop $
pop cx
call w_h
loop wri
ret
wri1:push cx
nop
pop cx
jmp wri2
write_18b20 endp
read_18b20 proc near
mov cx,8
read:mov dx,con_8255
mov al,80h
out dx,al
mov al,89h
out dx,al
nop
nop
nop
nop
nop
mov dx,pc_8255
in al,dx
ror al,1
rcr bl,1
push cx
mov cx,11
loop $
pop cx
loop read
mov al,bl
ret
read_18b20 endp
start_temperature:
call init_18b20
jb get_t
mov al,0cch
call write_18b20
mov al,44h
call write_18b20
clc
get_t:ret
rd_temperature:call init_18b20
mov al,0cch
call write_18b20
mov al,0beh
call write_18b20
call read_18b20
mov ah,al
call read_18B20
xchg al,ah
ret
init8255 proc near
mov dx,con_8255
mov al,80h
out dx,al
dec dx
dec dx
mov al,0ffh
out dx,al
ret
init8255 endp
start endp
code ends
end start
附录2、单片机C 语言程序(部分)
/********************************************
MC9S12XS128温度采集程序
------------------------------------
Code Warrior 5.0/1
Target : MC9S12XS128
Crystal: 16.000Mhz
busclock:16.000MHz
pllclock:32.000MHz
使用说明:
OLED 电源使用3.3V 。
----------------
G 电源地
3.3V 接3.3V 电源
D0 PORTA_PA0
D1 PORTA_PA1
RST PORTA_PA2
DC PORTA_PA3
CS 已接地,不用接
============================================
OLED 电源使用5V 。
----------------
G 电源地
3.3V 接5V 电源,电源跟模块之间串接100欧姆电阻,并加3.3V 钳位二极管
D0 PORTA_PA0 单片机跟模块之间串接1k-3.3k 电阻
D1 PORTA_PA1 单片机跟模块之间串接1k-3.3k 电阻
RST PORTA_PA2 单片机跟模块之间串接1k-3.3k 电阻
DC PORTA_PA3 单片机跟模块之间串接1k-3.3k 电阻
CS 已接地,不用接
============================================
如果用户使用的是5V 单片机,请看用户手册,切勿烧毁模块!
============================================*/
#include "derivative.h"
#include
#include
#include "LQ12864.h"
// PLL初始化子程序 BUS Clock=16M
void SetBusCLK_16M(void)
{
CLKSEL=0X00; // disengage PLL to system
PLLCTL_PLLON=1; // turn on PLL
SYNR=0x00 | 0x01; // VCOFRQ[7:6];SYNDIV[5:0]
// fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1)
// fPLL= fVCO/(2 × POSTDIV)
// fBUS= fPLL/2
// VCOCLK Frequency Ranges VCOFRQ[7:6]
// 32MHz
// 48MHz
// Reserved 10
// 80MHz
REFDV=0x80 | 0x01; // REFFRQ[7:6];REFDIV[5:0]
// fREF=fOSC/(REFDIV + 1)
// REFCLK Frequency Ranges REFFRQ[7:6]
// 1MHz
// 2MHz
// 6MHz
// fREF > 12MHz 11 // pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;
POSTDIV=0x00; // 4:0, fPLL= fVCO/(2xPOSTDIV)
// If POSTDIV = $00 then fPLL is identical to fVCO
(divide by one).
_asm(nop); // BUS CLOCK=16M
_asm(nop);
while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it;
CLKSEL_PLLSEL =1; //engage PLL to system;
}
void Dly_ms(int ms)
{
int ii,jj;
if (ms
for(ii=0;ii
for(jj=0;jj
//for(jj=0;jj
//for(jj=0;jj
}
//============================MAIN()==========================
=
/*********************主函数************************************/
void main(void)
{
byte i=0;
SetBusCLK_16M();
DDRB=0XFF;
DDRA=0XFF;
PORTB=0XFF;
LCD_Init();
DisableInterrupts;
for(;;)
{
LCD_Fill(0xff);//黑屏
Dly_ms(1000);
LCD_Fill(0x00);//亮屏
Dly_ms(1000);
LCD_Print(8,0,"北京龙丘智能科技"); //汉字字符串显示 LCD_Print(15,2,"智能车首选液晶"); //汉字字符串显示 LCD_P8x16Str(48,4,"OLED"); //英文字符串显示 LCD_P6x8Str(16,6,"[email protected]");//英文字符串显示 LCD_P6x8Str(34,7,"2011-09-03"); //英文字符串显示 Dly_ms(2000);
LCD_CLS(); //清屏 Draw_BMP(16,0,112,7,longqiu96x64); //图片显示 Dly_ms(2000);
/*
for(i=0;i
{
LCD_CLS();
Draw_BMP(i,0,i+96,7,longqiu96x64);
Dly_ms(300);
LED4=~ LED4;
}
for(i=32;i>1;i-=2)
{
LCD_CLS();
Draw_BMP(i,0,i+96,7,longqiu96x64);
Dly_ms(300);
LED1=~ LED1;
}
*/
Dly_ms(500);
PORTB_PB7=~ PORTB_PB7;
}
/* please make sure that you never leave main */
}