单片机课程设计论文.docx
《单片机课程设计论文.docx》由会员分享,可在线阅读,更多相关《单片机课程设计论文.docx(25页珍藏版)》请在冰豆网上搜索。
单片机课程设计论文
单片机课程设计
题目基于51单片机的温度控制系统设计
学院工学院
专业2012级农业电气化与自动化
学号2012094055
姓名张盼
指导教师高晓阳杨梅
二零一五年七月二十三日
摘要:
本文主要介绍了一个基于AT89C51单片机的数字温度报警器系统。
详细描述了利用数字温度传感器DS18B20开发测温系统的过程,重点对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽分析,对各部分的电路也一一进行了介绍,该系统可以方便的实现温度的采集和报警,并可以根据需要任意上下限报警温度,它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当做温度处理模块潜入其他系统中,作为其他主系统的辅助扩展。
DS18B20与AT89C51结合实现最简温度报警系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。
关键词:
单片机;温度检测;AT89C51;DS18B20;
1绪论
1.1设计题目
基于51单片机的温度控制显示电路设计。
1.2课题设计内容
本设计主要介绍了用单片机和数字温度传感器DS18B20相结合的方法来实现温度的采集,以单片机AT89C51芯片为核心,辅以温度传感器DS18B20和LCD数码显示器及必要的外围电路,构成了一个多功能单片机数字温度计。
该装置适用于人民的日常生活和工、农业生产的温度测量与报警,实现对温度的监测。
其主要研究内容包括两方面,一是对系统硬件部分的设计,包括温度采集电路和显示电路;二是对系统软件部分的设计,应用C语言实现温度的采集与显示。
通过利用数字温度传感器DS18B20进行设计,能够满足实时检测温度的要求,同时通过LCD数码显示器的显示功能,可以实现不间断的温度显示,并带有复位功能。
本次设计的主要思路是利用51系列单片机,数字温度传感器DS18B20和LCD数码显示器,构成实现温度检测与显示的单片机控制系统,即数字温度计。
通过对单片机编写相应的程序,达到能够实时检测周围温度的目的。
通过对本课题的设计能够熟悉数字温度计的工作原理及过程,了解各功能器件(单片机、DS18B20、LCD)的基本原理与应用,掌握各部分电路的硬件连线与程序编写,最终完成对数字温度计的总体设计。
根据实验要求实现测温范围在25-50℃,误差在±0.5℃以内的LCD液晶屏显示。
2系统方案设计
2.1设计任务和要求
本次课程设计课题是数字温度计的设计,设计任务为:
(1)根据设计要求,选用AT89C51单片机为核心器件;
(2)温度检测器件采用DS18B20数字式温度传感器,利用单总线式连接方式与单片机的串行接口P3.2引脚相连;
(3)显示电路采用LCD数码显示器接P0口并行显示温度值,由P1口(P1.0~P1.3)选通,动态显示。
(4)给出全部电路和源程序。
2.2设计方案
根据系统的设计要求,选择DS18B20作为本系统的温度传感器,选择单片机AT89C51为测控系统的核心来完成数据采集、处理、显示、报警等功能。
选用数字温度传感器DS18B20,省却了采样/保持电路、运放、数/模转换电路以及进行长距离传输时的串/并转换电路,简化了电路,缩短了系统的工作时间,降低了系统的硬件成本。
该系统的总体设计思路如下:
温度传感器DS18B20把所测得的温度发送到AT89C51单片机上,经过51单片机处理,将把温度在显示电路上显示,本系统显示器用LCD数码显示器以动态扫描法实现。
检测范围25摄氏度到50摄氏度。
按照系统设计功能的要求,确定系统由3个模块组成:
主控制器、测温电路和显示电路。
数字温度计总体电路结构框图如图2.1所示。
按键电路
图2-1数字温度计总体电路结构框图
3电路设计
3.1主控电路
图3-1主控电路
3.2温控电路
温度采样单元,如图3-2所示,用于采集被控对象的温度参数。
图3-2温控电路
广义来讲,一切随温度变化而物体性质亦发生变化的物质均可作为温度传感器。
例如,我们平常使用的各种材料、元件,其性质或多或少地都会随其所处的环境温度变化而变化,因而它们几乎都能作为温度传感器使用。
但是,一般真正能作为实际中可使用的温度传感器的物体一般需要具备下述条件:
1.物体的特性随温度的变化有较大的变化,且该变化量易于测量。
2.对温度的变化有较好的一一对应关系,即对除温度外其他物理量的变化不敏感。
3.性能误差及老化小、重复性好,尺寸小。
4.有较强的耐机械、化学及热作用等的特点。
5.与被检测的温度范围和精度相适应。
6.价格适宜,适合于批量生产。
符合上述条件的常用温度传感器有热电偶、热电阻、光辐射温度计、玻璃温度计、半导体集成温度传感器等。
3.3显示电路
数码显示原理:
利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。
液晶显示器具有厚度薄、适用于大规模集成电路直现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
线段的显示:
点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有28列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。
例如屏的第一行的亮暗由RAM区的000H——00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,……(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。
这就是LCD显示的基本原理。
图3-3显示电路
3.4按键电路
图3-4按键电路
按键控制电路这一模块设置了:
“加1”、“减1”、“复位”三个按键,来实现人机对话。
人为地设定温度门限值,使电路在人为设定的某一温度值相对稳定的工作。
3.5复位电路
图3-5复位电路
3.6报警电路
图3-6报警电路
4程序设计
4.1各部分程序设计及其子程序流程图
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,报警子程序和显示数据刷新子程序等。
(1)主程序:
主程序的主要功能是负责温度的实时显示,读出并处理DS18B20的测量温度值。
温度测量每5s进行一次。
主程序流程图如图4.1所示。
图4-1主程序流程图
(2)读出温度子程序:
读出温度子程的主要功能是读出RAM中的9字节。
在读出时须进行CRC校验,校验有错时不能进行温度数据的改写。
读出温度子程序流程图如图4.2所示。
图4-2温度子程序流程图
温度转换命令子程序:
温度转换命令子程序主要是发温度转换开始命令。
当采用12位分辨率时,转换时间约为750ms。
在本程序设计中,采用5s显示程序延时法等待转换的完成。
温度转换命令子程序流程图如图4.3所示。
图4-3温度转换子程序流程图
计算温度子程序:
计算温度子程序将RAM中读取的值进行十进制的转换运算,并进行温度值正负的判断。
其流程图如图4.4所示。
图4-4计算温度子程序流程图
显示数据刷新子程序:
显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高数据显示位为0时,将符号显示位移入下一位。
显示数据刷新子程序流程图如图4.5所示。
图4-5显示数据刷新子程序流程图
4.2温度采集DS18B20部分程序设计分析
由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。
系统对DS18B20的一般操作过程为:
初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。
初始化:
单片机将数据线拉低480-960us后释放,等待15-60us,单总线器件即可输出一个持续时间为60-240us的低电平(应答信号),单片机收到此应答后即可进行后续操作;
写时序:
当主机将数据线的电平从高拉到低时,形成写时序,有写0和写1两种时序。
写时序开始后,DS18B20在15-60us期间从数据线上采样,如果采样到低电平,则向DS18B20写0,否则写1,两个独立的时序之间至少需要1us的回复时间按(拉高总线电平);
读时序:
当主机从DS18B20读取数据时,产生读时序,此时,主机将数据线的电平从高拉到低使读时序被初始化。
如果此后5s内,主机在总线上采样到低电平,则从DS18B20读0,否则读1。
5总结
这次为期两周的单片机课程设计让我学到很多东西。
首先,我们的课题难度较大,涉及的某些内容是我们从来没有学习过的,比如:
单总线传输(使用DS18B20)、使用Proteus仿真。
这就要求我们自己去收集资料,并且独立自主地学习。
经过此次课程设计,我收获很多,在原来了解相关的单片机理论知识的基础上,通过自己的动手实践,理论与实践的结合使得对知识的理解更加深刻,并且慢慢学会培养自己的创新精神,感觉很有成就感,但同时我又了解到自己在单片机方面还有很多不足,尤其是单片机指令系统及AT89C51各引脚的第二功能等等知识不够了解,因此在设计中遇到了很多不懂的知识,我会主动地查资料或请教老师和同学,而这些问题也渐渐得到解决。
从查资料找合适的方案和电路开始,到编写并调试程序,Proteus仿真,都是由我们自己完成。
途中遇到了很多问题,比如:
修改程序使之符合自己的电路并调试成功等。
每一步都有可能出现问题,我们所做的就是迎接问题,改正错误,使自己的作品更加完善。
在做单片机课程设计的过程中,我对单片机的工作原理有了更深一步的体会,在编程时自学了DS18B20的工作原理,学习使用Keil与Proteus软件并进行联合仿真,复习了LCD液晶数码管动态显示和二进制转换为十进制的程序设计。
在找资料的过程中,我接触到一个精彩纷呈的单片机世界,这激发了我对单片机的学习热情,也为我以后的学习生活指明了奋斗目标和方向。
在今后的学习生活中,我会记住在实验过程中的经验教训,争取获得更大的进步。
实验过程中,使我更加扎实的掌握了有关单片机的基础知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。
实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。
过而能改,善莫大焉。
在课程设计过程中,我不断发现错误,不断改正,不断领悟,不断获取。
最终的调试运行环节,本身就是在践行“过而能改,善莫大焉”的知行观。
这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于迎刃而解。
此次设计也让我明白有什么不懂不明白的地方要及时请教老师和同学或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获就多。
在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!
参考文献
[1]谢自美.电子线路设计.实验.测试[M].武汉:
华中科技大学出版,2000.
[2]郁有文等.传感器原理及工程应用[M].西安:
西安电子科技大学出版社,2003.
[3]何立民等.单片机实验与实践教程[M].北京:
北京航空航天大学出版社,2004.
[4]松井邦彦.传感器实用电路设计与制作[M].北京:
科学出版社,2005.
[5]彭介华.电子技术课程设计指导[M].北京:
高等教育出版社,2005.
[6]李全利,仲伟峰,徐军著.单片机原理及应用.北京:
清华大学社,2006.
[7]华成英,童诗白.模拟电子技术基础(第四版)[M].北京:
高等教育出版社,2006.
[8]康华光.电子技术基础数字部分(第五版)[M].北京:
高等教育出版社,2006.
[9]钟富昭著.8051单片机典型模块设计与应用.北京:
人民邮电出版,2007.
[10]张一斌等.单片机课程设计指导[M].长沙:
中南大学出版社,2009.
[11]张毅刚,彭喜元,彭宇.单片机原理及应用.高等教育出版社,2011.
附录一程序设计
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P3^2;//ds18b20与单片机连接口
sbitRS=P1^0;RS定义为p1.0接口
sbitRW=P1^1;RW定义为p1.1接口
sbitEN=P1^2;EN定义为p1.2接口
sbitPSB=P1^6;
sbitzeng=P3^4;加键输入定义为p3.4
sbitjian=P3^5;减键输入定义为p3.5
sbitbeep=P1^5;蜂鸣器输出接口定义为p1.6
sbithigh=P2^7;
sbitlow=P2^6;
sbitjiare=P2^5;
sbitJDQ=P1^4;继电器输出定义为端口p1.4
unsignedcharcodestr1[]={"Temperature:
"};
unsignedcharcodestr2[]={""};
bitflag;
uchardatadisdata[5];
uinttvalue;//温度值
uchartflag;//温度正负标志
uintsetvalue;//设置温度
/*************************lcd1602程序**************************/
voiddelay1ms(unsignedintms)定义延时
{unsignedinti,j;
for(i=0;ifor(j=0;j<100;j++);
}
voidwr_com(unsignedcharcom)//写指令//
{delay1ms
(1);
RS=0;RS复位
RW=0;RW复位
EN=0;使能端低电平
P0=com;定义变量
delay1ms
(1);延时1ms
EN=1;使能端干电平
delay1ms
(1);延时1ms
EN=0;使能端低电平
}
voidwr_dat(unsignedchardat)//写数据//
{
RS=1;RS置位
RW=0;RW复位
EN=0;使能端为低电平
P0=dat;定义数据变量
delay1ms
(1);延时1ms
EN=1;使能端为高电平
delay1ms
(1);延时1ms
EN=0;使能端为低电平
}
voidlcd_init()//初始化设置//
{delay1ms(15);延时15ms
wr_com(0x38);delay1ms(5);//设置液晶工作模式,意思:
16*2行显示,5*7点阵,8位数据
wr_com(0x08);delay1ms(5);
wr_com(0x01);delay1ms(5);//清显示
wr_com(0x06);delay1ms(5);;//整屏不移动,光标自动右移
wr_com(0x0c);delay1ms(5);//开显示不显示光标
}
voiddisplay(unsignedchar*p)//显示//
{
while(*p!
='\0')表示显示内容不为空时执行循环体代码段或者理解成判断显示内容是否到达结尾了。
{
wr_dat(*p);
p++;
delay1ms
(1);
}
}
init_play()//初始化显示
{lcd_init();
wr_com(0x80);
display(str1);
wr_com(0xc0);
display(str2);
}
/*********************ds18b20程序***********************/
voiddelay_18B20(unsignedinti)
{
while(i--);
}
voidds1820rst()/*ds18b20复位*/
{unsignedcharx=0;
DQ=1;//DQ复位
delay_18B20(4);//延时
DQ=0;//DQ拉低
delay_18B20(100);//精确延时大于480us
DQ=1;//拉高
delay_18B20(40);
}
uchards1820rd()/*读数据*/
{unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
voidds1820wr(ucharwdata)/*写数据*/
{unsignedchari=0;
for(i=8;i>0;i--)
{DQ=0;
DQ=wdata&0x01;
delay_18B20(10);
DQ=1;
wdata>>=1;
}
}
voidkey_trans()interrupt2
{flag=1;
}
read_temp()/*读取温度值并转换*/
{uchara,b;
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue>0x0&&tvalue<0x032){tflag=0;}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
voidds1820disp(uintvalue)//温度值显示
{ucharflagdat;
disdata[0]=value/1000+0x30;//百位数
disdata[1]=value%1000/100+0x30;//十位数
disdata[2]=value%100/10+0x30;//个位数
disdata[3]=value%10+0x30;//小数位
if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号
if(disdata[0]==0x30)
{disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
{disdata[1]=0x20;//如果百位为0,十位为0也不显示
}
}
wr_com(0xc0);
wr_dat(flagdat);//显示符号位
wr_com(0xc1);
wr_dat(disdata[0]);//显示百位
wr_com(0xc2);
wr_dat(disdata[1]);//显示十位
wr_com(0xc3);
wr_dat(disdata[2]);//显示个位
wr_com(0xc4);
wr_dat(0x2e);//显示小数点
wr_com(0xc5);
wr_dat(disdata[3]);//显示小数位
}
/*************************beep*******************************/
voidbeeper()
{chari;
beep=1;
for(i=0;i<10;i++)
{beep=!
beep;
delay1ms(100);
}
}
/******************************T0interrupt******************/
T0_int()interrupt1
{
read_temp();//读取温度
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
/********************主程序***********************************/
voidmain()
{zeng=1;增1
jian=1;减一
low=1;低1
high=1;高1
jiare=1;加热以1为单位
JDQ=1;继电器动作1
setvalue=25;
IP=0x04;
IE=0x84;
TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
ET0=1;
TR0=1;
setvalue=setvalue*10;
init_play();//初始化显示
while
(1)
{
if(flag==1)
{ds1820disp(setvalue);//显示
flag=0;
}
elseif(zeng==0)
{delay1ms(500);
setvalue++;
if(setvalue>500)
setvalue=250;
ds1820disp(setvalue);
}
elseif(jian==0)
{delay1ms(500);
setvalue--;
if(setvalue<250)
setvalue=500;
ds1820disp(setvalue);
}
else{ds1820disp(tvalue);
if(tvalue>600){high=0;beeper();high=1;}
if(tvalue<200){low=0;beeper();low=1;}
if(tvalueelse{jiare=1;JDQ=1;}
}
}
}
附录二
1.总电路图
2PCB图
3元件清单
序号
编号
名称
型号
数量
1
R1
电阻
10K
1
2
R2
电阻
1K
1
3
R21
电阻
5.1K
1
4
RP1
排阻
103
1
5
C1、C2
电容
22PF
2
6
C3
电容
100uF