《单片机原理及应用》课程设计
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
书-消毒柜控制电路的设计
1
课程设计报告书
消毒柜控制电路的设计 课题名称
姓 名
学 号
电气工程及其自动化 专 业
指导教师
机电与控制工程学院
年 月 日
2
填 写 说 明
1、正文部分:
(1) 标题与正文格式定义
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
如下:
一级标题:1.标题1
二级标题:1.1标题2
三级标题:1.1.1标题3
四级标题:1.1.1.1标题4
(2)
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
格:尽可能采用三线表。
(3)图形:直接插入的插图应有图标、图号,不能直接插入的图应留出插图空位。图中文字、符号书写要清楚,并与正文一致。
(4)文字表述:要求层次清楚,语言流畅,语句通顺,无语法和逻辑错误,无错字、别字、漏字。文字的表述应当以科学语言描述研究过程和研究结果,不要以口语化的方式表达,报告中科技术语和名词应符合规定的通用词语,并使用法定计量单位和标准符号。
2、参考文献:
(1)数量要求:参考文献只选择最主要的列入,应不低于5种。
(2)种类要求:参考文献的引用,可以是著作[M]、论文[J]、专利文献[P]、会议论文等。
(3)文献著录格式及示例。参考文献用宋体五号字。
[1] 作者. 书名[M]. 版次. 出版地: 出版者, 出版年: 起止页码 (著作图书文献)
[2] 作者. 文章名[J]. 学术刊物名称. 年. 卷(期): 起止页码 (学术刊物文献)
示例: [1]王社国,赵建光。基于ARM的嵌入式语音识别系统研究 [J]。微计算机信息,2007,2-2:149-150.
3、附录或附件:(可选项)
重要的测试结果、图表、设计图纸、源程序代码、大量的
公式
小学单位换算公式大全免费下载公式下载行测公式大全下载excel公式下载逻辑回归公式下载
、符号、照片等不宜放入正文中的可以附录形式出现。
4、如果需要可另行附页粘贴。
3
任 务 书
基于单片机的消毒柜控制电路的设计
设计一台消毒柜控制系统,
要求:
(1)显示消毒柜温度,保持时间。
(2)可以键盘设定消毒柜温度,定时时间。 (3)可以实现实时中断功能。
(4)消毒后自动关机。
(5)测温误差:〈0.5 ?c。
(6)定时误差:〈20s/月
4
目 录
1、绪论…………………………………………………………………………
2、
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
论证(规划、选定)……………………………………………
3、方案说明(设计)………………………………………………………
4、硬件方案设计…………………………………………………………
5、软件方案设计…………………………………………………………
6、调试………………………………………………………………………
7、技术小结(结束语)…………………………………………………
8、参考文献…………………………………………………………………
9、附录(源程序代码、电路图等)…………………………………………
5
1. 绪论
该课题是设计一个消毒柜其实就是设计一个智能的温度控制系统,消毒柜主要通过加热到一个指定温度,对餐具等卫生洁具进行高温消毒,消毒柜将高温控制在一个指定的范围内,并维持一定时间,杀灭细菌,极大地增强了人们的饮食卫生,大大降低了疾病的交叉传染,为提高人们的身体健康起了重要的作用。
本文主要介绍了一个基于AT89C51单片机制作的消毒柜控制电路。它主要包括供电电源电路、上电复位电路、晶振电路、开关控制电路、显示电路等部分。文中对各电路的结构及工作原理作了详尽的介绍。电路运行后,能自动定时控制消毒柜的加电和断电,适时有效地完成对柜内餐具或其它物品的消毒工作。具有电路简单、制作容易、使用灵活等优点。通过该电路,可以进一步了解到单片机电路的应用扩展功能和指令应用技巧。
本文的消毒柜控制系统就是为了人们日常生活中的餐具消毒而设计的,采用微电脑控制技术,精确地控制消毒柜内的温度和加热时间,很大程度上改善了人们的饮食卫生,提高了人们的生活水平。本设计采用DS18B20温度传感器采集实时温度,通过DQ口送51单片机系统,实现模拟温度值的采集、转化、输出数字值,然后51单片机对采集的数据处理后送液晶显示电路,实时动态地显示当前的温度及倒计时时间。对温度的控制主要由单片机内部三种中断方式来控制启动和停止。
。
6
2、方案论证
2(1 系统设计要求
2.1.1显示消毒柜温度,保持时间。
2.1.2可以键盘设定消毒柜温度,定时时间。
2.1.3可以实现实时中断功能。
2(2 系统组成框图
DS18B20 液晶屏显示
单
片
机
键盘控制 发光二极管显示
图2.1 系统组成框图
2(3 系统工作原理
该系统是基于AT89S51单片机的温度控制的且实现通过高温来杀灭病毒的消毒柜系统,该系统主要三大部分组成。第一部分是由温度传感器DS18B20采集实时温度转换成数字信号;第二部分的电路是由键盘控制消毒的定时和启停;第三部分是液晶显示屏的显示部分。
AT89S51单片机对键盘的扫描结果和即时温度值的处理,实现对温度的实时控制,系统设计了启动设定定时时间,设置定时时间,中断控制定时,共四个键,按下启动设定定时时间功能键即确定开始温度增减按钮时,单片机加热时间可通过温度加减按钮设定,开始加热,启动定时器中断控制,当温度加热设定时间到后停止加热。 2(3系统工作论证
通过对系统控制要求的研究,确定了控制系统的基本框图,针对其基本原理进行了分析说明,此方案能满足消毒柜控制系统的基本要求。
7
3、方案说明
3.1 DS18B20 一线总线温度传感器
特点:
体积小安装方便;
可联网,方便分散点测量;
三线?二线式连接方式;
测量范围-55?~+125?;
3.2 AT89C51
按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。AT89C51单片机是美国ATMEL公司生产的低电压、高性能CMOS 8位单片机,具有丰富的内部资源:4kB闪存、128BRAM、32根I/O口线、2个16位定时/计数器、5个向量两级中断结构、2个全双工的串行口,具有4.25,5.50V的电压工作范围和0,24MHz工作频率,使用AT89C51单片机时无须外扩存储器。因此,单片机最小系统为晶振、复位、电源等电路和必要的软件组成的单个单片机。 3.3 1602液晶显示
首先是1602液晶的管脚,总共有16个管脚,其中有三根是电源地、电源正、还有事对比
度的调整电压;还有两根是LCD背光的正、负极。重要的是决定led指令的三根管脚吗,分别是RS、 R/W、E(一般接单片机的P2.0~P2.2),剩下的八根式数据线分别为DB0~DB7(一般接单片机的P0口)。
8
4、硬件方案设计
4.1系统硬件结构框图
二极管亮灭
51实时温度,
定时时间, 单LCD液晶 温度上下片显示屏 限 机按 键 DS18B2
0
图2系统硬件结构框图
4.2单片机最小系统设计
单片机采用的是ATMEL公司的AT89S51芯片该款芯片是一种低功耗、高性能CMOS8位微控制器,具有 4K 在系统可编程Flash 存储器。使用Atmel 公司高密度非 易失性存储器技术制造,与工业80C51 产品指令和引脚完 全兼容。片上Flash允许程序存储器在系统可编程,亦适于 常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统 可编程Flash,使得AT89S51为众多嵌入式控制应用系统提 供高灵活、超有效的解决方案。 AT89S51具有以下标准功能: 4k字节Flash,128字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,两个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口, 片内晶振及时钟电路。另外,AT89S51可降至0Hz 静态逻 辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工 作。掉电保护方式下,RAM内容被保存,
9 振荡器被冻结, 单片机一切工作停止,直到下一个中断或硬件复位为止。8 位微控制器 4K 字节在系统可编程 Flash AT89S51。
单片机最小系统电路图如图3.2所示。
图3.2 单片机最小系统电路图
4.3 DS18B20控制电路
通过P3.4口与DQ的连接实现51单片机与温度传感器DS18B20的连通工作。
10
4.4 键盘控制电路
该键盘接口电路通过按键控制定时和中断。
本模块通过编制程序,扫描键盘,来比对键盘的值,来设置四个功能键。
4.5 LCD液晶显示电路
通过P0口控制液晶显示的输入。P0口必须外接上拉电阻。通过P2口的低三位控制RS,RW,E三个功能控制引脚,从而控制液晶显示屏LCD的工作。
11
5、软件方案设计
5.1系统软件设计原理
本程序设计根据通过温度传感器采样来的温度值,经过内部转化为二进制数字量,再通过51单片机控制输出至LCD液晶显示屏,然后调用显示程序进行温度的事实显示。
对于各个功能键的程序是从P0口读数、再转换成十进制数、送显缓区、再根据键盘扫描的结果对温度值进行比较判断,当按下的键是加减功能键时,系统要控制加热的时间可进行调节。开始加热后,通过定时器控制加热时间到的中断,当加热时间由设定值减至0时停止加热,键盘显示实时温度。通过在主程序里面设立标志,该程序是通过延时的方法来确保温度转换为显示数据实现温度与按键的统一和“同步”,实时的控制加热的工作,以达到人们所要求达到的效果。
12
5.2主程序流程图
开始
系统初始化
显示屏初始 中断初始 定时初始
键盘设置与液晶屏显示
定时未到,继续判断 判断定时
定时到
工作
图3主程序流程图
5.3系统子程序设计
本软件设计中,系统子程序的设计是整个程序设计的重中之重,子程序以模块化的方式实现各个独立功能,再通过主程序来调用功能子程序,使整个程序实现完整的功能。
按键处理子程序, DS18B20温度采样子程序,温度采样转化子程序,显示处理子程序。
13
6、调试
6.1 硬件调试
6.1.1.由于本次课程设计做了实物出来,通过设计方案,在试验焊接板上进行合理布局并焊接实物图。然后根据实验指导书上的各功能芯片的端口地址,连接号各部分电路,用电表测量焊接点的正常与否,最后连上电源。
6.1.2.检测LCD显示模块,因为通过键盘显示,可以直观的知道程序是否基本运行正常,是否按预定的显示。
6.1.3. 调试键盘模块电路,看是否按压正常,以及二极管闪灭部分是否能够实现实时闪亮。
6.1.4.最后进行整体硬件电路的联调。
6.2软件调试
软件调试是个很重要的过程,由于软件出现错误的话就基本上各部分功能都实现都有困难,所以软件的调试时重中之重。
6.2.1第一步是进行的是DS18B20的软件的调试,通过采集温度后内部转换后通过合理的内存单元的分配,存储采样后转换的值,然后同过51单片机程序看是否实现在LCD上显示实时温度值。
6.2.2键盘扫描部分程序的调试,该部分是程序中的功能键实现控制温度和时间的主要的部分,如果该部分程序出现错误的话,逻辑就会出现混乱,各功能键将不能实现,在调试的过程中,我们发现,我们的键
14
盘电路的接法接口要正确连接,一旦键盘口搞错的话,就会出现按键的功能的混乱,所以在这一步分的调试上最主要是把握键盘的控制分析。
6.2.3 最后一部分调试显示程序的调试,该部分程序的调试,关系到该课设是否够直观的体现温度值,以及建立一个直观的人机对话界面,在该部分程序的调试的过程中面临的最大困难就是对于显缓单元的分配,以及初始化,读写的控制,如果显缓单元分配有冲突的话,就会导致程序逻辑错误,所以应该仔细调试该部分应该边编写边调试。 6.3调试结果
用专门的编译软件Keil对程序进行编译,编译无误后。并让其生成HEX文件,按照软件流程图在仿真软件Proteus上进行仿真,把各个元器在仿真软件中找出来,再将它们连接起来,连接完毕后将生成的HEX文件加载到单片机中。
经过详细的硬件调试和软件调试之后,系统工作正常,LCD液晶显示模块共两行,分别按要求实时显示设定的最高和最低温,当前温度值,定时时间值。按下“加减键”时,系统可调节消毒加热的时间,加热时间到后点亮定时到指示灯,当时间到达到0时,停止加热。
15
7、技术小结
通过一个多星期的研究动手实践完成,简单的消毒柜控制系统初步成形。实物图也出来了,实现了课程设计的基本要求。
本设计集中了按键,定时器,液晶显示等的应用。对于按键部分控制简单,因为是独立的按键控制,只需要与51单片机的任一输入输出端口相连,通过控制器高低电平即可。对于定时器和外部中断0,1的设计书写,只需要对中断和定时器控制的方法和步骤熟悉,熟练运用它们的启动停止就可正确完成控制。对于我来说最难得就是LCD液晶显示的控制了,硬件连接图可根据经验和管脚说明连接就行,但软件程序编写时对其的不熟悉和难以理解,给了我很大的障碍,以至于很久弄不出程序,不能支持实物电路板的正常工作。后来经过学习参考咨询和大家交流等各种渠道,慢慢的掌握了其基本的知识,才有了后来的完整的程序。
本次课设一个不足之处就是没有完成消毒后自动关机的功能,浪费单片机的内部资源。对于温度传感器电路,还存在缺憾,并不能完全掌握该部分程序的编写。
本课程设计自己去焊接电路,锻炼了独立思考和实际操作的能力,一定程度上增加了课程设计的难度,但是真正对我们设计电路却是一个帮助和提高,所以我努力并认真的对待着本次的设计,希望能够自行设计硬件电路根据自己设计的硬件电路来编制相应的程序在对我们掌握各硬件部分电路有更好的理解,也一定程度上复习了以前所学的其基础知识,也能更好的掌握一些电气知识。
16
、参考文献 8
【1】 万福君.潘松峰.刘芳.MSC-51单片微型机原理、系统设计及应用
【M】.北京:清华大学出版社,2009.9
【2】 陈黎娟.万在红.吴开志.聂鹏程.单片微型计算机实验教程【M】.
南昌航空大学,2006.2
【3】 张永瑞. 电子测量技术基础【M】.西安:西安电子科技大学出版
社,2009.1
【4】 刘同法.陈忠平.彭继卫.单片机外围接口电路与工程实践【M】.
北京:北京航空航天大学出版社, 2009.3 【5】 何立民.单片机应用技术选编 (1-8). 北京:北京航空航天大学出
版社. 2001
【6】 邬宽明.单片机外围器件实用手册. 数据传输接口器件分册,M,.
北京:北京航空航天大学出版社,1998
【7】 鲍健等. 用单片机直接驱动液晶显示器.量子电子学报
[J].2005.2(4):651~652
17
9、附录
9.1主程序
源程序:
//#include
//用AT89C51时就用这个头文件
#include //用华邦W78E58B时必须用这个头文件
#include
#include
#include
#include
#include
#include
#include "LCD1602.h" ////液晶显示头文件
//sbit DQ = P3^4; //定义DQ引脚为P3.4
sbit k0=P3^7; //确认开始温度增减的按钮
sbit k3=P1^1; //温度加
sbit k4=P1^3; //温度减
sbit k5=P1^7; //确定按钮
sbit LED=P3^0; // 温度到后亮
unsigned char min=0;
unsigned char temp=0;
unsigned int a=0;
unsigned char b=0;
unsigned char t[2],*pt; //用来存放温度值,测温程序就
是通过这个数组与主函数通信的
//unsigned char
TempBuffer1[9]={0x2b,0x31,0x32,0x32,0x2e,0x30,0x30,0x43,'\0'};
unsigned char
TempBuffer1[17]={0x2b,0x31,0x32,0x32,0x2e,0x30,0x30,0x43,
0x54,0x3a,0x30,0x30,0x43,0x3a,0x30,0x30,'\0'};
//显示实时温度,上电时显示+125.00C unsigned char
TempBuffer0[17]={0x54,0x48,0x3a,0x2b,0x31,0x32,0x35,0x20,
0x54,0x4c,0x3a,0x2b,0x31,0x32,0x34,0x43,'\0'};
//显示温度上下限,上电时显示
TH:+125 TL:+124C
unsigned char code dotcode[4]={0,25,50,75};
18 /***因显示分辨率为0.25,但小数运算比较麻烦,故采用查表的方法*******
再将表值分离出十位和个位后送到十分位和百分位
********************/
void covert0( unsigned char TH, unsigned char TL) //将温度上下限转换为LCD显示的数据
{
if(TH>0x7F) //判断正负,如果为负温,将其转化为其绝对值
{
TempBuffer0[3]=0x2d; //0x2d为"-"的ASCII码
TH=~TH;
TH++;
}
else TempBuffer0[3]=0x2b; //0x2B为"+"的ASCII码
if(TL>0x7f)
{
TempBuffer0[11]=0x2d; //0x2d为"-"的ASCII码
TL=~TL+1;
}
else TempBuffer0[11]=0x2b; //0x2B为"+"的ASCII码
TempBuffer0[4]=TH/100+0x30; //分离出TH的百十个位
if( TempBuffer0[4]==0x30) TempBuffer0[4]=0xfe; //百位数消隐
TempBuffer0[5]=(TH%100)/10+0x30; //分离出十位
TempBuffer0[6]=(TH%100)%10+0x30; //分离出个位
TempBuffer0[12]=TL/100+0x30; //分离出TL的百十个位
if( TempBuffer0[12]==0x30) TempBuffer0[12]=0xfe; //百位数消隐
TempBuffer0[13]=(TL%100)/10+0x30; //分离出十位
TempBuffer0[14]=(TL%100)%10+0x30; //分离出个位
//if(k0==0) b=0;
if((TempBuffer1[2]==TempBuffer1[14])&&(TempBuffer1[3]==TempBuf
fer1[15])&&(b==1))
{
LED=1;
19
b=0;
k0=1;
}
}
void covert1(void) //将温度转换为LCD显示的数据 {
unsigned char x=0x00,y=0x00;
t[0]=*pt;
pt++;
t[1]=*pt;
if(t[1]>0x07) //判断正负温度
{
TempBuffer1[0]=0x2d; //0x2d为"-"的ASCII码
t[1]=~t[1]; /*下面几句把负数的补码*/
t[0]=~t[0]; /* 换算成绝对值*********/
x=t[0]+1; /***********************/
t[0]=x; /***********************/
if(x>255) /**********************/
t[1]++; /*********************/
}
else TempBuffer1[0]=0x2b; //0xfe为变"+"的ASCII码
t[1]<<=4; //将高字节左移4位
t[1]=t[1]&0x70; //取出高字节的3个有效数字位
x=t[0]; //将t[0]暂存到X,因为取小数部分还要用到它
x>>=4; //右移4位
x=x&0x0f; //和前面两句就是取出t[0]的高四位
t[1]=t[1]|x; //将高低字节的有效值的整数部分拼成一个字节
TempBuffer1[1]=t[1]/100+0x30; //+0x30 为变 0~9 ASCII码
if( TempBuffer1[1]==0x30) TempBuffer1[1]=0xfe; //百位数消隐
TempBuffer1[2]=(t[1]%100)/10+0x30; //分离出十位
TempBuffer1[3]=(t[1]%100)%10+0x30; //分离出个位
t[0]=t[0]&0x0c; //取有效的两位小数
t[0]>>=2; //左移两位,以便查表
x=t[0];
20
y=dotcode[x]; //查表换算成实际的小数
TempBuffer1[5]=y/10+0x30; //分离出十分位
TempBuffer1[6]=y%10+0x30; //分离出百分位
}
void delay(unsigned char i) {
while(i--);
}
void delay1(unsigned int z) {
unsigned int i,j;
for(i=z;i>0;i--)
for(j=100;j>0;j--);
}
/*******************设定时间函数**************************/
void shijianset()
{
if(k3==0)
{
delay1(120);
if(k3==0) min++;
}
if(k4==0)
{
delay1(120);
if(k4==0) min--;
}
TempBuffer1[11]=min%10+0x30;
TempBuffer1[10]=min/10+0x30; }
/*******************确认开始计时函数
***************************/ void jishi()
{
21
if(k5==0)
{
delay1(120);
if(k5==0)
{
TR0=1; //开始计时
b=1;
}
}
if(a==20)
{
a=0;
min--;
}
if(min==0) TR0=0;
}
/*******************设置温度函数***************************/
void setwendu()
{
TempBuffer1[14]=temp/10+0x30;
TempBuffer1[15]=temp%10+0x30; }
/*******************主程序***************************/
main()
{
unsigned char TH=110,TL=-20; //下一步扩展时可能通过这两个变量,调节上下限
LED=0;
//测温函数返回这个数组的头地址
EA=1; //开总中断
EX0=1; //允许外部中断0
EX1=1; //允许外部中断1
IT0=1; //设置外部触发0为跳沿触发
IT1=1; //设置外部触发1为跳沿触发
TMOD=0X01; //设置定时器T0为工作方式1
TL0=0XB0;
TH0=0X3C; //设置每次定时时间为50ms
ET0=1; //允许定时器中断
22
k0=0;
while(1)
{
pt=ReadTemperature(TH,TL,0x3f); //上限温度-22,下限-24,分辨率10位,也就是0.25C
//读取温度,温度值存放在一个两个字节的数组中,
delay(100);
shijianset();
setwendu();
covert1();
covert0(TH,TL);
jishi();
LCD_Initial(); //第一个参数列号,第二个为行号,为0表示第一行
//为1表示第二行,第三个参数为显示数据的首地址
LCD_Print(0,0,TempBuffer0);
LCD_Print(0,1,TempBuffer1);
}
}
void extern0() interrupt 0 {
temp++;
}
void extern1() interrupt 2 {
temp--;
}
void timer() interrupt 1 {
TL0=0XB0;
TH0=0X3C;
a++;
}
23 9.2子程序
9.2.1 LCD显示子程序
//#include //用AT89C51时就用这个头文件
#include //用华邦W78E58B时必须用这个头文件
#include
//注意那个LCD_Wait()函数,它是判"忙"标志的,在实际硬件要把注掉的那种打开
//Port
Definitions***************************************************
*******
sbit LcdRs = P2^0;
sbit LcdRw = P2^1;
sbit LcdEn = P2^2;
sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.
数据端口
//内部等待函数
**************************************************************
************
unsigned char LCD_Wait(void) {
LcdRs=0;
LcdRw=1; _nop_();
LcdEn=1; _nop_();
//while(DBPort&0x80);//在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环,
//可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80==0x80
//实际硬件时打开此语句
LcdEn=0;
return DBPort;
}
//向LCD写入命令或数据
************************************************************
#define LCD_COMMAND 0 // Command #define LCD_DATA 1 // Data #define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光标返回原点
void LCD_Write(bit style, unsigned char input)
24
{
LcdEn=0;
LcdRs=style;
LcdRw=0; _nop_();
DBPort=input; _nop_();//注意顺序
LcdEn=1; _nop_();//注意顺序
LcdEn=0; _nop_();
LCD_Wait();
}
//设置显示模式
************************************************************
#define LCD_SHOW 0x04 //显示开
#define LCD_HIDE 0x00 //显示关
#define LCD_CURSOR 0x02 //显示光标
#define LCD_NO_CURSOR 0x00 //无光标
#define LCD_FLASH 0x01 //光标闪动
#define LCD_NO_FLASH 0x00 //光标不闪动
void LCD_SetDisplay(unsigned char DisplayMode) {
LCD_Write(LCD_COMMAND, 0x08|DisplayMode); }
//设置输入模式
************************************************************
#define LCD_AC_UP 0x02
#define LCD_AC_DOWN 0x00 // default
#define LCD_MOVE 0x01 // 画面可平移
#define LCD_NO_MOVE 0x00 //default
void LCD_SetInput(unsigned char InputMode) {
LCD_Write(LCD_COMMAND, 0x04|InputMode); }
25 //初始化
LCD***********************************************************
*
void LCD_Initial()
{
LcdEn=0;
LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动
}
//************************************************************
************
void GotoXY(unsigned char x, unsigned char y)
{
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}
void Print(unsigned char *str) {
while(*str!='\0')
{
LCD_Write(LCD_DATA,*str);
str++;
}
}
void LCD_Print(unsigned char x, unsigned char y, unsigned char
*str)
{
GotoXY(x,y);
Print(str);
}
26
9.2.2 DS18B20控制子程序
/#include //用AT89C51时就用这个头文件 #include //用华邦W78E58B时必须用这个头文件 sbit DQ = P3^4; //定义DQ引脚为P3.4
/***********ds18b20延迟子函数(晶振12MHz )*******/ /************DS18B20对时间要求很严,但只能长不能短 *************在11.0592M下也行,因为时间长些********/ void delay_18B20(unsigned int i) {
while(i--);
}
/**********ds18b20初始化函数**********************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay_18B20(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay_18B20(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay_18B20(20);
}
/***********ds18b20读一个字节**************/
unsigned char ReadOneChar(void) {
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
27
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
/*************ds18b20写一个字节****************/
void WriteOneChar(unsigned char dat) {
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(5);
DQ = 1;
dat>>=1;
}
}
/**************读取ds18b20当前温度************/
unsigned char *ReadTemperature(char TH,char TL,unsigned char RS)
{ unsigned char tt[2];
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x4E); // //写入"写暂存器"命令,修改TH和TL和分辩率配置寄存器
//先写TH,再写TL,最后写配置寄存器
WriteOneChar(TH); //写入想设定的温度报警上限
WriteOneChar(TL); //写入想设定的温度报警下限
WriteOneChar(RS); //写配置寄存器,格式为0 R1 R0 1,1 1 1 1
//R1R0=00分辨率娄9位,R1R0=11分辨率为12位
delay_18B20(80); // this message is wery important
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
28
delay_18B20(80); // this message is wery important
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
delay_18B20(80);
tt[0]=ReadOneChar(); //读取温度值低位
tt[1]=ReadOneChar(); //读取温度值高位
return(tt);
}
9.3消毒柜硬件连接图
29
30
指导教师
评 语
课程设计 指导教师
成 绩 签 字
年 月 日
31