DS18B20.rar

  • 佩德罗
    了解作者
  • Visual C++
    开发工具
  • 35KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 1
    下载次数
  • 2014-10-28 22:36
    上传日期
DS18b20的驱动程序,能够驱动18b20进行温度测量,精度在±0.5°。
DS18B20.rar
  • DS18B20
  • STARTUP.LST
    13.7KB
  • DS18B20.hex
    4.2KB
  • DS18B20
    10.5KB
  • DS18B20.plg
    162B
  • STARTUP.A51
    6.2KB
  • DS18B20.M51
    15.8KB
  • lcd.c
    1.3KB
  • DS18B20.uvproj
    13.1KB
  • DS18B20_uvopt.bak
    54.8KB
  • STARTUP.OBJ
    749B
  • DS18B20_uvproj.bak
    0B
  • lcd.LST
    3.6KB
  • DS18B20.LST
    10.5KB
  • DS18B20.uvopt
    54.8KB
  • DS18B20.OBJ
    10.5KB
  • DS18B20.lnp
    62B
  • DS18B20.C
    4.6KB
  • lcd.OBJ
    4.4KB
内容介绍
#include<reg52.h> typedef unsigned char uchar; typedef unsigned int uint; sbit LCDRS=P1^2; sbit LCDRW=P1^1; sbit LCDEN=P1^0; sbit DS18B20=P3^7; void Delay_1ms(uint); void Write_com(uchar); void Write_data(uchar); void LCD_INIT(); uchar Ds18b20Init(); void Ds18b20WriteByte(uchar com); uchar Ds18b20ReadByte(); void Ds18b20ChangTemp(); void Ds18b20ReadTempCom(); int Ds18b20ReadTemp(); void LcdDisplay(int); /*******主函数*********/ void main() { while(1) { LcdDisplay(Ds18b20ReadTemp()); // Delay_1ms(1000);//1s钟刷一次 } } void Delay_1ms(uint b) { uchar a; for (; b>0; b--) { for (a=110;a>0;a--); } } /*******以下为lcd模块函数*********/ void Write_com(uchar com) { LCDRS=0; LCDRW=0; LCDEN=0; P0=com; Delay_1ms(1); LCDEN=1; Delay_1ms(5); LCDEN=0; // P0=com<<4; // Delay_1ms(1); // LCDEN=1; // Delay_1ms(5); // LCDEN=0; } void Write_data(uchar dat) { LCDRS=1; LCDRW=0; LCDEN=0; P0=dat; Delay_1ms(1); LCDEN=1; Delay_1ms(5); LCDEN=0; // P0=dat<<4; // Delay_1ms(1); // LCDEN=1; // Delay_1ms(5); // LCDEN=0; } void LCD_INIT() { // Write_com(0x32); // Write_com(0x28); Write_com(0x38); Write_com(0x0c); Write_com(0x06); Write_com(0x01); Write_com(0x80); } /********以下为DS18B20初始化函数*********/ uchar Ds18b20Init() { uint i; DS18B20=0; //将总线拉低480us~960us i = 70; while(i--);//延时642us DS18B20=1; //拉高总线。如果DS18B20做出反应会将在15us~60us后总线拉低;则初始化成功 i=0; while(DS18B20) { i++; if(i>5000)//等待5ms { return 0; } // Delay_1ms(1); } return 1; } void Ds18b20WriteByte(uchar dat) { uint i,j; for(j=8;j>0;j--) { DS18B20=0; //拉低 1us<t<无穷大 i++; DS18B20=1;//15us内释放总线 DS18B20=dat&0x01; i=6; while(i--); //延时68us,(最少60us) // for(i=15;i>0;i--); DS18B20=1; dat>>=1; } } uchar Ds18b20ReadByte() { uchar bi,byte; uint i,j; for(j=8;j>0;j--) { DS18B20=0; i++; DS18B20=1; i++; i++;//等待6US等待数据稳定 bi=DS18B20; //15us末 采样即可 byte=(byte>>1)|(bi<<7); i = 4; //等待48微秒 while(i--); } return byte; } void Ds18b20ChangTemp() //使DS18b20开始转换温度 { Ds18b20Init(); Delay_1ms(1); Ds18b20WriteByte(0xcc); //跳过ROM操作命令 Ds18b20WriteByte(0x44); //温度转换命令 Delay_1ms(500); } void Ds18b20ReadTempCom() //发送读取温度命令 { Ds18b20Init(); Delay_1ms(1); Ds18b20WriteByte(0xcc); //跳过ROM操作命令 Ds18b20WriteByte(0xbe); //发送读取温度命令 } int Ds18b20ReadTemp() //读取温度 { int temp=0; uchar tmh,tml; Ds18b20ChangTemp(); //先写入转换命令 Ds18b20ReadTempCom(); //然后等待转换完后发送读取温度命令 tml=Ds18b20ReadByte(); //读取温度值共16位,先读低字节 tmh=Ds18b20ReadByte(); //再读高字节 temp=tmh; temp<<=8; temp|=tml; return temp; } /**********液晶显示温度函数**********/ void LcdDisplay(int temp) //lcd显示 { // uchar datas[] = {0, 0, 0, 0, 0}; //定义数组 uchar datas[5] ; float tp; LCD_INIT(); //初始化LCD if(temp< 0) //当温度值为负数 { Write_com(0x80); //写地址 80表示初始地址 Write_data('-'); //显示负 //因为读取的温度是实际温度的补码,所以减1,再取反求出原码 temp=temp-1; temp=~temp; tp=temp; temp=tp*0.0625*10+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就 //算加上0.5,还是在小数点后面。 } else { Write_com(0x80); //写地址 80表示初始地址 Write_data('+'); //显示正 tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量 //如果温度是正的那么,那么正数的原码就是补码它本身 temp=tp*0.0625*10+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就 //算加上0.5,还是在小数点后面。 } datas[0] = temp / 1000; datas[1] = temp % 1000 / 100; datas[2] = temp % 100 / 10; datas[3] = temp % 10; Write_com(0x82); //写地址 80表示初始地址 Write_data('0'+datas[0]); //百位 Write_com(0x83); //写地址 80表示初始地址 Write_data('0'+datas[1]); //十位 Write_com(0x84); //写地址 80表示初始地址 Write_data('0'+datas[2]); //个位 Write_com(0x85); //写地址 80表示初始地址 Write_data('.'); //显示 ‘.’ Write_com(0x86); //写地址 80表示初始地址 Write_data('0'+datas[3]); //显示小数点 Write_com(0x87); //写地址 80表示初始地址 Write_data(0xdf); Write_com(0x88); //写地址 80表示初始地址 Write_data('C'); }
评论
    相关推荐
    • 数据库课程设计
      一个数据库课程设计,access管理工具实现,用的是窗体!
    • 数据库课程设计
      数据库课程设计十分完整有需要的请下载啊谢谢
    • 数据库课程设计
      广东工业大学数据库课程设计,可视化界面连接数据库,delphi7
    • 数据库课程设计
      数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述
    • 数据库课程设计
      数据库课程设计》由周爱武、汪海威、肖云编著,遵循数据库课程设计的具体要求,独立于具体的数据库教材,从实际应用系统的需求着手,引导读者逐步完成数据库设计全过程,重点讲解数据库系统的需求分析、概念设计、...
    • 数据库课程设计
      数据库课程设计人事管理系统 数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计...
    • 数据库课程设计
      数据库课程设计,基于visual basic自助银行管理系统,界面很清爽,实用。同学都说好,所以就上传了!!!
    • 数据库课程设计
      数据库课程设计 里面有详细的文档资料 包含数据库一切的图 以及生成的数据库表文件 期末得分为优秀
    • 数据库课程设计
      可以作为数据库课程设计,也可以作为Java的课程设计,内容全面。本资源转载的,非本人原创。用于交流学习,特此申明!
    • 数据库课程设计
      数据库课程设计蓝天大学学生管理系统 2.商店信息管理系统 3.实验室机房收费管理系统 4.图书馆资料检索系统 5.企业库存管理系统 6.仓库管理系统 7.工程项目管理系统 8.教材管理系统 9.企业人事管理系统 10.企业财务...