课程设计报告
设计课题:
专业班级:学生姓名:指导教师:设计时间:
测温器
测温器
一、课程设计目的
1、了解温度传感器18B20的电路原理及其编程方法。 2、了解字符型LCD液晶显示器的原理,掌握其编程方法。 3、了解混合编程的基本原理和方法。
二、课程设计题目(问题)描述和要求
应用温度传感器18B20对温度数据进行采集,然后在并口液晶上显示。
三、系统分析与设计
根据课程设计题目问题描述和要求,完成: 1、 系统总体设计-确定系统功能模块划分及说明 系统功能分为三个模块:
(1) 液晶模块,作用是控制显示结果输出。
(2) 18B20温度采集模块,作用是用18B20对温度数据进行采样,然后
送给单片机。
(3) 24C02模块,作用是对温度数据进行存储。
2、 系统详细设计-在总体设计基础上设计系统总体框架、系统流程图 ----18B20流程图
开始 混合编程说明 初始化 跳过ROM 开始转换 延时 重新初始化 跳过ROM 读存储器 系统总体框架
----实验的硬件部分电路图:
图1为18B20温度采集部分,其中JP1的3脚为DS18B20的DQ引脚,接在单片机的P2.7上(本实验程序打开的为P2.7,另外1脚和5脚分别接地和电源VCC)。
图1 单片机与外接器件连接图
图2 74HC573与单片机连接图
图3 GAL16V8与单片机连接图
图4 液晶与单片机的连接电路图
3、 源程序清单
(一)、应用18B20对温度数据采集程序
WDD EQU P2.7 ;用WDD表示P2.7 UPPER SEGMENT CODE PUBLIC
GETWD
//程序段//
//入口地址//
RSEG UPPER //程序段//
GETWD: CLR TR0 ;清TR0
LCALL INI ;调用INI置位 MOV A,#0CCH
;跳到存储区
LCALL WRITE ;调用WRITE MOV A,#44H
;转换温度
LCALL WRITE ;调用WRITE SETB TR0
LCALL DS200MS ;延时
LCALL DS200MS LCALL DS200MS LCALL DS200MS LCALL DS200MS LCALL DS200MS
CLR TR0 ;清TR0 LCALL INI MOV A,#0CCH LCALL WRITE MOV A,#0BEH LCALL WRITE
READ: MOV R6,#8 RE1: CLR WDD MOV R4,#4 NOP
SETB WDD
RE2: DJNZ R4,RE2 MOV C,WDD
RRC A
MOV R5,#30
RE3: DJNZ R5,RE3 DJNZ R6,RE1 MOV R7,A
MOV R6,#8
RE10: CLR WDD MOV R4,#4 NOP
SETB WDD
读18B20字程序
;将WDD清零
;将WDD置1
;读一位数据 ;循环8次 低位温度数据存在R7
;read scratchpad
; ; RE20: DJNZ R4,RE20
MOV C,WDD
RRC A ;读一位数据 MOV R5,#30
RE30: DJNZ R5,RE30 DJNZ R6,RE10 ;循环8次
MOV R6,A
; SETB TR0
RET
INI: CLR WDD ;18B20
MOV R2,#200
L1: CLR WDD DJNZ R2,L1 SETB WDD
MOV R2,#30
L4: DJNZ R2,L4 CLR C ORL C,WDD JC INI
MOV R6,#80
L5: ORL C,WDD JC L3
DJNZ R6,L5
SJMP INI
L3: MOV R2,#240 L2: DJNZ R2,L2
RET
WRITE: MOV R3,#8 WR1: SETB WDD
高位温度数据存在R0
置位子程序 18B20写数据子程序
;2,6*80
;2*240
;向
MOV R4,#8 RRC A CLR WDD
;2*8
WR2: DJNZ R4,WR2
MOV WDD,C ;写一位数据 MOV R4,#20
WR3: DJNZ R4,WR3
DJNZ R3,WR1 SETB WDD RET
;延时子程序
;循环8次
DS200MS: MOV R6,#03H
D65: MOV R5,#0C8H ;2 D256: MOV R4,#0FAH ;2
(二)字符型LCD液晶显示程序 #include #define uchar unsigned char #define uint unsigned int #define ulong unsigned long #define LCDCOM0 XBYTE[0X9000] #define LCDCOM1 XBYTE[0X9400] DJNZ R4,$ DJNZ R5,D256 DJNZ R6,D65 RET END ;2*0xfa= ;6*0xc8= ;10*0x02= #define LCDDATA XBYTE[0X9800] //#define LCDDATA_READ XBYTE[0X9800] sbit bflag=ACC^7; uint GETWD(); void wait(void) { do{ACC=LCDCOM1;}while(bflag==1); } void init_lcd() /*对18B20进行初始化 */ { wait(); LCDCOM0=0x38; /*置功能;2行,5*7字符 */ wait(); LCDCOM0=0x06; /*置输入模式:地址增量,显示屏不移动*/ wait(); LCDCOM0=0x0c; /*显示开0x0d,显示光标,光标闪烁*/ wait(); LCDCOM0=0x01; /*清屏显示 */ } void init_command(uchar command) /*发送新命令,一般用于给出新的 显示地址*/ {wait();LCDCOM0=command;} /*首行地址0x80~0xa7,次行地址 0xc0~0xe7*/ void d_char(uchar a) /*显示字符函数*/ { wait(); LCDDATA=a;} /*输出到数据寄存器*/ main() {uint wd,wdr,wdx; uchar wd1,wd2,wd3,wdx1,wdx2,wdx3,wdx4; //unsigned char j; unsigned int z; //uint dis[3]; //unsigned char a,b,c,d; //uint wd; TR1=0; SCON=0X50; PCON=0X00; //01010000,串行口方式1。 TMOD=0X20; TL1=TH1=0XFD; TR1=1; while(TI == 1);TI=0; for(;;) { z=GETWD(); SBUF = z>>8; while(TI == 0);TI=0; SBUF = z&0x00ff; while(TI == 0);TI=0; init_lcd(); for(;;) { init_command(0x80); wd=GETWD(); wdr=wd>>4; wd1=wdr/100; wd2=(wdr/10)%10; wd3=wdr%10; wd1+=48; wd2+=48; wd3+=48; 定时器1波特率9.6KHZ。 //wdx=(wd&0x0f)*625; wdx1=wdx/1000; wdx2=(wdx/100)%10; wdx3=(wdx/10)%10; wdx4=wdx%10; wdx1+=48; wdx2+=48; wdx3+=48; wdx4+=48; if(wd1==48) if(wd2==48) wd2=0x20; else wd1=0x20; init_command(0x80); d_char(wd1); d_char(wd2); d_char(wd3); d_char(46); d_char(wdx1); d_char(wdx2); d_char(wdx3); d_char(wdx4); } } 四. 系统调试过程中出现的主要问题 系统调试过程中曾出现以下问题: 1、程序无法下载,不能下载到硬件里(232转换芯片不好用) 2、程序下载到电路板,但是液晶显示屏没效果(电路板有问题) 五. 系统运行报告与结论 特点:1、DS18B20为一线数据传输,三条腿的单芯片温度测量。 2、该系统测量温度比较精确(小数点后可以保留4位)。 问题:18B20采集的温度数据反馈到液晶显示器上比较慢,不够灵敏。 改进意见:可以考虑换一些灵敏度高的器件。 六. 总结 1、设计中遇到的问题及解决过程 在设计中对器件1602和18B20的工作原理不熟悉,但是通过察看《18B20说明文档》和《1602说明文档》 ,熟悉了18B20和1602的使用,初步建立了设计系统的思想。 2、设计中产生的错误及原因分析 编写程序的过程中,由于不熟练出现了错误的语句,导致实验不能正确出现结果。例如: (1)对变量wd的定义犯了重定义的错误; (2)字符型LCD液晶显示程序中有一条语句应该是“while(TI == 1);TI=0;”,此条语句我刚开始编程时把它写成了“while(TI == 0);TI=0; ”,把“1”写成了“0”,导致程序无法正常运行。 (3)应用18B20对温度数据采集程序,使用的是汇编语言,保存时应 该保存为“.asm”的形式,但是我当时没注意,保存为“.c”的形式,编译则出现了一个错误,提示程序开头少一个“;”号,后来经过研究,及时改正了错误。 3、设计体会和收获 在此次实验的过程中,我学习到了许多器件的结构功能和用法,掌握了 一些编程的技巧和方法,更为重要的是本次实验让我有了一个“系统”的概念,能将几个独立的模块整和到一起实现一个比较复杂的系统从而实现更多功能,能够把原来理论学习的内容应用于实际的操作中,对理论有了进一步的理解。是以前学习的理论知识更系统化。锻炼了我的动手能力、编程的思想、设计能力及遇到问题后解决问题的能力。所以在以后不论在实际工作中还是工作中遇到问题时,都要认真思考,把书本 上的知识用到实际中去解决问题。 七. 参考书目 1、《单片机原理与应用》教材 2、《单片机的C语言应用程序设计》,马忠梅,北京航空航天大学出版社 3、《单片微机测控系统设计大全》,王福瑞,北京航空航天大学出版社 4、《单片机高级语言C51应用程序设计》,徐爱钧,电子工业出版社 5、《智能仪器与数据采集系统中的新器件及应用》,杨振江,西安电子科技大学出版社 因篇幅问题不能全部显示,请点此查看更多更全内容