昆明理工大学单片机原理期末报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DS18B20数字测温传感器体温计制作
学院:信息工程与自动化
专业:通信工程
班级:通信111班
姓名:
学号:201110404139
成绩:
日期:2014.6.11
课程设计概述:
通过AT89C51单片机C语言程序的编写,实现一个最简单的数字测温传感器的实例化运用,能够测量人体温度。
设计题目: DS18B20数字测温传感器体温计制作
设计意义:
利用DS18B20温度传感器实现简单的温度测量,方便于生活中常见的体温的测量。
设计任务
通过简单的编程,实现一个简单的体温计温度显示功能,当超过人体体温38℃的时候会发出声响。
设计内容
利用DS18B20温度传感器测量温度,并用数码管显示当前温度值。
正文
题目:DS18B20数字测温传感器温度计制作
摘要:当测量一个体温值时,超过了正常的体温(38℃)时候会发出报警,提示人们该体温不正常,需要治疗了,此体温计的设计阈值为38摄氏度,通过数码管显示出温度值。
关键词:体温、DS18B20、数码管、单片机
1、引言
通过AT89C51单片机编程,控制读取DS18B20传感器数据,显示在数码管上,当超过38℃时蜂鸣器会报警。
2、系统总体构成
AT89C51单片机、杜邦线、蜂鸣器、数码管、DS18B20温度传感器
3、系统硬件设计
AT89C52单片机默认为接好VCC和GND,所以proteus仿真中没有画出,利用单片机的P0口实现数码管的段选通控制,P2.0—P2.3实现对数码管的位选通和地址锁存,P2.4实现对蜂鸣器的控制操作,P3.0实现对DS18B20数据的读取。
4、系统软件设计
C语言源码如下:
#include
sbit DQ=P3^0;
sbit beep=P2^4;
unsigned int temp;
unsigned char dis[4]={0,0,0,0};
unsigned char
led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0xff,0xbf};
//分别为0-9,不显示,负号
unsigned char led1[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带小数点显示
void delay(unsigned int i) //如果i是unsigend char类型,则会出现错误结果
{
while(i--);
}
void Init(void)//初始化函数
{
//unsigned char flag=0;
DQ = 0; //单片机将DQ拉低
delay(100); //精确延时大于480us小于960us
DQ = 1; //拉高总线
delay(30);
//flag=DQ; //稍做延时后如果flag=0则初始化成功flag=1则初始化失败//delay(20);
}
unsigned char Read(void)//读字节程序
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay(5);
}
return(dat);
}
void Write(unsigned char dat)//写字节程序
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
}
void Display(unsigned int temp) //数码管显示程序
{
if(temp<=0x0800)
{ temp>>=4; //右移4位,相当于乘0.0625,将温度化为十进制temp*=10; //扩大10倍,显示一位小数
dis[0]=temp/1000; //千位
dis[1]=temp%1000/100; //百位
dis[2]=temp%1000%100/10; //十位
dis[3]=temp%1000%100%10; //个位
}
else
{
temp=~temp;
temp+=1;
temp>>=4;
dis[0]=0x0c; //负数
dis[1]=temp%100/10; //百位
dis[2]=temp%100%10; //十位
dis[3]=0; //个位
}
P2=0x01; //先片选,在段选,反过来就不能正常显示
P0=led[dis[0]];
delay(200);
delay(200);
P2=0x02;
P0=led[dis[1]];
delay(200);
delay(200);
P2=0x04;
P0=led1[dis[2]];
delay(200);
delay(200);