哈工大单片机课设
- 格式:docx
- 大小:148.10 KB
- 文档页数:9
Harbin Institute of Technology《微机与微控制器原理》课课程设计报告基于数字温度传感器的数字温度设计*名:**学号: **********班级: 1705008指导教师:***哈尔滨工业大学《微机与微控制器原理》课程设计评分及标准课程设计题目: 基于数字温度传感器的数字温度计一、课程设计任务要求利用数字温度传感器DS18B20与单片机结合来测量温度。
利用数字温度传感器DS18B20测量温度信号,计算后在LED数码管上显示相应的温度值。
其测量温度为-55℃~125℃.数字温度计所测量的温度采用数字显示,控制器使用单片机AT89C51,测温传感器使用DS18B20,采用3位共阳LED来进行显示。
二、工作原理从温度传感器DS18B20可以很容易读取被测温度值,进行转换即可满足实验要求,由单片机对DS18B20进行初始化,先将DQ拉高再将其拉低电平持续480us~960us后释放,等待15us~60us,若DS18B20被初始化成功,则会由DQ线发出一持续60~240us的低电平,由其判断是否初始化成功,再通过写入程序对芯片发出指令,主要指令为跳过RAM匹配,启动温度转换,当单片机从DS18B20芯片读取数据时,将DQ从高拉到低进行初始化,在此后15us内若DQ为1则采样1,若为0,则采用0(注意当DQ拉低后需延时一段时间等待DQ电平稳定),采用两个8位变量分别记录温度低位与高位,再通过一个16位的全局变量,将从芯片中读取的温度进行整合得到所需数据,通过数据转换函数将所得数据转为十进制温度,通过表中数据传递至数码管端显示。
独特的一线接口,只需要一条口线通信多点能力,简化了分布式温度传感应用无需外部元件可用数据总线供电,电压范围为3.0 V至5.5 V 无需备用电源测量温度范围为-55 ° C至+125 ℃ 。
华氏相当于是-67 ° F到257° F。
在摄氏度-10 ° C至+85 ° C范围内精度为±0.5 ° C温度传感器可编程的分辨率为9~12位,温度转换为12位数字格式最大值为750毫秒,用户可定义的非易失性温度报警设置,应用范围包括恒温控制、工业系统、消费电子产品温度计、或任何热敏感系统描述该DS18B20的数字温度计提供9至12位(可编程设备温度读数)。
由于DS18B20是一条口线通信,所以中央微处理器与DS18B20只有一个一条口线连接。
为读写以及温度转换可以从数据线本身获得能量,不需要外接电源。
因为每一个DS18B20的包含一个独特的序号,多个ds18b20s可以同时存在于一条总线。
这使得温度传感器放置在许多不同的地方。
它的用途很多,包括空调环境控制,感测建筑物内温设备或机器,并进行过程监测和控制。
DS18B20采用一线通信接口。
因为一线通信接口,必须在先完成ROM设定,否则记忆和控制功能将无法使用。
主要首先提供以下功能命令之一: 1 )读ROM,2 )ROM匹配, 3 )搜索ROM, 4 )跳过ROM, 5 )报警检查。
这些指令操作作用在没有一个器件的64位光刻ROM序列号,可以在挂在一线上多个器件选定某一个器件,同时,总线也可以知道总线上挂有有多少,什么样的设备。
三、单片机应用系统设计及原理图应用系统电路图设计四、实现方法及扩展或创新设计1.基本功能实现方法通过使单片机使DS18B20进行初始化,通过写函数对DS18B20发出指令,跳过匹配RAM,进行温度转换的指令,通过单片机对DS18B20发出读时序,开始采集DS18B20所采集到的温度,并通过温度处理函数将所得的温度进行转换,通过数码管显示函数将温度显示出来。
2、自己发挥的扩展创新设计增添了一个蜂鸣器,当温度低于或高于一定值时,蜂鸣器会接收到P3.0口发出的脉冲,做出报警的效果,当温度回复到正常范围时,蜂鸣器停止报警,当蜂鸣器报警时并不影响数码管的显示五、实现步骤1、Proteus仿真a.在Proteus中打开设计文档;b.建立实验程序并编译,加载hex文件,仿真;c.如不能正常工作,打开调试窗口进行调试。
2、自己发挥的扩展设计实现步骤通过改变DS18B20所得的温度值,使其低于或高于阈值,蜂鸣器进行报警,当其恢复时,蜂鸣器停止报警。
六、数据记录与结果分析进行数据记录,记录调试过程观察实验结果,并进行分析。
七、具体分工任杰:查阅DS18B20芯片手册,编写程序,设计电路,软件仿真,撰写报告菅宇鹏:查阅DS18B20芯片手册,软件调试,撰写报告八、建议与体会通过本次课程设计,知道了面对一个陌生的芯片到使用它的全过程,通过查阅芯片的使用方式,数据手册,通过编写程序来对其进行使用,在一定程度上让我知道了延时的重要性,延时准确,才能使其工作,才能更稳定的读取数据,延时函数的设计及其使用很大程度上影响了我们所得数据的稳定性,在编写程序的过程中需要不断地调试来进行纠正,不断的改写程序找到问题所出现的地方,将函数分开写可以更快更好的找到程序的问题并进行改正,最后达到实验要求。
在实验编程中熟悉了对汇编语言的运用,提高了自己的编程能力。
九、实验程序(程序需要完整、规范且有注释,原则上要求汇编)#include "reg52.h" //编译器预处理typedef unsigned int u16;typedef unsigned char u8;sbit LSA=P2^3; //管脚命名sbit LSB=P2^4;sbit LSC=P2^5;sbit LSD=P2^6;sbit BUZZ=P3^0;sbit DQ=P3^4; //P3.4的命名为DQu8 DisplayData[8]; //设置数组来传递数据u8 code smgduan[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc6};//共阳数码管的显示前十为0~9,最后一位为字符cu8 buzz=0;//定义使蜂鸣器鸣叫的数值void delay(u16 i)//延时函数6us左右{while(i--);}void Delay1ms(u16 y)//Delaylms 延时函数{u16 x;for( ; y>0; y--){for(x=110; x>0; x--);}}u8 Ds18b20Init()//参考DS18B20手册初始化方式{u8 i;DQ = 1;DQ = 0;//将DQ拉低480us~960usi =100;while(i--);//延时650us左右DQ = 1;//拉高DQ线,如果DS18B20 做出反应会将在15us-60us 发出低电平while(DQ)//若DQ一直为高电平,进入循环,当等待时间大于5ms时,则初始化失败,返回0{Delay1ms(1);i++;if(i>5)//等待大于5MS{return 0;//证明初始化失败}} return 1;//说明初始化成功}void Ds18b20WriteByte(u8 dat){u16 i, j;for(j=0; j<8; j++){ DQ = 0;//每要写入数据时,得把DQ拉低大约1usi++;DQ = dat & 0x01; //然后写入一个数据,从最低位开始i=10;while(i--); //等待一段时间,使其记录数据DQ=1; //拉高DQ,接着写入第二个数值dat >>= 1;}}u8 Ds18b20ReadByte()//函数读取一个字节(8bit){u8 byte, bi;u16 i, j;for(j=8; j>0; j--)//通过循环和移位操作实现将DQ串行输出记录{DQ = 0;//先将DQ拉低(再给一个高电平后DQ开始在其后15us输出数值)i++;DQ = 1;//给与高电平i++;i++;//延迟等待数据稳定bi=DQ; //读取数据,从最低位开始读取,将byte 左移一位,然后与上右移7 位后的bi,注意移动之后移掉那位补byte = (byte >> 1) | (bi << 7); //若bi=DQ=1,bi=00000001B,移动7位至最高位10000000B,通过或操作对移位后的byte最高位进行记录i = 6;while(i--);//等待系统稳定}return byte; //返回读取到的值}void Ds18b20ChangTemp()//转换温度{Ds18b20Init();//初始化Delay1ms(1);Ds18b20WriteByte(0xcc); //跳过ROM 操作命令,见P295。
Ds18b20WriteByte(0x44); //温度转换命令,向DS18B20传递指令44H,进行温度转换Delay1ms(100); //等待转换成功}void Ds18b20ReadTempCom()//发送读取温度命令{Ds18b20Init();//初始化Delay1ms(1);Ds18b20WriteByte(0xcc); //跳过ROM 读取命令Ds18b20WriteByte(0xbe); //发送读取温度命令}int Ds18b20ReadTemp() //读取温度{int temp = 0;//十六位,采集总的温度值u8 tmh, tml;//读取温度的高字位和低字位Ds18b20ChangTemp(); //写入转换命令Ds18b20ReadTempCom(); //等待发送读取温度命令tml = Ds18b20ReadByte(); //读取温度共16 位,先读的是低字节tmh = Ds18b20ReadByte();temp = tmh;//得到高位温度值00000000xxxxxxxxbtemp <<= 8;//像左移动8位xxxxxxxx00000000btemp |= tml;//将低位温度写入tempreturn temp;}void datapros(int temp) //将得到的temp进行温度的转换{float tp;tp=temp;temp=tp*0.0625*100+0.5;DisplayData[0] = smgduan[temp % 10000 / 1000];DisplayData[1] = smgduan[temp % 1000 / 100]&0x7f;DisplayData[2] = smgduan[temp % 100 / 10];DisplayData[3] = smgduan[10];buzz=(temp % 10000 / 1000);}void DigDisplay() //数码管显示{u8 i;for(i=0;i<4;i++)//循环点亮数码管{switch(i) //选择点亮的数码管{case(0):LSA=1;LSB=0;LSC=0;LSD=0; break;//显示第0 位case(1):LSA=0;LSB=1;LSC=0;LSD=0; break;//显示第1 位case(2):LSA=0;LSB=0;LSC=1;LSD=0; break;//显示第2 位case(3):LSA=0;LSB=0;LSC=0;LSD=1; break;//显示第4 位}P1=DisplayData[i];//发送该位的数据delay(110); //间隔一段时间扫描P1=0XFF; //消隐}}void main()//main 主函数{while(1){ datapros(Ds18b20ReadTemp());//数据处理函数DigDisplay();//数码管显示函数while((buzz>4)|(buzz<2)) //判断温度使蜂鸣器鸣叫{BUZZ=~BUZZ;delay(10);BUZZ=~BUZZ;datapros(Ds18b20ReadTemp());//数据处理函数DigDisplay();//数码管显示函数}}}。