《单片机原理及应用》第11章:单片机应用设计_第1页
《单片机原理及应用》第11章:单片机应用设计_第2页
《单片机原理及应用》第11章:单片机应用设计_第3页
《单片机原理及应用》第11章:单片机应用设计_第4页
《单片机原理及应用》第11章:单片机应用设计_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

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

文档简介

第11章单片机应用设计

11.1基于DS18B20设计数字温度计(1—Wire总线)(1)DS18B20是DALLAS公司生产的单总线结构的温度传感器,数据通过单线接口送入或送出,每个DS18B20有唯一的系列好,因此单总线上可以挂接多个温度传感器,温度传感器具有3引脚TO-92和8引脚SOIC贴片小体积封装形式,还包括以下基本特性:温度测量范围为-55℃~+125℃,在-10℃~+85℃范围内,精度为±0.5℃。等效华氏温度范围是-66。F~+257。F。用户可以从单总线读出9~12位数字值,分辨率可达到0.0625℃。可以用数据线供电(寄生电源),远距离时不需要增加额外供电电源。内部包含ROM可以设置温度上下限的报警。应用范围包括恒温控制,工业系统,消费类产品,温度计。引脚说明GND——地DQ——数字输入输出VDD——外接供电电源输入端。当工作在寄生电源时,此引脚需要接地。NC——空引脚DS18B20数据输出格式及温度计算

DS18B20读出的温度结果为2字节,读数以16位,符号扩展的二进制补码读数形式提供。所以需要把补码转换为原码,才能计算出真实的温度值。

这2个字节的数据格式如图11-2所示。高8位前5位为符号位,表示温度是零上还是零下。高8位后三位和低8位中的高四位构成温度的整数部分。低2位的后四位为温度的小数部分。正温度原码就是补码的本身,在12位分辨率的情况下:温度值=读取值x0.0625负温度原码是补码减一取反。在12位分辨率的情况下。温度值=-(读取值减一再取反)x0.0625注意:DS18B20上电复位时的温度值固定为+85℃.DS18B20相关操作指令集合软件设计DS18B20初始化如图11-5初始化时序图。主机先发出一个480~960us的低电平脉冲,然后释放总线变为高电平,这个变化过程DS18B20需要等待15~60us处于稳定,并在随后的480us时间内对总线电平进行检测,如果有低电平出现,并且持续时间在60~240us范围内,说明总线上有器件已做出应答;若无低电平出现,一直都是高电平,说明总线上无器件应答。DS18B20初始化程序如下。/*********************************************************函数名:Ds18b20Init*函数功能:DS18B20初始化*输入:无*输出:初始化成功,返回1;初始化失败,返回0********************************************************/bit Ds18b20Init(void){bitflag;DQ=1; //先将总线拉高,保持主从同步 for(time=0;time<2;time++); //短暂延时保持稳定 DQ=0; //拉低总线 for(time=0;time<200;time++);//总线低电平保持时间为480~960us DQ=1; //释放总线 for(time=0;time<10;time++);//释放总线后让DS18B20等待15~60us flag=DQ; for(time=0;time<100;time++); DQ=1; returnflag;//初始化标志位0:初始化成功1:初始化失败}向DS18B20写入1字节数据如图11-6向DS18B20写时序图,从时序图我们可以看出写周期时间范围为60~120us。进行写操作时先把总线电平拉低,表示写周期开始,写操作一共分为两种,一种写“0”操作,另一种写“1”操作。DS18B20的采样周期为15~45us。写“0”操作:先将总线置为低电平保持15us,并在随后的45us时间段内DS18B20开始对总线电平进行采样,45us过后采样结束,写周期结束后释放总线。写“1”操作:先将总线置为低点平保持至少1us,随后恢复总线置为高电平,15us过后DS18B20在45us时间段内开始对总线进行采样,写周期结束后释放总线。DS18B20向DS18B20写入1字节数据程序如下。/*********************************************************函数功能:向DS18B20写入1字节*输入:datavoidDs18b20WriteByte(unsignedchardata){unsignedchari;DQ=1; //先将总线拉高,保持主从同步for(time=0;time<2;time++); //短暂延时保持稳定for(i=0;i<8;i++){DQ=0; //总线置为低电平_nop_(); //低电平保持至少1usDQ=data&0x01; //开始写入第一位数据,从低位开始for(time=0;time<20;time++);//DS18B20采样时间不能少于45usDQ=1; //释放总线for(time=0;time<1;time++); data>>=1; //数据右移一位,最高位补零}for(time=0;time<1;time++);}从DS18B20读出1字节数据如图11-7从DS18B20读时序图。读周期期开始时,主机就要把总线电平拉低1us或2us,随后就得释放总线,在15us时范围内DS18B20把一位数据传送到总线上,因此主机必须在2~15us范围内对总线进行采样,15us后采样结束,直到读周期结束,释放总线,开始下一位数据传输。从DS18B20读出1字节数据程序如下。unsignedcharDs18b20ReadByte(void){unsignedchari,data;DQ=1; //先将总线拉高,保持主从同步for(time=0;time<2;time++); //短暂延时保持稳定for(i=0;i<8;i++){DQ=0;_nop_(); //低电平保持在1~2us左右,_nop_(); DQ=1; //释放总线,等待DS18B20传送数据dat>>=1;for(time=0;time<2;time++); //延时大概6usif(DQ==1)data|=0x80;elsedata|=0x00;for(time=0;time<10;time++);}return data;}例11-1使用DS18B20测温并显示#include<reg52.h>#include<intrins.h>

sbitDQ=P2^7;sbitLED0=P2^0;sbitLED1=P2^1;sbitLED2=P2^2;sbitLED3=P2^3;unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};unsignedcharDisplaydata[]={0,0,0,0};unsignedchartime;voiddelayms(unsignedintms){ unsignedchari; while(ms--) { for(i=0;i<120;i++); }}unsignedcharInitDs18b20() //18B20初始化{ bitflag;DQ=1; //先将总线拉高,保持主从同步 for(time=0;time<2;time++); //短暂延时保持稳定 DQ=0; //拉低总线 for(time=0;time<200;time++);//总线低电平保持时间为480~960us DQ=1; //释放总线 for(time=0;time<10;time++);//释放总线后让DS18B20等待15~60us flag=DQ; for(time=0;time<100;time++); DQ=1; returnflag;//初始化标志位0:初始化成功1:初始化失败}unsignedcharDs18b20ReadByte(){unsignedchari,dat; DQ=1; //先将总线拉高,保持主从同步 for(time=0;time<2;time++); //短暂延时保持稳定

