c51: 读取 DS1820 序列号 ,并显示

发布者:考古专家最新更新时间:2016-10-14 来源: eefocus关键字:c51  读取  DS1820  序列号 手机看文章 扫描二维码
随时随地手机看文章
//DS1820 应用,读取 DS1820 序列号 ,并显示。


#include
#include

//变量声明
#define uchar unsigned char
#define uint unsigned int

uchar digit[]="0123456789ABCDEF";

//延时1 毫秒 程序
void delayms();

//延时 s 毫秒 程序 
void delaynms(uint);

//初始化 LCD
void InitLCD();

//写LCD 指令
void WriteInstruction(uchar);

//写LCD 数据
void WriteData(uchar);

//写LCD 地址
void WriteAdd(uchar);


//读LCD 状态
uchar BusyTest();

//LCD 忙碌查询
sbit LCDbusy=P1^7;

//LCD 操作位 设置
sbit RS=P2^2;
sbit RW=P2^1;
sbit E=P2^0;
sbit BF=P1^7;

//-----  DS1820 声明 变量 函数
sbit DQ=P3^0;
sbit led=P3^1; //信号指示

uchar TL,TH;  //读取 DS1820 温度数据高位,低位
       
//DS1820 序列号
uchar dat[9];


//初始化 DS1820
bit InitDS1820();

//读取 DS1820 一个字节
uchar ReadOneChar();

//写入 DS1820 一个字节
WriteOneChar(uchar );

 

//读 ROM 序列号
void ReadRom();

//负温度 标志
uchar flag=0;
   


//main 程序
void main() 
{
     
 uchar i,tem,hi,lo;
  
 uchar code str[]="Serial number is:";
    
 //初始化LCD
 InitLCD();
 //写地址
 WriteAdd(0x05);
 //写数据
 i=0; 
 while(str[i]!='\0')
 {
  WriteData(str[i]);

  i++;
 }


 //读 DS1820 序列号
 ReadRom();

  //显示DS1820 序列号
  WriteAdd(0x40);

  //输出序列号,高位在前,低位在后
  for(i=0;i<8;i++)
  {
   tem=dat[7-i];
   hi=tem>>4;
  tem=dat[7-i];
  lo=tem&0x0f;
   
   WriteData(digit[hi]);
  WriteData(digit[lo]);
     
  }

  delaynms(1000);

 

 

 


}


//---  DS1820 程序 -----

//初始化 DS1820
bit InitDS1820()
{
 uchar t;
 bit flag;  
 DQ = 1;          
 _nop_();
  
 DQ = 0; 
          
 //维持600us  
 for(t=0;t<200;t++) ;

 //释放总线
    DQ = 1; 
 
 //等待15~30us,DS1820输出应答信号,
 //此处延时 45us          
    for(t=0;t<15;t++);  
 
 //采样应答信号
 flag=DQ; 

 //应答信号维持60~240us
 // 此处延时 300us , 
 for(t=0;t<100;t++);  
      
    return (flag);    //返回检测成功标志
}

//读取 DS1820 一个字符
//数据的读写都是 低位在前。例写数据,D7~D0,写入顺序D0~D7。
uchar ReadOneChar()
{
 uchar i,t;
 uchar dat;

 //
 for(i=0;i<8;i++)
 {
  //
  dat>>=1;

  //
  //当i=0,此时 dat 的 D7位 对应 温度 TL(TH)的 D0 位 数据 
  //当i=1,此时 dat 的 D7位 对应 温度 TL(TH)的 D1 位 数据 
  //当i=2,此时 dat 的 D7位 对应 温度 TL(TH)的 D2 位 数据 .....
   
  DQ=1;  //c51 驱动
  _nop_();
  
  DQ=0;  //c51 驱动

  _nop_(); //延时1 us 释放总线

  DQ=1;  //c51 释放总线
  
  //DS1820 准备数据
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();

  //采样
  if(DQ==1) //c51 采样
   dat|=0x80; 
  else
   dat|=0x00;

  //完成一个读周期需 60us ,此处延时60us.
  //一个循环约 3us
  for(t=0;t<20;t++);
 }
 return dat;

}

