基于STC89C52单片机的LED温度计设计.docx
- 文档编号:4519261
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:15
- 大小:429.64KB
基于STC89C52单片机的LED温度计设计.docx
《基于STC89C52单片机的LED温度计设计.docx》由会员分享,可在线阅读,更多相关《基于STC89C52单片机的LED温度计设计.docx(15页珍藏版)》请在冰豆网上搜索。
基于STC89C52单片机的LED温度计设计
目录
1.、设计的任务与要求2
1.1系统设计的背景2
1.2理论基础2
2、总体设计和系统框图2
2.1温度采集模块3
2.2温度显示模块3
3、设计方案4
3.1硬件系统设计4
3.1.1供电电路设计4
3.1.4温度采集模块设计4
3.1.5显示电路5
3.2软件系统设计6
3.2.1DS18B20的读写时序6
3.2.2程序流程图7
4、硬件原理图8
5、系统仿真和调试9
6.程序源代码9
7、设计结果分析14
8、设计总结和体会15
9、参考文献16
附录一:
硬件原理图17
摘要
本文介绍了采用51系列单片机和DS18B20温度传感器,实现数字温度测量,用数码管把温度实时显示出来,温度以两位整数位和一位小数位的形式显示。
本系统主要包括供电模块、单片机最小系统模块、DS18B20温度采集模块和LED数码管显示模块。
关键词:
51单片机DS18B20LED
1.、设计的任务与要求
1.1系统设计的背景
温度的测量广泛的应用在工农业生产和社会生活中,由于工农业的发展要求温度的测量的精度和实时性提出了更高的要求,传统的水银温度计和热电偶等,存在测量不方便、精度低、采集和传输较复杂等缺点。
本设计采用美国Dallas公司的DS18B20和stc89c52单片机构成温度测量系统,用LED数码管实时显示温度,具有更高的智能性和直观性。
1.2理论基础
要较好的设计出温度计,需要我们深入的了解DS18B20温度传感器的构造、接线、信息沟通,要较好的掌握51系列单片机的使用以及硬件搭建,LED数码管的显示原理以及与单片机的连接。
要找出一个较好的温度采集方案,使得到的温度更加准确。
2、总体设计和系统框图
包括方案比较、方案论证、方案选择(以方框图的形式给出各方案,并简要说明)
为了以数字的形式来显示采集的温度我们需要以一个单片机来处理数据,由于对单片机的性能要求不是很高,我们采用51系列单片机来处理数据,系统总体方框图如图1。
图1
2.1温度采集模块
采用DS18B20温度传感器,DS18B20输出的量为数字量,只要按特定的时序读出数值就可获得温度数据,电路较为简单且成本较低,DS18B20如图3所示,所以选择方案二。
图3DS18B20
2.2温度显示模块
采用LED数码管显示,虽然占用了单片机较多的时间,但数码管显示的较清晰,且价格较便宜连接电路简单。
3、设计方案
3.1硬件系统设计
51系列单片机性能稳定价格便宜功耗低,使用于在较低应用下的智能系统的设计。
3.1.1供电电路设计
该单片机的正常工作电压为+5V,可以由外界直接输入+5V电压,此单片机采用USB供电。
图4供电电路
3.1.4温度采集模块设计
本系统采用DS18B20作为温度采集芯片,DS18B20通过一个单线接口发送或接收信息,因此在中央微处理器和DS18B20之间仅需一条连接线,每只DS18B20都有一个独特的片序列号,所以多只DS18B20可以同时连在一根单线总线上。
DS1820依靠一个单线端口通讯。
在单线端口条件下,必须先建立ROM操作协议,才能进行存储器和控制操作。
因此,控制器必须首先提供下面5个ROM操作命令之一:
1)读ROM,2)匹配ROM,3)搜索ROM,4)跳过ROM,5)报警搜索。
这些命令对每个器件的激光ROM部分
进行操作,在单线总线上挂有多个器件时,可以区分出单个器件,同时可以向总线控制器指明有多少器件或是什么型号的器件。
成功执行完一条ROM操作序列后,即可进行存储器和控制操作,控制器可以提供6条存储器和控制操作指令中的任一条。
一条控制操作命令指示DS1820完成一次温度测量。
测量结果放在DS1820的暂存器里,用一条读暂存器内容的存储器操作命令可以把暂存器中数据读出。
硬件电路设计如图7所示。
图7DS18B20硬件连接
3.1.5显示电路
我们最常用的是七段式和八段式LED数码管,八段比七段多了一个小数点,所谓的八段就是指数码管里有八个小LED发光二极管,通过控制不同的LED的亮灭来显示不同的字形。
数码管又分为共阴极和共阳极两种,共阴极就是将八个LED的阴极连在一起,让其接地,这样给任何一个LED的另一端高电平,它便能点亮。
共阳极就是将八个LED的阳极连在一起。
其原理图如图9所示。
图9LED原理图
3.2软件系统设计
3.2.1DS18B20的读写时序
图10初始化过程复位和存在脉冲
图11控制器写时序
图12控制器读时序
3.2.2程序流程图
图13系统流程图
4、硬件原理图
5、系统仿真和调试
在仿真过程中温度由高到零下,然后又由零下调到零上,观察到数码管显示的温度可以很好的跟踪温度的变化。
具有较好的灵活性和准确性。
仿真过程中的两个截图如下。
图14仿真截图1
图15仿真截图2
6.程序源代码
在仿真过程中观察到数码管显示的温度可以很好的跟踪温度的变化。
具有较好的灵活性和准确性。
程序源代码如下。
#include
#include
sbitp1_1=P1^0;
sbitDS=P3^3;
unsignedinta,i;
unsignedcharduma[]={0x28,0xF9,0x4C,0x58,0x99,0x1A,0x0B,0xF8,0x08,0x98,0x88,0x08,0x2E,0x28,0x0E,0x8E,0xF7};
unsignedcodewema[]={0x7F,0xBF,0xDF,0xEF};
unsignedbaiwei,shiwei,gewei,dianhou;
#defineucharunsignedchar//将unsignedchar定义为uchar,简化输写。
提高编程速度
#defineuintunsignedint//将unsignedchar定义为uint,简化输写。
提高编程速度
/*延时子程序10ms*/
voiddelay5ms()
{
uchara,b;
for(a=20;a>0;a--)
for(b=30;b>0;b--);
}
/*延时子程序*/
voiddelayb(uintcount)
{
uinti;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
/*DS18B20初始化*/
voiddsreset(void)
{
uinti;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}
/*读一位数据值*/
bittmpreadbit(void)
{
uinti;
bitdat;
DS=0;i++;//i++,小延时一下
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return(dat);
}
/*读一个字节数据*/
uchartmpread(void)
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好//一个字节在DAT里
}
return(dat);//将一个字节数据返回
}
/*写一个字节到DS18B20里*/
voidtmpwritebyte(uchardat)
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//写1部分
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0;//写0部分
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
/*获取温度并转化命令*/
voidtmpchange(void)
{
dsreset();//初始化DS18B20
delayb
(1);//延时
tmpwritebyte(0xcc);//跳过序列号命令
tmpwritebyte(0x44);//发送温度转换命令
}
/*读取DS18B20中温度寄存器数据*/
voidget_temp(void)
{
floatftemp;
uchara,b;
inttemp;
dsreset();
delayb
(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);//发送读取数据命令
a=tmpread();//连续读两个字节数据,读低8位
b=tmpread();//读高8位
temp=b;
temp<<=8;//temp高8位和低8位交换,将交换过的值重新赋给temp。
temp=temp|a;//两字节合成一个字
ftemp=temp*0.0625;//得到真实十进制温度值,因为DS18B20可以精确到0.062度
//所以读回数据的最低位代表的是0.0625度
temp=ftemp*10+0.5;//放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。
baiwei=temp/1000;//显示百位温度,这里用1000,是因为我们之前乖以10位了
delayb
(1);
shiwei=temp%1000/100;//显示十位温度
delayb
(1);
gewei=temp%1000%100/10;//显示个位温度。
delayb
(1);
dianhou=temp%10;//显示小数点后温度
}
voiddisplay(ucharnum,uchardat)
{
P0=duma[dat];//段码
P2=wema[num];//位码
}
voiddelay1(uintx)
{
uinta,b;
for(a=x;a>0;a--)
for(b=50;b>0;b--);
}
voiddis_temp()
{
display(2,shiwei);
delay1
(1);
display(1,gewei);
delay1
(1);
display(1,16);//显示小数点
delay1
(1);
display(0,dianhou);
delay1
(1);
}
voidmain()
{
while
(1)
{
tmpchange();//温度转换
get_temp();
for(i=25;i>0;i--)//让数码管显示更加清晰
{dis_temp();}
}
7、设计结果分析
仿真过程中调节温度,数码管显示的温度可以很好的跟着变化,小数点后显示一位,达到预定的目标。
器件一览表如表1
器件名称
数量
Stc89c52单片机
1个
晶振11.0592MHZ
1个
10uf有极性电容
1个
开关
1个
阻排
1个
8段共阳数码管
4个
DS18B20温度传感器
1个
8、设计总结和体会
通过对这一系统的设计,我们对以前所学的知识有了更深的了解,懂得了以前基础学习的重要性,在这一设计过程中我们查阅了大量地资料,并对以往所学进行了系统性的复习和总结。
今后我们会更加注重基础知识的学习。
设计过程中我们小组三人展开了密切的合作并明确了分工,其中xxx完成了硬件电路的分析设计和proteus7.0仿真环境的学习并很好的为本设计作好了仿真的工作,xxx为本设计绘制了protell99电路原理图和参加了仿真的部分设计工作,xxx学习和编写了在KEIL环境下的51单片机软件的设计,在设计过程中组内三人展开了热烈的讨论,遇到问题共同探讨,在指导老师的指导下,成功的完成了LED温度计的设计,取得了较好的效果。
设计过程中我们采取了创新性的设计,我们并没有让LED一直都亮,而是采取了闪烁的形式,不仅降低了功耗,而且延长了LED数码管的寿命。
本系统还可以采用干电池供电,从而系统具有较好的可携带性。
本系统中我们的设计是采取有线的设计,单片机和DS18B20是在一起的,由于时间仓促,如果近一步研究,我们想把有线的设计改成无线的设计,我们把温度传感器和单片机之间以无线的方式相连,把较多温度传感器的数据采集到主控单片机,可以检测到更多的温度数据,对于温度的控制和分析具有更高的价值和科学性。
9、参考文献
[1]康华光电子技术基础模拟部分(第五版)高等教育出版社
[2]康华光电子技术基础数字部分(第五版)高等教育出版社
[3]胡寿松自动控制原理第五版科学出版社
[4]田裕鹏,姚恩涛,李开宇 传感器原理科学出版社2007-9-1
[5]闫玉德,俞虹51单片机原理与应用:
C语言版机械工业出版社2004-7-1
[6]刘荣科51单片机C语言应用与开发北京航空航天大学出版社2010-9-1
附录一:
硬件原理图
该原理图在protell99se下绘制
附录二:
proteus仿真图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 STC89C52 单片机 LED 温度计 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)