课程:综合电子系统设计
专业:电子信息工程
班级:101
*****
学号:**********
一·项目背景:
A.该产品在现实生活中的应用现状?
由于数据采集系统应用范围越来越广,功能越来越全,大众需要一种应用范围广,性价比高的数据采集系统,无线传输实现了数据处理功能强大,显示简洁、直观,性价比高,应用广泛。
在生产中经常需对温度进行检测,数字显示信息存储及实时控制,无线采集系统可被广泛应用于温度测量或相应的可转换为温度量或供电故障监控的工业,农业,环保,服务业安全监控中。
存在哪些问题?
很多系统存在:
1.功能单一; 2.采集通道少 ;3.采集速率低;
4.操作复杂 ; 5.并对测试环境要求较高等问题。
二、详细设计需求
•1、18B20温度采集端对现场温度进行采集,并将采集到的温度电压信号转换为数字信号,传送给数据处理端
•2、数据处理端对数据进行处理后,经WIFI模块传送到PC机
•3、PC机对温度数据进行实时记录并显示,用户可根据需要选择所要查看的监测点温度数据
三、系统设计总方案
1.温度传感器DS18b20
2.单总线
3.单片机
4.串口
5.WIFI模块
6.无线传输
7.PC机显示
四、系统总方案简述
•1、温度传感器DS18b20是单总线传输元件与单片机一端口相连;
•2、单片机通过串口与WIFI相连,通过指令控制WIFI模块或传输数据并发送出去;
•3、PC机接收无线信号显示相应的温度信息。
五、方案每个部分实现原理
1、温度传感器DS18b20
DS18B20的温度检测与数字数据输出全集成于一个芯片上,从而抗干扰力更强。其一个工作周期可分为两个部分,即温度检测和数据处理。在讲解其工作流程之前我们有必要了解 18B20 的内部存储器资源。18B20 共有三种形态的存储器资源,它们分别是:ROM 只读存储器,用于存放DS18B20ID编码,其前 8 位是单线系列编码(DS18B20的编码是19H ),后面 48位是芯片唯一的序列号,最后 8 位是以上56的位的CRC 码(冗余校验)。数据在出产时设置不由用户更改。DS18B20共位ROM。 RAM 数据暂存器,用于内部计算和数据存取,数据在掉电后丢失, DS18B20共9 个字节RAM,每个字节为8 位。第 1 、2 个字节是温度转换后的数据值信息,第 3 、4 个字节是用户 EEPROM(常用于温度报警值储存)的镜像。在上电复位时其值将被刷新。第5 个字节则是用户第 3 个EEPROM的镜像。第6、7 、8 个字节为计数寄存器,是为了让用户得到更高的温度分辨率而设计的,同样也是内部温度转换、计算的暂存单元。第9 个字节为前 8 个字节的CRC 码。
工作原理及应用总结
DS18b20 ROM 只读存储器 用于存放DS18B20ID编码
内部存储器 RAM 数据暂存器 用于内部计算和数据存取,数据在掉电后丢失
E非易失性记忆体 用于存放长期需要保存的数据,上下限温度报警值和校验数据
DS18b20 温度检测
一个工作周期 数据处理
DS18b20单总线控制流程
1.复位2.存在脉冲3.控制器发送ROM指令 4.控制发送存储器操作指令5.执行或数据读写
复位:首先我们必须对 DS18B20芯片进行复位,复位就是由控制器(单片机)给DS18B20单总线至少480uS 的低电平信号。当 18B20 接到此复位信号后则会15~60uS后回发一个芯片的存在脉冲。
存在脉冲:在复位电平结束之后,控制器应该将数据单总线拉高,以便于在 15~60uS后接收存在脉冲,存在脉冲为一个 60~240uS 的低电平信号。至此,通信双方已经达成了基本的协议,接下来将会是控制器与18B20 间的数据通信。如果复位低电平的时间不足或是单总线的电路断路都不会接到存在脉冲,在设计时要注意意外情况的处理。
控制器发送ROM指令:双方打完了招呼之后最要将进行交流了,ROM指令共有5 条,每一个工作周期只能发一条,ROM指令分别是读ROM数据、指定匹配芯片、跳跃 ROM、芯片搜索、报警芯片搜索。ROM指令为8 位长度,功能是对片内的 位光刻ROM进行操作。其主要目的是为了分辨一条总线上挂接的多个器件并作处理。诚然,单总线上可以同时挂接多个器件,并通过每个器件上所独有的ID 号来区别,一般只挂接单个 18B20 芯片时可以跳过ROM指令(注意:此处指的跳过ROM指令并非不发送ROM指令,而是用特有的一条“跳过指令”)。
控制器发送存储器操作指令:在ROM指令发送给18B20 之后,紧接着(不间断)就是发送存储器操作指令了。操作指令同样为8 位,共 6 条,存储器操作指令分别是写 RAM数据、读RAM数据、将 RAM数据复制到EEPROM 、温度转换、将 EEPROM 中的报警值复制到 RAM、工作方式切换。存储器操作指令的功能是命令18B20 作什么样的工作,是芯片控制的关键。
执行或数据读写:一个存储器操作指令结束后则将进行指令执行或数据的读写,这个操作要视存储器操作指令而定。如执行温度转换指令则控制器(单片机)必须等待18B20 执行其指令,一般转换时间为500uS 。如执行数据读写指令则需要严格遵循 18B20 的读写时序来操作。
2、AMS1117芯片
1.AMS1117是一个正向低压降稳压器,在1A电流下压降为1.2V,固定输出电压为1.5V、1.8V、2.5V、2.85V、3.0V、3.3V、5.0V和可调版
2.AMS1117片上微调把基准电压调整到1.5%的误差以内,而且电流也得到了调整,以尽量减少因稳压器和电源电路超载而造成的压力
3.AMS1117可用于交换式电源 5V至3.3V线性稳压器,电池充电器、电池供电设备等,本系统中使用提供稳定3.3V电压
七、程序
1.采集端程序
/*-----------------------------------------------
18B20温度传感器
------------------------------------------------*/
#include"delay.h"
#include"18b20.h"
/*------------------------------------------------
初始化
------------------------------------------------*/
bit Init_DS18B20(void)
{
bit dat=0;
复位
稍做延时
单片机将DQ拉低
DelayUs2x(200); //精确延时 大于 480us 小于960us
DelayUs2x(200);
拉高总线
DelayUs2x(50); //15~60us 后 接收60-240us的存在脉冲
如果x=0则初始化成功, x=1则初始化失败
DelayUs2x(25); //稍作延时返回
return dat;
}
/*------------------------------------------------
读取一个字节
------------------------------------------------*/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
DelayUs2x(25);
}
return(dat);
}
•/*------------------------------------------------
• 写入一个字节
•------------------------------------------------*/
•void WriteOneChar(unsigned char dat)
•{
• unsigned char i=0;
• for (i=8; i>0; i--)
• {
• DQ = 0;
• DQ = dat&0x01;
• DelayUs2x(25);
• DQ = 1;
• dat>>=1;
• }
•DelayUs2x(25);
•}
•/*------------------------------------------------
• 读取温度
•------------------------------------------------*/
•unsigned int ReadTemperature(void)
•{
•unsigned char a=0;
•unsigned int b=0;
•unsigned int t=0;
•Init_DS18B20();
•WriteOneChar(0xCC); // 跳过读序号列号的操作
•WriteOneChar(0x44); // 启动温度转换
•DelayMs(10);
•Init_DS18B20();
•WriteOneChar(0xCC); //跳过读序号列号的操作
•WriteOneChar(0xBE);
•//读取温度寄存器等(共可读9个寄存器) 前两个就是温度
•a低位
•b高位
•b<<=8;
•t=a+b;
•return(t);
•}
2.主程序
•/*-----------------------------------------------
• 名称:DS18b20 温度检测 WIFI传输
•------------------------------------------------*/
•#include •#include •#include "18b20.h" •#include "18b20a.h" •#include "delay.h" •#include "chuankou.h" •bit ReadTempFlag;//定义读时间标志 •void Init_Timer0(void);//定时器初始化 •/*------------------------------------------------ • 串口通讯初始化 •------------------------------------------------*/ •void UART_Init(void) •{ • 模式 1, 8-bit UART, 使能接收 • TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装 • TH1 = 0xFD; // TH1: 重装值 9600 波特率 晶振 11.0592MHz • TR1 = 1; // TR1: timer 1 打开 • //EA = 1; //打开总中断 • ES = 1; //打开串口中断 • •} •/*------------------------------------------------ • 主函数 •------------------------------------------------*/ •void main (void) • •int temp; •float temperature; •char displaytemp[16];//定义显示区域临时存储数组 •Init_Timer0(); •UART_Init(); •w主循环 • { •if(ReadTempFlag==1) • { • ReadTempFlag=0; • temp=ReadTemperature(); • temperature=(float)temp*0.0625; • sprintf(displaytemp,"Temp1 %7.3f",temperature);//打印温度值 • sendstr(displaytemp); • • temp=ReadTemperature_a(); • temperature=(float)temp*0.0625; • sprintf(displaytemp,"Temp2 %7.3f",temperature);//打印温度值 • sendstr(displaytemp); • } • } •} •/*------------------------------------------------ • 定时器初始化子程序 •------------------------------------------------*/ •void Init_Timer0(void) •{ • TMOD |= 0x01; 使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 • //TH0=0x00; 给定初值 • //TL0=0x00; • 总中断打开 • 定时器中断打开 • 定时器开关打开 •} •/*------------------------------------------------ • 定时器中断子程序 •------------------------------------------------*/ •void Timer0_isr(void) interrupt 1 •{ • static unsigned int num; • TH0=(65536-2000)/256; 重新赋值 2ms • TL0=(65536-2000)%256; • • num++; • • • • 读标志位置1 • •} •void zhongduan4() interrupt 4 •{ • • •} 附:参考原理图