for(i=0;i<8;i++) { DQ=0; _nop_(); //低电平保持在1~2us左右, _nop_(); DQ=1; //释放总线,等待DS18B20传送数据 dat>>=1; for(time=0;time<1;time++); //延时大概6us if(DQ==1) dat|=0x80; else dat|=0x00; for(time=0;time<10;time++); } return dat;}voidDs18b20WriteByte(unsignedchardat) //18B20写数据{ unsignedchari; DQ=1; //先将总线拉高,保持主从同步 for(time=0;time<2;time++); //短暂延时保持稳定

for(i=0;i<8;i++) { DQ=0; //总线置为低电平 _nop_(); //低电平保持至少1us_nop_(); DQ=dat&0x01; //开始写入第一位数据,从低位开始 for(time=0;time<20;time++);//DS18B20采样时间不能少于45us DQ=1; //释放总线 for(time=0;time<1;time++); dat>>=1; //数据右移一位,最高位补零 }}intDs18b20ReadTemp() //读取温度{ unsignedchara,b; inttemp=0; while(InitDs18b20()); Ds18b20WriteByte(0xcc); //跳过序列号 Ds18b20WriteByte(0x44); //启动温度转换 while(InitDs18b20()); Ds18b20WriteByte(0xcc); Ds18b20WriteByte(0xbe); //读取温度 a=Ds18b20ReadByte(); //低八位 b=Ds18b20ReadByte(); //高八位 temp= b; temp<<=8; //合并两个无符号字符型放在整型变量中temp|=a;

returntemp; }/*********************************************************函数名:datapros()*函数功能:温度读取处理转换后并显示*输入:tempvoiddatapros(inttemp){

floattp; if(temp<0) //当温度值为负数 { Displaydata[0]=0x40; temp=temp-1; temp=~temp; tp=temp;

temp=tp*0.0625*10+0.5;//取温度小数点后一位0.0625需要乘十 } else { Displaydata[0]=0x00; tp=temp; temp=tp*0.0625*10+0.5; }Displaydata[1]=temp/100;//取百位 Displaydata[2]=temp%100/10; //取十位 Displaydata[3]=temp%10; //取个位

if(Displaydata[0]==0x40)//判断第0位数码管符号位是否有“-” { LED0=0; } else { LED0=1; } P0=0x40; delayms(3); LED0=1; if(table[Displaydata[1]]==0x3f)//判断第1位是否是零

{ LED1=1; } else

{ LED1=0; } P0=table[Displaydata[1]]; delayms(3); LED1=1;

LED2=0; P0=table[Displaydata[2]]+0x80;//显示第二位 delayms(3); LED2=1;

LED3=0; P0=table[Displaydata[3]];//显示第三位 delayms(3); LED3=1;}voidmain(){ while(1) { datapros(Ds18b20ReadTemp()); }}11.2基于DS1302设计数字电子钟(SPI总线)DS1302是DALLAS公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31字节静态RAM,DS1302通过半双工SPI串行接口(3个接口)与单片机相连进行通讯。实时时钟/日历电路提供秒,分,时,日,日期,月,年的信息,直到2100年。每个单位时间均可自动调整,电子时钟芯片具有8引脚DIP直插和8/16引脚SOIC贴片封装,还包括以下基本特性:1.内部具有闰年调整功能2.31x8位通用暂存RAM3.2.0V~5.5V宽电压操作范围(工作在2V时,工作电流小于300nA),与TTL兼容4.读写时钟或RAM数据时有单字节或多字节(脉冲串模式)数据传送方式5.可选工业级温度范围:-40°C~+85°C引脚说明X1,X2——32.768KHz晶振管脚GND——

地RST——

复位管脚I/O——

数据输入/输出引脚SCLK——

串行时钟Vcc1,Vcc2——

电源供电管脚,预备知识命令字节传送每一字节数据都需要命令字节初始化。如表11-2,命令字节最高位第七位必须为1,如果为0将禁止写入。第六位:逻辑0为时钟/日历数据,逻辑1为RAM数据。第1位到第5位表示输入输出的指定寄存器。第0位:逻辑0为写操作,逻辑1为读操作。命令直接总以最低位开始输入。(2)RST复位引脚与时钟控制所有数据传送开始时RST输入为高电平,可以实现两种功能:①RST引脚接通允许对地址/命令序列的移位寄存器进行读写操作。②RST引脚信号可以对单字节或多字节数据传送进行终止。读写操作如图11-11所示。时钟周期是上升沿伴随下降沿的连续序列,当进行数据输入时,在时钟的上升沿期间必须有效,当进行数据输出时,数据需要在时钟的下降沿期间输出。在进行数据传送的过程中,如果RST复位引脚置低,数据传送将被终止,会使I/O口引脚进入高阻抗状态。在上电运行时,在Vcc大于2.0v之前,RST必须为零。而且,只有SCLK为低电平时,RST复位引脚才能置高。数据输入数据输入如图11-12,第一个字节为命令字节,随后的8个SCLK周期的上升沿为数据字节的输入,输入的每个字节都是低位在前开始写入。数据输出数据输出如图10-11,第一个字节为命令字节,随后的8个SCLK周期的下降沿为数据字节的输出,需要注意的是第一个数据位的传送发生在命令字节被写完后的第一个下降沿,CE保持高电平时间和日历寄存器如下表11-3所示时间和日历寄存器,我们通过写地址命令设置这些寄存器初始时间,也可以写读地址命令,从寄存器读取想要的时间。由表可以看出第一列为读地址命令,第二列为写地址命令。前七行为时间寄存器,分别为秒寄存器、分寄存器、小时寄存器、日期寄存器、月寄存器、星期寄存器、年寄存器,第8个为写保护寄存器第九个为充电保护寄存器。时间日期寄存器内部数据以二进制BCD码格式存储。秒寄存器:第6位到第0位表示秒时间;第7位为时钟控制位,为1时钟停止,为0时钟开启。小时寄存器:第7位,置1为12小时模式,置0为24小时模式;第5位,为1表示PM,为0表示AM。当设置为24小时模式时,第5位到第0位表示小时。控制寄存器:第7位为写保护位,置1阻止写操作,置0允许写操作表11-3时间日历寄存器用DS1302进行年月日、时分秒、星期显示程序如下:向DS1302写地址命令和数据如图11-12写时序图可知,先传送命令字节,然后是数据直接,低位在前传送。/****************************************************函数名:WriteAddressData()*函数功能:向DS1302写地址命令和数据*输入:addressdat*输出:无********************************************/voidWriteAddressData(unsignedcharaddress,unsignedchardat){unsignedchari;RST=1;SCLK=0;_nop_();for(i=0;i<8;i++){DSIO=address&0x01; //从最低位开始送入address>>=1; //地址左移一位SCLK=1;//上升沿_nop_();SCLK=0;_nop_();}for(i=0;i<8;i++){DSIO=dat&0x01;dat>>=1;SCLK=1;_nop_();SCLK=0;_nop_();}RST=0;}从DS1302读取一个地址的数据

/********************************************************

*函数名:ReadAddressData()

*函数功能:从DS1302读取一个地址的数据

*输入:address

*输出:dat

********************************************************/unsignedcharReadAddressData(unsginedcharaddress){unsignedchardat,dat1;unsignedchari;RST=1;_nop_();SCLK=0;for(i=0;i<8;i++){DSIO=address&0x01;address>>=1;SCLK=1;_nop_();SCLK=0;_nop_();}for(i=0;i<8;i++){dat1=DSIO;//从最低位开始接收dat=(dat>>1)|(dat1<<7);SCLK=1;_nop_();SCLK=0;_nop_();}RST=0;_nop_(); //以下为复位稳定操作。SCLK=1;_nop_();DSIO=0;_nop_();DSIO=1;_nop_();returndat;}DS1302初始化/*********************************************************函数名:Ds1302Init()*函数功能:Ds1302初始化*输入:无

*输出:无********************************************************/unsignedcharWriteRTCaddress[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //写地址命令unsignedcharReadRTCaddress[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; //读地址命令unsignedchartime[]={0,0,0x12,0x20,0x03,0x03,0x19};//存储顺序是秒分时日月周年,格式BCD码。voidDs1302Init(void){unsignedchari;WriteAddressWrite(0x8e,0x00);//往控制寄存器写0x00关闭写保护for(i=0;i<7;i++){WriteAddress&Data(WriteRTCaddress[i],time[i]); }WriteAddressWrite(0x8e,0x80);//往控制寄存器写0x80开启写保护}读取DS1302时间和日期/*********************************************************函数名:Ds1302ReadTimeDay()*函数功能:读取时间*输入:无

*输出:无********************************************************/voidDs1302ReadTimeDay(void){ unsignedchari; for(i=0;i<7;i++)//读取7个字节的时钟信号:分秒时日月周年 { time[i]=ReadAddress&Data(ReadRTCaddress[i]); }

}11.3AT24C02的存储应用(I2C总线)1.工作原理I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。I2C总线特点可以概括如下:(1)在硬件上,I2C总线只需要一根数据线和一根时钟线两根线,总线接口已经集成在芯片内部,不需要特殊的接口电路,而且片上接口电路的滤波器可以滤去总线数据上的毛刺.因此I2C总线简化了硬件电路PCB布线,降低了系统成本,提高了系统可靠性。因为I2C芯片除了这两根线和少量中断线,与系统再没有连接的线,用户常用I2C可以很容易形成标准化和模块化,便于重复利用。(2I2C总线是一个真正的多主机总线,如果两个或多个主机同时初始化数据传输,可以通过冲突检测和仲裁防止数据破坏,每个连接到总线上的器件都有唯一的地址,任何器件既可以作为主机也可以作为从机,但同一时刻只允许有一个主机。数据传输和地址设定由软件设定,非常灵活。总线上的器件增加和删除不影响其他器件正常工作。(3)I2C总线可以通过外部连线进行在线检测,便于系统故障诊断和调试,故障可以立即被寻址,软件也利于标准化和模块化,缩短开发时间。(4)连接到相同总线上的IC数量只受总线最大电容的限制,串行的8位双向数据传输位速率在标准模式下可达100Kbit/s,快速模式下可达400Kbit/s,高速模式下可达3.4Mbit/s。(5)总线具有极低的电流消耗.抗高噪声干扰,增加总线驱动器可以使总线电容扩大10倍,传输距离达到15m;兼容不同电压等级的器件,工作温度范围宽。11.3.2I2C总线协议当SCL为高电平而SDA由高到低的跳变,表示产生一个起始条件;当SCL为高而SDA由低到高的跳变,表示产生一个停止条件。在起始条件产生后,总线处于忙状态,由本次数据传输的主从设备独占,其他I2C器件无法访问总线;而在停止条件产生后,本次数据传输的主从设备将释放总线,总线再次处于空闲状态。主设备在SCL线上产生每个时钟脉冲的过程中将在SDA线上传输一个数据位,当一个字节按数据位从高位到低位的顺序传输完后,紧接着从设备将拉低SDA线,回传给主设备一个应答位,此时才认为一个字节真正的被传输完成。当然,并不是所有的字节传输都必须有一个应答位,比如:当从设备不能再接收主设备发送的数据时,从设备将回传一个否定应答位。I2C总线上的每一个设备都对应一个唯一的地址,主从设备之间的数据传输是建立在地址的基础上,也就是说,主设备在传输有效数据之前要先指定从设备的地址,地址指定的过程和上面数据传输的过程一样,只不过大多数从设备的地址是7位的,然后协议规定再给地址添加一个最低位用来表示接下来数据传输的方向,0表示主设备向从设备写数据,1表示主设备向从设备读数据。如图11-18所示:

.I2C总线操作对总线的操作实际就是主从设备之间的读写操作。大致可分为以下三种操作情况:

第一,主设备往从设备中写数据。数据传输格式如图11-19所示

第二主设备从从设备中读数据。数据传输格式如11-20所示第三主设备往从设备中写数据,然后重启起始条件,紧接着从从设备中读取数据;或者是主设备从从设备中读数据,然后重启起始条件,紧接着主设备往从设备中写数据。数据传输格式如下:

3.数据传输字节格式:发送到SDA线上的每个字节必须为8位,每次传输可以发送的字节数量不受限制。每个字节后必须跟一个响应位。首先传输的是数据的最高位(MSB),如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,可以使时钟线SCL保持低电平,迫使主机进入等待状态,当从机准备好接收下一个数据字节并释放时钟线SCL后数据传输继续。应答响应:数据传输必须带响应,相关的响应时钟脉冲由主机产生。在响应的时钟脉冲期间发送器释放SDA线(高)。在响应的时钟脉冲期间,接收器必须将SDA线拉低,使它在这个时钟脉冲的高电平期间保持稳定的低电平。传输格式如图11-22所示。11.3.3单片机模拟I2C总线通信总线初始化:将总线拉高以释放总线voidinit(){SCL=1;delay();SDA=1;delay();

}2.启动信号:SCL高电平期间,SDA一个下降沿产生启动信号。voidstart(){SDA=1;delay();SCL=1;delay();SDA=0;delay();}应答信号:voidrespons(){Uchari=0;SCL=1;delay();while((SDA==1)&&(i<255))i++;SCL=0;delay();}4.停止信号:SCL高电平期间SDA产生一上升沿信号。

voidstop(){SDA=0; delay(); SCL=1; delay(); SDA=1; delay();}

5.写一个字节 voidwritebyte(uchardata) { uchari,temp; temp=data; for(i=0;i<8;i++) { temp=temp<<1; SCL=0; delay();

SDA=CY;delay();SCL=1;delay();}SCL=0;delay();SDA=1;delay(); }6.读一个字节 voidreadbyte(uchardata) { uchari,temp; SCL=0; delay(); SDA=1; for(i=0;i<8;i++) { SCL=1; delay(); temp=(temp<<1)|SDA; SCL=0; delay();

}

delay(); returntemp; }

串行接收一个字节时需要将8位一位一位接收,然后组合成一个字节例11-3具有记忆功能的秒计数显示。电路如图11-23#include<reg51.h>#include<intrins.h>#defineuintunsignedint#defineucharunsignedcharbitflag=0;//写24C02的标志sbitSDA=P3^7;sbitSCL=P3^6;sbitshi=P3^0;sbitge=P3^1;ucharsec,tcnt;ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//*******延时函数

*****//voiddelayms(uintms){ uchari; while(ms--) { for(i=0;i<120;i++); }}//*****起始信号**********//voidstart(){ SDA=1; SCL=1; _nop_(); _nop_(); SDA=0; _nop_(); _nop_(); _nop_(); _nop_(); SCL=0;}//****停止信号

*****//voidstop(){ SDA=0; _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); SDA=1; }//****从AT24Cxx读取数据********//ucharread_byte(){ uchari,da; for(i=0;i<8;i++) { SCL=1; da=da<<1; da=da|(uchar)SDA; SCL=0; } return(da);}//****向AT24Cxx写入数据*****//bitwrite_byte(ucharwrite_data){ uchari; bitack_bit;//定义应答信号 for(i=0;i<8;i++)//循环移入8个位 {

SDA=(bit)(write_data&0x80);

_nop_();

SCL=1;

_nop_(); _nop_();

SCL=0;write_data=write_data<<1; } SDA=1; _nop_(); _nop_(); SCL=1; _n

温馨提示

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

最新文档

评论

0/150

提交评论