18B20应用程序.doc_第1页
18B20应用程序.doc_第2页
18B20应用程序.doc_第3页
18B20应用程序.doc_第4页
18B20应用程序.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

本程序是在其他网友提供的程序的基础之上修改的,已经经过测试,能在51上正常显示温度,使用1602显示。在测试过程中我遇到一个比较费解的问题,就是在18B20的数据读写函数中我使用for(i=0;i0;i-)却能正常运行,这个我目前还没有想明白原因,有知道原因的朋友希望能指点一二,先谢谢了,我的文库是:liuzs09。#include /*宏定义*/#define LCD_RW P1_1 /定义LCD引脚,控制口#define LCD_RS P1_2#define LCD_E P1_0#define LCD_Data P2 /数据传送口#define D18B20 P1_3unsigned char flag,temp1,temp2;/#define Busy 0x80 用于检测LCD状态字中的Busy标识/*函数声明*/void LCDInit(void);void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);void Delay5Ms(void);void WriteDataLCD(unsigned char WDLCD);void WriteCommandLCD(unsigned char WCLCD,BuysC);void ReadStatusLCD(void);/5ms延时void Delay5Ms(void)unsigned int TempCyc = 5552;while(TempCyc-);void Delay(unsigned int m) unsigned char i,j; for(i=m;i0;i-) for (j=3;j0;j-); /读状态,检测忙void ReadStatusLCD(void)LCD_Data = 0xFF; LCD_RS=0;LCD_RW=1;LCD_E=0;LCD_E=0;LCD_E=1;while (LCD_Data & 0x80); /检测忙信号/return(LCD_Data);/写数据void WriteDataLCD(unsigned char WDLCD) ReadStatusLCD(); /检测忙LCD_Data=WDLCD;LCD_RS=1;LCD_RW=0;LCD_E=0; /若晶振速度太高可以在这后加小的延时LCD_E=0; /延时LCD_E=1;/写指令void WriteCommandLCD(unsigned char WCLCD,BuysC) /BuysC为0时忽略忙检测if (BuysC) ReadStatusLCD(); /根据需要检测忙LCD_Data = WCLCD;LCD_RS=0;LCD_RW=0;LCD_E=0;LCD_E=0;LCD_E=1;void Init_LCD(void) /LCD初始化LCD_Data=0;WriteCommandLCD(0x38,0); /三次显示模式设置,不检测忙信号Delay5Ms(); WriteCommandLCD(0x38,0);Delay5Ms(); WriteCommandLCD(0x38,0);Delay5Ms(); WriteCommandLCD(0x38,1); /显示模式设置,开始要求每次检测忙信号WriteCommandLCD(0x08,1); /关闭显示WriteCommandLCD(0x01,1); /显示清屏WriteCommandLCD(0x06,1); / 显示光标移动设置WriteCommandLCD(0x0C,1); / 显示开及光标设置Delay5Ms();/按指定位置显示一个字符void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)Y&=0x1;X&=0xF; /限制X不能大于15,Y不能大于1if (Y) X|=0x40; /当要显示第二行时地址码+0x40;X|=0x80; /算出指令码WriteCommandLCD(X, 1); /发命令字WriteDataLCD(DData); /发数据/按指定位置显示一串字符void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)unsigned char ListLength; ListLength = 0;Y &= 0x1;X &= 0xF; /限制X不能大于15,Y不能大于1while (DDataListLength0x19) /若到达字串尾则退出if (X 0;i-) / D18B20=1; Delay(1); D18B20=0; Delay(55); /延时500us D18B20=1; Delay(7); /延时大于60us /if(!D18B20) / break; / Delay(26); /延时240us/写1个字节void W18B20_char(unsigned char Data) unsigned char i;for (i=8;i0;i-) D18B20=0; Delay(1); D18B20=Data&0x01; Delay(7); D18B20=1; Data=1;/读1个字节unsigned char R18B20_char(void) unsigned char i,Data=0; for(i=8;i0;i-) D18B20=0; Data=1; D18B20=1; if(D18B20) Data|=0x80; / else / / Data|=0x00; / Delay(6); /D18B20=1; return(Data);*/void delay_18B20(unsigned int i)while(i-);/*ds18b20初始化函数*/void Init_18B20(void) unsigned char x=0; D18B20 = 1; /D18B20复位 delay_18B20(8); /稍做延时 D18B20 = 0; /单片机将D18B20拉低 delay_18B20(80); /精确延时 大于 480us D18B20 = 1; /拉高总线 delay_18B20(14); /大于60us的延时 x=D18B20; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20);/*ds18b20读一个字节*/ unsigned char R18B20_char(void)unsigned char i=0;unsigned char dat = 0; /初始化datfor (i=8;i0;i-) D18B20 = 0; / 给脉冲信号 dat=1; D18B20 = 1; / 给脉冲信号 if(D18B20) /判断 dat|=0x80; /屏蔽八位二进制的第一位 delay_18B20(4); /延时30us以上 return(dat);/*ds18b20写一个字节*/ void W18B20_char(unsigned char dat) /八次才可以把所有的数据全部写进去 unsigned char i=0; for (i=8; i0; i-) D18B20 = 0; /拉低D18B20,时间大于1.7us D18B20 = dat&0x01;/将dat的值与1,判断是写1还是写0。若dat是0则写0;若dat是1则写1。 delay_18B20(5); /延时30us以上 D18B20 = 1; /复位 dat=1; /dat数据右移一位 /读取温度数据并转换成void R18B20_temp(void) unsigned char a,tempH=0,tempL=0,b3; unsigned int p; W18B20_char(0x4E); W18B20_char(0x00); W18B20_char(0x00); W18B20_char(0x7F); /设置模式为12位转换 Init_18B20(); W18B20_char(0xCC); W18B20_char(0x44); while(!D18B20); Init_18B20(); W18B20_char(0xCC); W18B20_char(0xBE); tempL=R18B20_char(); tempH=R18B20_char(); a=tempH&0x80; if(a) /为一则是负温度,补码修正,为零则是正温度,不处理 tempL-=1; tempL=tempL; tempH-=1; tempH=tempL; flag=0; else flag=1; temp1=tempL&0x0F; /取低四位 b0=temp1&0x08; b1=temp1&0x04; b2=temp1&0x02; b3=temp1&0x01; b0=3; b1=2; b2=1; p=b0*5000+b1*2500+b2*1250+b3*625; temp2=p/1000; tempL&=0xF0; /取高四位 tempL=4; temp1=tempH&0x0F; /取低四位 temp1=4; temp1&=0x7F; temp1=temp1|tempL; /主函数void main() unsigned char temp2; Init_LCD(); while(1) R18B20_temp(); if(flag) DisplayOneChar(0,0,+); else DisplayOneChar(0,0,-); temp0=temp1/100; temp1=temp1%100/10; temp2=temp1%10; if (temp0)

温馨提示

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

评论

0/150

提交评论