单片机应用技术-基于STC15系列单片机 课件 项目6 智能测温系统的实现_第1页
单片机应用技术-基于STC15系列单片机 课件 项目6 智能测温系统的实现_第2页
单片机应用技术-基于STC15系列单片机 课件 项目6 智能测温系统的实现_第3页
单片机应用技术-基于STC15系列单片机 课件 项目6 智能测温系统的实现_第4页
单片机应用技术-基于STC15系列单片机 课件 项目6 智能测温系统的实现_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

项目智能测温系统的实现智能测温系统主要内容2液晶显示系统的实现3多路测温系统的实现4蓝牙电子温度计的实现1电子温度计的实现电子温度计任务演示任务分析电子温度计程序包括温度的采集、温度数据的处理以及温度值在数码管的显示等DS18B20的引脚功能测温范围为-55℃~125℃,输出12位数字温度值1-GND,地3-Vdd,外供电时为电源接入端,总线供电时接地2-DQ,数据输入/输出。数据传输端,“单总线”DS18B20的内部结构存储器64位ROM64bit的ROM编码是器件的身份标识非易失性存储器E2PROM非易失性存储器E2PROM共3字节,包括高温触发器TH、低温触发器TL和配置寄存器高温触发器TH低温触发器TL配置寄存器配置寄存器R1R0分辨率转换时间00993ms0110187ms1011375ms1112750msTM是测试位,用户不改动R1R0设置分辨率高速RAM序号高速存储器RAM0温度值低位1温度值高位2高温报警寄存器3低温报警寄存器4配置寄存器5保留6保留7保留8CRC校验字节输出温度值时先低8位,再高8位温度值存放格式S为符号位,正温度S=0,负温度S=1温度值以补码形式存放,当测得的温度是负数时,应作补码到原码的转换20~26为7位整数部分2-1~2-4为4位小数部分复位时序和流程复位操作首先在t0时刻发出最短为480µs的低电平,在t1时刻释放总线进入接收状态,DS18B20检测到总线变高后,等15~60µs,在t2时刻发出低电平信号表示响应DQ=1DQ=0读DQ状态:0表示成功;1表示失败延时480~960usDQ=1延时15~60us延时240~480us复位函数bitreset(void) //复位DS18B20{biterr;DQ=0; //在数据线上产生600us的低电平delay1us(600); DQ=1; //数据线拉高delay1us(60); //延时60userr=DQ; //读取数据线状态,err=0:复位成功delay1us(540); //err=1:复位失败return(err);}DQ=1DQ=0读DQ状态:0表示成功;1表示失败延时480~960usDQ=1延时15~60usDQ=1保持240~480us写时序和流程总线拉至低电平的t0时刻开始的15µs之内将要写的数据位送到总线上,在t0后的15~60µs内若为低电平写入的是0;若为高电平写入的为1。连续写2位之间的间隙应大于1µsDQ=1DQ=0DQ=1保持1us表示写1位结束延时15usDQ=1或DQ=0延时15~60us写函数DQ=0; //产生15us的低电平delay1us(15);DQ=dat0; //将需要写的数据0或1送DQ线delay1us(15);//延时15usDQ=1;//数据线拉高,为写入下一位做准备DQ=1DQ=0DQ=1保持1us表示写1位结束延时15usDQ=1或DQ=0延时15~60us写一个字节函数voidwrbyte(uchard) {uchari;dat=d;for(i=8;i>0;i--)//循环写8位(先低位,后高位){DQ=0; delay1us(15);

DQ=dat0; dat=dat>>1;//将下一位要写入的数据移到最低位 delay1us(15); //延时15us DQ=1;//数据线拉高,为写入下一位做准备}}DQ=1DQ=0延时15usDQ=1或DQ=0延时15~60usDQ=1保持1us数据》1位写字节数据存dat,以下操作重复8次读时序和流程单片机在t0时刻将总线从高拉至低电平,几个µs后的t1时刻释放总线。DS18B20通过保持总线为高表示发送“1”,将总线拉低表示发送“0”,并在t2时刻释放总线。单片机必须在t2之前读取总线状态。读时序至少需要60µs,且两次读时序之间至少需要1µs的恢复时间DQ=0延时几usDQ=1延时几us读取DQ延时60usDQ=1表示读结束读函数DQ=0延时几usDQ=1延时几us读取DQ延时60usDQ=1表示读结束DQ=0;//产生负脉冲delay1us(3);DQ=1; //数据总线拉高delay1us(3);//延时3usdat7=DQ; //读取数据delay1us(60);//延时,为读下一位做准备读一个字节函数DQ=0延时几usDQ=1延时几us读取DQ延时60usDQ=1表示读结束读取字节数据dat=0,以下操作重复8次DQ=0延时几usDQ=1延时几us读取DQ延时60usDQ=1表示读结束ucharrdbyte(void) //从DS18B20读取一个字节{uchari;dat=0; //读出数据初值为0for(i=8;i>0;i--) //循环读8位(先低位,后高位){dat=dat>>1; //读出数据先右移一位DQ=0;delay1us(3);DQ=1; delay1us(3);//延时3usdat7=DQ; //读取数据delay1us(60);} return(dat);}DS18B20的基本操作指令名称代码功能跳过ROM0XCC单片机可用这一命令同时访问总线上的所有设备而不需送出ROM序列号信息读ROM0X33单片机发该命令,要求从ROM读出8个字节序列号匹配ROM0X55执行该命令后,单片机必须接着向DS18B20发送8个字节的产品序列号,以选中单总线上指定的DS18B20,只有完全匹配的DS18B20才能对随后由单片机发出的读暂存器操作命令进行响应温度转换0X44该命令开始一次温度转换读暂存器0XBE用该命令可读DS18B20中9个暂存器中由低到高的内容温度的采集处理发送ROM命令0XCC,表示跳过ROM发送RAM命令0X44,要求传感器转换温度发送ROM命令0XCC,表示跳过ROM发送RAM命令0XBE,要求从传感器读取温度从传感器读取温度值的低字节和高字节将高字节温度值左移8位+低字节温度值合并成一个16位二进制补码形式的温度值,以备后续显示处理发送0X44命令延时发送0XCC命令发送0XBE命令读温度低字节读温度高字节发送0XCC命令高字节左移8位+低字节形成完整温度值温度的采集处理发送0X44命令延时发送0XCC命令发送0XBE命令读温度低字节读温度高字节发送0XCC命令高字节左移8位+低字节形成完整温度值voidconvert(void)//启动DS18B20开始温度转换{biterr;err=reset(); //复位传感器wrbyte(0xcc);//跳过多传感器识别wrbyte(0x44);//启动温度转换}intreadt(void) //读取DS18B20暂存器中的温度值{ucharh,l;biterr;err=reset(); //复位传感器wrbyte(0xcc); //跳过多传感器识别wrbyte(0xbe); //读暂存器指令l=rdbyte(); //读温度低位h=rdbyte(); //读温度高位return(h*256+l);}温度值的显示处理16位温度值的补码进行正负处理处理后数据右移4位就是实际温度值的整数部分处理后数据中的低4位就是实际温度值的小数部分t取反+1求补码t右移4位得到整数部分,分离出百位、十位、个位并转换成数码管字形码并处理显示格式温度值t>0?温度正负标记zf=1是否温度正负标记zf=0t&0X0F得到小数部分,转换成数码管字形码并处理显示格式温度值的显示处理温度值的显示处理t取反+1求补码t右移4位得到整数部分,分离出百位、十位、个位并转换成数码管字形码并处理显示格式温度值t>0?温度正负标记zf=1是否温度正负标记zf=0t&0X0F得到小数部分,转换成数码管字形码并处理显示格式voidformat(intt){bitzf; //正负标记,0:正数1:负数

