B温度传感器蜂鸣器实验.docx
《B温度传感器蜂鸣器实验.docx》由会员分享,可在线阅读,更多相关《B温度传感器蜂鸣器实验.docx(15页珍藏版)》请在冰点文库上搜索。
B温度传感器蜂鸣器实验
学年论文
(课程论文、课程设计)
题目:
DS18B20温度传感器,蜂鸣器实验
姓名
学号:
所在学院:
专业年级:
2015年9月21日
DS18B20传感器介绍
数码管显示数字的基本原理
电路的连接方法
系统功能图
电路的连接方法
4.
1.绪论
本论文的背景
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便是不可否定的,各种数字系统的应用也使人们的生活更加舒适。
数字化控制、智能控制为现代人的工作、生活、科研等方面带来方便。
其中数字温度计就是一个典型的例子。
数字温度计与传统的温度计相比,具有读数方便、测温范围广、测温精确、功能多样话等优点。
其主要用于对测温要求准确度比较高的场所,或科研实验室使用,该设计使用STC89C52单片机作控制器,数字温度传感器DS18B20测量温度,单片机接受传感器输出,经处理用LED数码管实现温度值显示。
关于AT89C52单片机基本概念
1)、何谓单片机一台能够工作的计算机要有这样几个部份构成:
CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入/输出设备(例如:
串行口、并行输出口等)。
在个人计算机上这些部份被分成若干块芯片,安装一个称之为主板的印刷线路板上。
2)、MCS51单片机和8051、8031、89C51等的关系我们平常老是讲8051,又有什么8031,现在又有89C51,它们之间究竟是什么关系?
MCS51是指由美国INTEL公司(对了,就是大名鼎鼎的INTEL)生产的一系列单片机的总称,这一系列单片机包括了好些品种,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的产品,该系列其它单片机都是在8051的基础上进行功能的增、减、改变而来的,所以人们习惯于用8051来称呼MCS51系列单片机,而8031是前些年在我国最流行的单片机,所以很多场合会看到8031的名称。
使用的软件介绍
单片机的程序设计需要在特定的编译器中进行。
编译器完成对程序的编译、连接等工作并且最终生成可执行文件(.hex文件)。
对单片机程序的开发,一般采用Keil公司的μVision系列的集成开发环境。
μVision开发工具当前的最高版本是μVision4,它支持汇编语言以及C51语言的程序设计。
本章主要介绍μVision4集成开发环境,以及如何运用Vision4集成开发环境进行单片机程序设计与仿真。
KeilμVision系列是非常优秀的编译器,受到广大单片机设计者的广泛使用。
其特点如下:
●☆支持汇编语言、C语言等多种单片机设计语言;
●☆可视化的文件管理,界面友好;
●☆支持丰富的产品线,除了51以及兼容的单片机内核外,还增加了对ARM核产品的支持;
●☆具有完备的编译连接工具;
●☆具备丰富的仿真调试功能,可以仿真并口、串口、定时/计数器、中断、D/A和A/D资源;
●☆内嵌RTX-51实时多任务操作系统;
●☆支持在一个工作空间中进行多项目的程序设计;
●☆支持多极代码优化
本论文的主要内容
基于单片机的DS18B20数字温度计设计。
单片机蜂鸣器设计。
更理解单片机怎样设计电路,理解单片机怎样用,为毕业设计建立了一个基础。
2基于单片机的DS18B20温度传感器用数码管显示温度
DS18B20传感器介绍
~独特的单线接口仅需一个端口引脚进行通信
~简单的多点分布应用
~无需外部器件
~可通过数据线供电
~测温范围-55~+125℃,以℃递增
~可编程的分辨率为9~12位,对应的可分辨温度分别为℃、℃、℃和℃
~应用包括温度控制、工业系统、消费品、温度计和任何热感测系统
~负压特性:
电源极性接反时,传感器不会因发热而烧毁,但不能正常工作
2.2.DS18B20外形及引脚说明
图3DS18B20外形及引脚
GND:
地
DQ:
单线运用的数据输入/输出引脚
VD:
可选的电源引脚
数码管显示数字的工作原理介绍
数码管是一种常用数字显示原件,其内部是由多个并联的Led灯构成。
按照连接led的公共端的不同可以分为:
共阴极数码管、共阳极数码管两种。
数码管按照顺序依次排列,有数学里个位、十位、百位、千位……,对应与每一位数码管就有数码管的为选概念,共阳极数码管高电平选通,共阴极数码管低电平选通;对于单个的数码管每一个笔划,国际上有统一的规范,按顺时针顺序排列:
a、b、c、d、e、f、g、h是数码管的段信号。
由此差别就晓得数码管的单片机控制方法了。
图数码管示意图
首先使用Proteus绘制数码管显示电路,先添加数码管原件,此处绘制电路选用共阴极数码管。
单机键盘P的快捷键调出原件对话框,输入7seg就可以看到:
6位的数码管单个数码管的形状如上图所示:
内部由8个LED灯构成,其中HGFEDCBA为段码,由高到低的顺序排列。
由于我们使用的是共阴数码管,把段码相应的位置2,同时把公共端(又称位选端)置0,相应的数码管发光。
如上显示数字“6”,这相应的段码为0x7d,即二进制01111101.共阴数码管段码显示0~F列举如下:
0x3f,0x06,0x5b,0x4f,0x66,端口。
然后把单片机是上面的P0口链接到数码管,按循序链接到别的。
系统功能方框图
本方案设计的系统由单片机系统、温度传感器、数码管显示模块、其总体架构如下图:
图1系统总体方框图
5系统的程序
DS18B20单片机测温度系统程序
#include""
#include""
#defineSkipRom0xcc
#defineConvertTemperature0x44
#defineReadScratchpad0xbe
sbitDQ=P2^7;
unsignedintbuffer[6];
unsignedcharcodebuff[12]={0X3f,0X06,0X5b,0X4f,0X66,
0X6d,0X7d,0X07,0X7f,0X6f,0x40,0x00
};//数字0~9及"EP=OC"共阴数码管代码
//**************延时**********************
//函数名称:
voidOne_Wire_Delay(unsignedchardelay_time)
//函数功能:
延时
//函数参数:
delay_time
//*******************************************
voidOne_Wire_Delay(unsignedchardelay_time)
{
while(delay_time)delay_time--;//延时时间:
=(8+delay_time*6)us;
}
//*********初始化***************************
//函数名称:
voidinit_ds18b20(void)
//函数功能:
初始化DS18B20
//函数参数:
无
//*******************************************
voidinit_ds18b20(void)
{
DQ=0;//复位信号
One_Wire_Delay(50);//延时600us
DQ=1;
One_Wire_Delay(4);//延时30us
while(DQ==1);
One_Wire_Delay(52);//延时300us
DQ=1;
_nop_();
}
//***********写一个字节*************************
//函数名称:
voidwr_byte(unsignedintwdata)
//函数功能:
DS18B20写一个字节
//函数参数:
wdata
//*******************************************
voidwr_byte(unsignedintwdata)
{
unsignedintn;
for(n=0;n<8;n++)
{
DQ=0;
_nop_();
if(wdata&0x01==1)
DQ=1;
One_Wire_Delay(20);//延时128us
wdata=wdata>>1;
DQ=1;
_nop_();
}
One_Wire_Delay(5);//延时128us
}
//***************读一个字节*********************
//函数名称:
unsignedintrd_byte(void)
//函数功能:
DS18B20读一个字节
//函数参数:
wdata
//*******************************************
unsignedintrd_byte(void)
{
unsignedintm,bb=0;
bitb;
for(m=0;m<8;m++)
{
DQ=0;
_nop_();
DQ=1;
b=DQ;
One_Wire_Delay(12);//延时70us
if(b)
bb|=0x01<DQ=1;
_nop_();
}
One_Wire_Delay(10);//延时128us
return(bb);
}
//***************读ds18b20*********************
//函数名称:
voidrd_ds18b20(void)
//函数功能:
读DS18B20
//函数参数:
无
//*******************************************
voidrd_ds18b20(void)
{
unsignedintmsb=0,lsb=0;
unsignedchart1=0;
unsignedintt2=0;
unsignedintflag_1;
init_ds18b20();
wr_byte(SkipRom);
_nop_();
wr_byte(ConvertTemperature);
One_Wire_Delay(5);//延时40us
init_ds18b20();
wr_byte(SkipRom);
wr_byte(ReadScratchpad);//准备读温度数据
lsb=rd_byte();
msb=rd_byte();
//One_Wire_Delay(120);//延时1ms
if((msb&0xf0)>1)
flag_1=1;
elseflag_1=0;
if(flag_1)
{
msb=~msb;
lsb=~lsb+1;
}
t1=(msb<<4)|(lsb>>4);//整数部分
t2=(lsb&0x0f)**10000;
//if(flag)
//{
//t1=~t1;
//t2=~t2+1;
//}
//t2=t2**100;
if(flag_1)
{buffer[0]=10;}//负数
else{buffer[0]=11;}
buffer[1]=t1/100;
buffer[2]=(t1/10)%10;
buffer[3]=t1%10;
buffer[4]=t2/1000;
buffer[5]=(t2%1000)/100;
//buffer[6]=(t2%100)/10;
//buffer[7]=t2%10;
}
//************************************
//***************ds18b20显示*********************
//函数名称:
voiddisplay(void)
//函数功能:
DS18B20显示
//函数参数:
无
//*******************************************
voiddisplay(void)
{
unsignedintj,b=0xdf,k;
for(j=0;j<6;j++)
{
P1=b;
if(j==3)
{P0=buff[buffer[j]]|0x80;}
else
{P0=buff[buffer[j]];}
b=(b>>1)|0x80;
for(k=0;k<5;k++)
{
One_Wire_Delay(60);//延时20us
}
}
}
voidmain(void)
{
while
(1)
{
rd_ds18b20();
display();
}
}
3单片机蜂鸣器实验
51单片机的一个I/O口控制speaker发声,演唱祝你平安歌曲。
主要器件以及电路图
单片机——AT89C51,蜂鸣器——speaker。
系统功能图
蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,单片机IO引脚输出的电流较小,单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。
S51增强型单片机实验板通过一个三极管C8550来放大驱动蜂鸣器,
52单片机
电路的连接方法
原理图见下面图
GND链接到实验班上面的GND端口,VCC连接到板子上面的VCC端口,然后把DQ段连接的到口。
然后启动电路下载就可以了。
蜂鸣器的正极接到VCC(+5V)电源上面,蜂鸣器的负极接到三极管的发射极E,三极管的基级B经过限流电阻R1后由单片机的引脚控制,当输出高电平时,三极管T1截止,没有电流流过线圈,蜂鸣器不发声;当输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。
因此,我们可以通过程序控制脚的电平来使蜂鸣器发出声音和关闭。
程序中改变单片机引脚输出波形的频率,就可以调整控制蜂鸣器音调,产生各种不同音色、音调的声音。
另外,改变输出电平的高低电平占空比,则可以控制蜂鸣器的声音大小,这些我们都可以通过编程实验来验证。
#include<>
#defineucharunsignedchar
sbitbeep=P0^4;
uchartimer0h,timer0l,time;
codeucharsszymmh[]={6,2,3,5,2,1,3,2,2,1,3,2,6,2,1
5,2,1,6,2,4,3,2,2,5,2,1,6,2,1,5,2,2,3,2,2,1,2,1,6,1,1,5,2,1,3,2,1,2,2,4,2,2,3,3,2,1,
5,2,2,5,2,1,6,2,1,3,2,2,2,2,2,1,2,4,5,2,3,3,2,1,
2,2,1,1,2,1,6,1,1,1,2,1,5,1,6,0,0,0};
codeucharFREQH[]={0xf2,0xf3,0xf5,0xf6,0xf7,0xf8,
0xf9,0xf9,0xfa,0xfa,0xfb,0xfb,0xfc,0xfc,0xfc,0xfd,
0xfd,0xfd,0xfd,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff};
codeucharFREQL[]={0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,
0xEE,0x44,0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16};
voiddelay(uchart)
{
uchart1;
unsignedlongt2;
for(t1=0;t1{
for(t2=0;t2<8000;t2++);
}
TR0=0;
}
voidsong()
{
TH0=timer0h;
TL0=timer0l;
TR0=1;
delay(time);
}
voidmain(void)
{
uchark,i;
TMOD=1;
EA=1;ET0=1;
while
(1)
{
i=0;
while(i<100)
{
k=sszymmh[i]+7*sszymmh[i+1]-1;
timer0h=FREQH[k];
timer0l=FREQL[k];
time=sszymmh[i+2];
i=i+3;
song();
}
}
}
voidt0int()interrupt1
{
TR0=0;
beep=!
beep;
TH0=timer0h;
TL0=timer0l;
TR0=1;
}
院
(部)
或
教
研
室
意
见
学院或教研室主任:
年月日