//写入 DS1820 一个字节
//数据的读写都是 低位在前。例写数据,D7~D0,写入顺序D0~D7。
WriteOneChar(uchar dat)
{
 uchar i,t;

 for(i=0;i<8;i++)
 {
  DQ=1;  //c51 驱动
  _nop_();
  DQ=0;  //c51 释放总线

  //从低位开始第i 位数据,传送数据到总线
  DQ=dat&0x01;  
  
  //DS1820在DQ=0 后15~60us 采样。
  //所以 延时 60us,
  for(t=0;t<20;t++);

  //准备下一位数据 ,将数据位移动到D0位置
  dat>>=1;
 }
}

 

// 读 ROM 序列号
void ReadRom()
{
 uchar i; 

 InitDS1820();
 
 //忽略 DS1820 地址 
 WriteOneChar(0x33);
 
 //序列号 低位字节在前,高位字节在后
 for(i=0;i<8;i++)
 {
  //
  dat[i]=ReadOneChar();
 }
}

 


//------  LCD 程序 ----

//初始化 LCD
void InitLCD()
{
 delaynms(15); 
 WriteInstruction(0x38);//  显示模式设置
 delaynms(5);
 WriteInstruction(0x38);
 delaynms(5);
 WriteInstruction(0x38);

 delaynms(5);
 WriteInstruction(0x0d);//显示模式设置: 开显示,不显示光标,闪烁光标

 delaynms(5);
 WriteInstruction(0x06);//显示模式设置: 光标右移,文字不移动。

 delaynms(5);

 

 


 
}


//写 LCD 指令
void WriteInstruction(uchar instruction)
{
 //LCD 忙碌,等待。
 while(BusyTest()==1);

 //写指令
 RS=0;
 RW=0;
 E=0;

 _nop_();
 _nop_();
 _nop_();

 //指令
 P1=instruction;

 _nop_();
 _nop_();
 _nop_();

 E=1;

 _nop_();
 _nop_();
 _nop_();

 E=0;
}


//写LCD 数据
void WriteData(uchar d)
{
  //LCD 忙碌,等待。
 while(BusyTest()==1);

 //写数据
 RS=1;
 RW=0;
 E=0;

 _nop_();
 _nop_();
 _nop_();

 //指令
 P1=d;

 _nop_();
 _nop_();
 _nop_();

 E=1;

 _nop_();
 _nop_();
 _nop_();

 E=0;

}

//写地址,属于写指令
void WriteAdd(uchar ad)
{
 uchar addr=ad+0x80;
 WriteInstruction(addr);
 
}


//读LCD 状态
uchar BusyTest()
{
 bit result;

 //读LCD 状态
 RS=0;
 RW=1;
 E=1;

 _nop_();
 _nop_();
 _nop_();

 //指令
 result=BF;

 _nop_();
 _nop_();
 _nop_();

 E=0;

 return result;


}

 

 


