昆明理工大学单片机原理期末报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

相关文档
最新文档