zf=0; if(t<0) {zf=1; t=-t+1; }dbuf[0]=dp[t&0x0f]; //求出温度的小数t=t>>4; dbuf[3]=t/100; //求出百位t=t%100;dbuf[2]=t/10; //求出十位dbuf[1]=t%10; //求出个位if(zf==1) //如果是负数{if(dbuf[2]==0) //如果十位为0{dbuf[3]=0x13;dbuf[2]=0x12; }//显示格式为'-x.x'elsedbuf[3]=0x12;//如果十位不为0显示格式为'-xx.x'}else {if(dbuf[3]==0) //否则,如果是正数

{if(dbuf[2]==0)

dbuf[2]=0x13;dbuf[3]=0x13;}}}任务实现液晶显示系统任务分析液晶显示系统任务演示液晶固定字符串显示驱动程序包括液晶的初始化函数、固定字符串的初始化以及液晶循环显示字符串函数等LCD1602的引脚功能LCD1602是将液晶显示器、控制与驱动等外围电路、背光源做成了PCB板,提供了标准的用户接口并用结构件将其装配在一起的一个模组可以显示2行*每行16个字符1602即16*2LCD1602的引脚功能编号符号引脚说明1GND地2Vcc电源正极3Vo对比度调节4RS数据/命令选择5R/W读/写选择6E模块使能端7~14D0~D7双向数据口线15BLA背光源正极16BLK背光源地LCD1602的读写时序写指令RS=0,RW=0,E下降沿(用于初始化、清屏等)读指令RS=0,RW=1,E下降沿(用于读LCD是否忙等)写数据RS=1,RW=0,E下降沿(用于写入显示内容)读数据RS=1,RW=1,E下降沿(反读DDRAM中的数据等)LCD1602的指令名称编码说明D7D6D5D4D3D2D1D0清屏00000001显示空白,并清DDRAM,AC清0,光标移至左上角归位0000001╳显示回车,AC请0,光标移至左上角,原屏幕显示内容不变输入模式000001I/DSI/D=1,读/写一个字符后,AC加1,光标加1I/D=0,读/写一个字符后,AC减1,光标减1S=1,读写一个字符后整屏显示移动(移动方向由I/D确定)S=0,读写一个字符时,整屏显示不动LCD1602的指令名称编码说明D7D6D5D4D3D2D1D0显示开关控制00001DCB显示开关:D=1,开;D=0,关。DDRAM中内容不变光标开关:C=1,开;C=0,关。光标闪烁开关:B=1,光标闪烁;B=0,光标不闪烁显示移位0001S/CR/L╳╳S/C=1,移动显示字符;S/C=0,移动光标;R/L=1,右移一个字符位;R/L=0,左移一个字符位;LCD1602的指令名称编码说明D7D6D5D4D3D2D1D0显示模式001DLNF╳╳DL=1,8位数据接口;DL=0,4位数据接口;N=1,双行显示;N=0,单行显示;F=1,采用5╳7点阵字符;F=0,采用5╳10点阵字符。地址设置01A5A4A3A2A1A0设置CGRAM地址1A6A5A4A3A2A1A0设置DDRAM地址LCD1602写指令程序引脚写入值RS0RW0E下降沿D0-D7命令字RS=0;RW=0;E=1命令送P0口E=0LCD1602写指令程序RS=0;RW=0;E=1命令送P0口E=0voidlcd_cmd(ucharcmd){LCD=cmd;RS=0; RW=0; E=1;delay1us(1);E=0; delay1us(1);while(1){LCD=0xff;//总线变高RS=0; RW=1; E=1; delay1us(1);E=0;delay1us(1);E=1; delay1us(1);if(BF==0)break;//就绪才返回}}sfrLCD=0x80;//P0口作为总线端口sbitBF=P0^7;//BF忙标志在P0.7LCD1602写数据程序引脚写入值RS1RW0E下降沿D0-D7显示数据RS=1;RW=0;E=1数据送P0口E=0LCD1602写数据程序RS=1;RW=0;E=1数据送P0口E=0voidlcd_dat(uchardat){LCD=dat;RS=1;RW=0;E=1;delay1us(1);E=0;delay1us(1);//while(1){LCD=0xff;RS=0;RW=1;E=0;delay1us(1);E=1;delay1us(1);if(BF==0)break;//如果就绪,返回dat=LCD;}}LCD1602初始化函数写指令0X01写指令0X3c写指令0X0c清屏幕设置显示模式:双行、5*10点阵设置显示开关:开显示,关闭光标LCD1602初始化函数写指令0X01写指令0X3c写指令0X0cvoid lcd_init(){Lcd_cmd(0x01);//清屏幕lcd_cmd(0x3c);//设置双行显示,5X10点阵lcd_cmd(0x0C);//开显示,关闭光标}LCD初始化定义显示字符串发送第一个字符位置的DDRAM命令取出字符数据并等待LCD就绪发送数据到LCD数据=0?返回是否1、初始化成功后,将需要显示的字符串定义到一个字符数组中。2、确定第一个字符要显示在LCD屏的位置,自动增量方式下DDRAM地址会自动加1。3、循环将要显示字符数组中的数据写到数据接口直到数据为“0”结束显示。LCD1602液晶显示驱动程序设计LCD1602液晶显示驱动程序设计voidmain(){uchar*p;ucharstr1[16]="STC15W4K32S4";ucharstr2[16]="temperature";P0M0=0X00;P0M1=0X00;P1M0=0X00;P1M1=0X00;lcd_init();lcd_cmd(0x80);//第一个字符显示在第一行p=str1;while(*p)lcd_dat(*p++);//显示"STC15W4K32S4"lcd_cmd(0xc0);//显示在第二行p=str2;while(*p)lcd_dat(*p++);//显示"temperature";while(1);}LCD初始化定义显示字符串发送第一个字符位置的DDRAM命令取出字符数据并等待LCD就绪发送数据到LCD数据=0?返回是否LCD1602液晶显示系统的实现谢谢观看!多路测温系统演示任务分析多路测温程序包括循环读取四片温度传感器的温度值函数、每个温度值的格式处理及液晶显示等函数,因为系统中每个DS18B20的序列号不同,首先必须读取DS18B20的序列号,在进行温度采集前每次还要发序列号匹配命令读取DS18B20序列号编写一段readid()函数得到温度传感器序列号在ProteµsS环境用鼠标指向该器件,先右键后左键,分别打开各传感器的属性设置窗口,将“ROMSerialNumber”中的默认值“B8C530”改为其它十六进制数,然后运行读序列号函数,读出8个字节的序列号读取DS18B20序列号编写一段readid()函数得到温度传感器序列号4个传感器的序列号设置为{0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e},{0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9},{0x28,0x32,0xc5,0xb8,0x00,0x00,0x00,0xe0},{0x28,0x33,0xc5,0xb8,0x00,0x00,0x00,0xd7}读序列号函数//4个传感器的序列号放在二维数组ucharcodeid[4][8]={{0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e},{0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9},{0x28,0x32,0xc5,0xb8,0x00,0x00,0x00,0xe0},{0x28,0x33,0xc5,0xb8,0x00,0x00,0x00,0xd7}};voidreadid(ucharid[])//读取序列号{ ucharn;reset(); //复位DS18B20wrbyte(0x33); //发READROM命令for(n=0;n<=8;n++) //读取8个字节的序列号

复位id[n]=rdbyte();}多路测温方法1、复位所有传感器,跳过ROM,发启动温度转换命令,所有DS18B20开始转换2、转换结束后,单片机依次发匹配ROM命令,将预先存储的各传感器的序列号通过单总线送出,选中指定的DS18B20读入温度值多路测温程序voidgettemp(inttemp[])//检测4个传感器温度值送数组temp{ ucharm,n;ucharh,l;reset(); //复位所有DS18B20wrbyte(0xcc);wrbyte(0x44);//跳过ROM启动所有DS18B20转换late(); //延时750msfor(m=0;m<4;m++) //循环检测各DS18B20{reset(); //复位wrbyte(0x55); //发匹配ROM命令for(n=0;n<8;n++) wrbyte(id[m][n]);//发8字节的序列号wrbyte(0xbe); //发读暂存器命令l=rdbyte(); //读取温度低字节、高字节h=rdbyte();temp[m]=h*256+l;

}}多路测温主程序1、LCD初始化2、巡回检测各测温点的温度值并将其转换成字符串3、在LCD显示屏的对应位置显示温度值多路测温主程序main(){ inttemp[4];//用来存放四个传感器的温度值ucharstr[6]={0,0,0,0,0,0};//用于将温度值转换为字符串bitzf; //正负标记

温度在0度以下为1,否则为0uchari;init_lcd(); //液晶屏初始化str[1]=':'; //在屏幕指定位置显示

for(i=0;i<4;i++) {str[0]=0x41+i; disp_str(i/2,(i%0x02)*9,str);}多路测温主程序while(1){gettemp(temp); //巡回检测出4个传感器的温度值送数组tempfor(i=0;i<4;i++)//依次显示数组temp中的温度值{zf=0;if(temp[i]<0) //如果温度小于0{zf=1; //正负标志置1temp[i]=-temp[i]; //求出温度的绝对值 }str[4]=dp[temp[i]&0x0f]+0x30;//求出一位小数的ASCII码temp[i]=temp[i]>>4; //舍去小数部分str[0]=temp[i]/100+0x30; //求出百位的ASCII码temp[i]=temp[i]%100;str[1]=temp[i]/10+0x30; //求出十位的ASCII码str[2]=temp[i]%10+0x30; //求出个位的ASCII码str[3]='.'; //填上小数点

多路测温主程序if(zf==1) //如果是负数{if(str[1]=='0') //如果十位为0{str[0]=''; //显示格式为'-x.x'str[1]='-'; }else str[0]='-'; //如果十位不为0

显示格式为'-xx.x'}else //如果是正数{if(str[0]=='0') //如果百位、十位都是0{if(str[1]=='0')//显示格式为'x.x'str[1]=''; //如果只有百位为0str[0]='';//显示格式为'xx.x'}}disp_str(i/2,(i%0x02)*9+2,str);}}}多路测温系统调试如果某个传感器的温度值总是为0,应检查它的序列号是否与二维数组id中所定义的值一致注意4个传感器的序列号为ucharcodeid[4][8]={{0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e},{0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9},{0x28,0x32,0xc5,0xb8,0x00,0x00,0x00,0xe0},{0x28,0x33,0xc5,0xb8,0x00,0x00,0x00,0xd7}};谢谢观看!蓝牙电子温度计演示将温度值实时显示在本地LED数码管上,还能将温度值通过蓝牙模块显示到手机屏幕上任务分析蓝牙电子温度计的软件在电子温度计程序基础上增加串口发送功能,包括单片机串口初始化函数,主函数中增加温度发送函数,将温度值实时发送到手机HC-05蓝牙模块接口引脚功能HC-05蓝牙通信模块主要用于短距离无线数据传输,可与手机等智能终端的蓝牙设备相连Vcc接+5V电源GND接地,数据发送TXD和

单片机的P3.0(RXD)相连,数据接收RXD和

单片机的P3.1(TXD)相连STATE为连接状态引脚,未连接输出低,连接输出高EN配合AT命令使用,高电平有效蓝牙温度计程序设计蓝牙温度计程序在电子温度计基础上增加串口初始化函数,串口设置为波特率为9600bps,8位数据位,无校验数据格式//串口初始化,时钟11.0592MHz,9600bps,1位起始,8位数据,1位停止,无校验voidUartInit(void) //串口初始化函数{SCON=0X40;

//8位数据,可变波特率AUXR|=0x40; //定时器1时钟为Fosc,即1TAUXR&=0xFE; //串口1选择定时器1为波特率发生器TMOD&=0x0F; //设定定时器1为16位自动重装方式TL1=0xE0; //设定定时初值(对应波特率9600)TH1=0xFE; //设定定时初值ET1=0; //禁止定时器1中断TR1=1; //启动定时器1}蓝牙温度计程序设计在温度值格式处理函数void

format(t)中将温度值存放在一个全局变量tempblue,以备主函数发送voidformat(intt){bitzf=0; //正负标记,0:正数1:负数

if

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论