基于51单片机的数字温度计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于AT89S51的温度计
院系:电气与信息工程学院
专业:****
班级:****
学生姓名:****
学号:****
日期:2012年11月11号第一部分设计要求:
采用AT89C51单片机和LCD液晶显示器设计一个数字温度计,当外界温度变化时,显示屏上的温度值也随着变化。数字温度计的测温范围为-55°C到125°C之间。第二部分硬件原理框图:
AT89C51单片机
LCD液晶显示电路
晶振振荡电路
复位电路
温度传感器采集电路
电源电路
硬件部分主要分为晶振振荡电路、复位电路、LCD液晶显示电路、DS18B20温度传感器采集电路、电源电路等部分组成。
第三部分硬件原理图:
硬件模块原理图:
1、晶振振荡电路
该电路是由两个电容和一个晶振组成,晶振产生基本的时钟信号它给单片机提供时钟信号。
2、复位电路
复位的主要作用是把特殊功能寄存器的数据刷新为默认数据,单片机在运算过程中由于干扰等外界原因造成寄存器中数据混乱不能使其正常继续执行程序或产生的结果不正确时均需要复位,以使程序重新开始运行。
3、LCD液晶显示电路
经过温度传感器,将采集到的温度信息传给单片机,单片机处理后又将信息发给P0口,P0口与LCD的数据口相连接,液晶屏上会显示采集到的温度值。
4、温度传感器采集电路
单线数字温度传感器DS18B20测量温度范围为 -55°C~+125°C,-10~+85°C范围内,精度为±0.5°C。DS1822的精度较差为± 2°C 。DS18B20的管脚排列如下: DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端(在寄生电源接线方式时接地)。根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。复位要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。5、电源电路
设计中利用桥式整流和电容滤波以及7805集成稳压来输出+5V电压,以满足AT89C51、LCD1602、DS18B20等器件的工作需求,原理如下:
第四部分程序流程图
发温度转换开始命令
结束
图2 温度转换命令子程序流程图
N
图1 主程序流程图
第五部分总结:
在本次设计的过程中,我查阅了许多文献资料,从中学到了很多有关系统开发和程序调试方面等的知识。在软件开发过程中掌握了一些技术难题的解决方法和技巧,巩固和加深了所学知识的理解,能够把所学的知识与实践相结合,培养了认真严谨的学习态度,为以后开发软件积累了大量的经验,提高了分析问题和解决问题的能力。但是由于认识上的片面和不足,各方面的条件影响也很多,本设计还有待进一步的完善和优化,这些在以后的学习中要注重积累。
第六部分主要程序
#include
#include
#define uint unsigned int
#define uchar unsigned char
#definedelayNOP() {_nop_();_nop_();_nop_();_nop_();}//_nop_()为一个机器周期
sbit DQ = P3^3;
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
uchar code Temp_Disp_Title1[]="Now Temperature:";//液晶第一行显示的字符uchar Temp_Display_Title2[]=" TEMP: ";//第二行前半部分显示的字符
uchar code Temperature_Char[8] =
{
0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00
};
uchar code df_Table[]=
{
0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9
};
uchar CurrentT = 0;
uchar TL,TH;
uchar Display_Digit[]={0,0,0,0};
bit DS18B20_IS_OK = 1;
void DelayXus(uint x)
{
uchar i;
while(x--)
{
for(i=0;i<200;i++);
}
}
bit LCD_Busy_Check()//对LCD进行读写状态检测
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN=0;
return result;
}
void Write_LCD_Command(uchar cmd)//LCD写指令函数
{
while(LCD_Busy_Check());//当LCD_Busy_Check为1时 LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
void Write_LCD_Data(uchar dat)//LCD写数据函数
{
while(LCD_Busy_Check());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();