void delaynms(uint s)
{
 uint tem;
 for(tem=0;tem  {
  delayms();
 }

}

//延时 1ms
void delayms()
{
 uchar i;
 for(i=0;i<250;i++);
 for(i=0;i<80;i++);
}

 

c51: 读取 DS1820 序列号 ,并显示。 - 沙粒 - 沙粒的博客
关键字:c51  读取  DS1820  序列号 引用地址:c51: 读取 DS1820 序列号 ,并显示

上一篇:c51:将16进制序列码,转换为16进制数组
下一篇:c51: DS1820

推荐阅读最新更新时间:2024-03-16 15:15

如何在C51文件和汇编语言文件中相互调用?
如何在C51文件和汇编语言文件中相互调用对方文件中的函数? 答:汇编语言文件中对于函数的调用方法,与调用汇编语言中的函数一样,如: LCALL DISPLAY 在C语言文件中调用汇编语言中的函数,必须先声明再调用。声明格式如下: extern 返回值类型 函数名(参数表); 例如: extern unsigned char right_shift ( char, char );
[单片机]
Keil c51的应用及特性解析
Keil c51号称作为51系列单片机最好的开发环境,大家一定都很熟悉。它的一些普通的特性大家也都了解,(书上也都说有)如:因为51内的RAM很小,C51的函数并不通过堆栈传递参数(重入函数除外),局部变量也不存储在堆栈中,而是存在于固定的RAM中及寄存器中。那么看一下下面的程序。 void fun1(unsigned char i) { } 正常情况参数i通过R7传入函数,那么它的实际地址在什么地方呢?就是R7吗?回答这个问题之前我们先来了解keil c51的几个有趣的特性(不考虑重入函数)。 一、函数在调用前定义与在调用后定义产生的代码是有很大差别的(特别是在优化级别大于3级时)。(本人也不太清楚为什么,大概因为在
[单片机]
Keil C51中函数指针的使用
  函数指针在C语言中应用较为灵活。在单片机系统中,嵌入式操作系统、文件系统和网络协议栈等一些较为复杂的应用都大量地使用了函数指针。Keil公司推出的C51编译器是事实上80C51 C编程的工业标准,它针对8051系列CPU硬件在标准ANSI C的基础上进行了扩展;但由于编译器及8051体系结构的限制,造成了在使用函数指针时有很多与ANSI C不同的地方。下面举例说明在不同的情形下函数指针的使用。以下代码均在Keil μVision3、v8.08 C51、默认优化等级的开发环境下验证通过。   1、指向固定地址的指针   在程序设计中,常需要跳转到某一特定的地址上执行,如引导程序的设计。可通过如下C语言实现: int mai
[单片机]
Keil <font color='red'>C51</font>中函数指针的使用
EEPROM 24c02 [读取存储多字节]
先将数据存进去,然后再读出来显示在数码管上。 除了代码里定义的连线外还要把p0连接到8位数码管的8针上。 1 /*----------------------------------------------- 2 名称:IIC协议 EEPROM24c02 3 内容:此程序用于检测EEPROM性能,测试方法如下:写入24c02一些数据,然后在内存中清除这些数据, 4 掉电后主内存将失去这些信息,然后从24c02中调入这些数据。看是否与写入的相同。 5 函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 一定的修改....(本例是1us机器 6 周期,即晶振频率要小于12MHZ) 7 --------------
[单片机]
C51单片机学习笔记之串口通信
简介 串口通信就是单片机和pc之间的一种通信方式。 通信方式:并行,串行,同步,异步(最常用的) 传输方向:单工,半双工(不同时间),全双工 基本结构 相关寄存器 SCON串口控制寄存器(主要用方式1) TB8——在方式2和方式3中,TB8是要作为数据帧第9位被发送出去的,在多机通信中,可用于判断当前数据帧的数据是地址还是数据,TB8=0为数据,TB8=1为地址 RB8——当单片机已经接收一帧数据帧时,会把数据帧中的第9位放到 RB8中。方式0不使用RB8,在方式2和方式3中,RB8为接收到的数据帧的第9位数据位。 TI——方式1、2、3中。当发送数据完毕,硬件会将其置1,当 TI 被置1,会向C
[单片机]
<font color='red'>C51</font>单片机学习笔记之串口通信
Labview与C51单片机实现串口通信
Labview串口通信学会两种方法,一种是利用visa(虚拟仪器软件构架),另一种是调用activeX控件。 第一种方法(VISA)程序如图 首先,设置串口参数,串口初始化,循环内利用VISA WITE实现对串口的写操作,延时200毫秒,用VISA READ实现读操作,中间有个端口属性节点的作用是计算端口的总的字节数。非常简单,但我花了一天时间搞懂。 第二种方法 调用active X 程序图如下所示 ACTIVE X串口通信的最大优点是可以利用中断实现数据的传送或对下位机的控制,MSCOMM32控件实现串口通信主要是通过对其属性节点的设置来实现的。并利用到了事件回调方法实现中断程序。
[单片机]
1050MB/s读取速度+96层QLC,美光Crucial X8移动固态硬盘测评
近年来随着NAND闪存技术的快速发展与普及,固态硬盘SSD已经逐渐成为消费者的首选。外置便携存储也全面改用速度更快的固态闪存,在转存数据、备份文件等操作的时候可以减少等待时间,提高效率。 今天来到我们评测室的正是一款移动固态硬盘,来自美光旗下Crucial品牌的X8(2TB版本)。Crucial X8使用了先进的NVMe协议与USB 3.2 Gen2接口,读写速度进一步提升,官方标称最高读取速度1050MB/s,下面就让我们来详细了解一下这款产品。 与我们之前测试过的512GB版本一样,Crucial X8移动固态硬盘2TB版本非常小巧,整个硬盘略显圆润,三段式的拼接设计,形成了一定程度的对比。尺寸约为110
[嵌入式]
1050MB/s<font color='red'>读取</font>速度+96层QLC,美光Crucial X8移动固态硬盘测评
[C51代码]LCD12864驱动[待续][左右屏]
型号:HY-12864 驱动器:HD61202 DDRAM地址表 /CS1=0 /CS2=0 Y= 0 1 62 63 0 1 62 63 行号 DB0 DB0 DB0 DBO DBO DBO DBO DBO DBO DBO 0
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved