分享

【学习笔记】单片机的40个经典实验之35:带有存储器功能的数字温度计-DS1624 技术应用

 ChinaAET 2020-10-31

  1. DS1624 基本原理


  DS1624是美国 DALLAS公司生产的集成了测量系统和存储器于一体的芯片。 数字接口电路简单,与 I2C 总线兼容,且可以使用一片控制器控制多达 8 片的 DS1624。其数字温度输出达 13 位,精度为 0.03125℃。DS1624 可工作在最低 2.7V 电压下,适用于低功耗应用系统。

  2. 实验任务

  用一片 DS1624 完成本地数字温度的测量,并通过 8 位数码管显示出测量的 温度值。其硬件电路图如图 4.34.4 所示

  3. 电路原理图


  图 4.34.4

  4. 系统板上硬件连线

  (1). 把“单片机系统”区域中的 P0.0-P0.7 用 8 芯排线连接到“动态 数码显示”区域中的 ABCDEFGH 端子上。

  (2). 把“单片机系统”区域中的 P2.0-P2.7 用 8 芯排线连接到“动态 数码显示”区域中的 S1S2S3S4S5S6S7S8 端子上。

  (3). 把 DS1624 芯片插入到“二线总线模块”区域中的 8 脚集成座上, 注意芯片不插反。

  (4). 把“二线总线模块”区域中的 PIN1 PIN2 分别用导线连接到“单片 机系统”区域中的 P1.6 和 P1.7 端子上。

  (5). 把“二线总线模块”区域中的 PIN4 PIN5 PIN6 分别用导线连接到 “电源模块”区域中的 GND 端子上。

  5. 程序设计内容

  (1). 由于 DS1624 是 I2C 总线结构的串行数据传送,它只需要 SDA 和 SCL 两根线完成数据的传送过程。因此,我们在进行程序设计的时候, 也得按着 I2C 协议来对 DS1624 芯片数据访问。有关 I2C 协议参看 有关资料,这里不详述。对于AT89S51 单片机本身没有 I2C 硬件资 源,所以必须用软件来模拟 I2C 协议过程。

  (2). 要从 DS1624 中读取温度值,首先启动 DS1624 的内部温度 A/D 开始 转换,对应着有相应的命令用来启动开始温度转换,有关 DS1624 的指令集参考前面的叙述。一般情况下,DS1624 经过一次温度的变 换,需要经过1 秒钟左右的时间,所以等待 1 秒钟后,即可读取内 部的温度值,对于读取的温度值,仍然通过 DS1624 的指令集来完 成温度的读取。但所有有数据的传送过程必须遵循 I2C 协议。

  6. C 语言源程序

  #include <AT89X52.H> #include <INTRINS.H> unsigned char code displaybit[]={0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f}; unsigned char code displaycode[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00};

  unsigned char code dotcode[32]={0,3,6,9,12,16,19,22, 25,28,31,34,38,41,44,48, 50,53,56,59,63,66,69,72, 75,78,81,84,88,91,94,97}; sbit SDA=P1^6; sbit SCL=P1^7;unsigned char displaybuffer[8]={0,1,2,3,4,5,6,7}; unsigned char eepromdata[8]; unsigned char temperdata[2];

  unsigned char timecount; unsigned char displaycount;

  bit secondflag=0; unsigned char secondcount=0; unsigned char retn; unsigned int result; unsigned char x; unsigned int k; unsigned int ks;void delay(void); void delay10ms(void); void i_start(void); void i_stop(void); void i_init(void); void i_ack(void); bit i_clock(void); bit i_send(unsigned char i_data); unsigned char i_receive(void); bit start_temperature_T(void); bit read_temperature_T(unsigned char *p); void delay(void) { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); }

  void delay10ms(void) { unsigned int i; for(i=0;i<1000;i++) { delay(); } }

  void i_start(void) { SCL=1; delay(); SDA=0; delay(); SCL=0; delay(); }

  void i_stop(void) { SDA=0;delay(); SCL=1; delay(); SDA=1; delay(); SCL=0; delay(); } void i_init(void) { SCL=0; i_stop(); }

  void i_ack(void) { SDA=0; i_clock(); SDA=1; }

  bit i_clock(void) { bit sample;

  SCL=1; delay(); sample=SDA; _nop_(); _nop_(); SCL=0; delay(); return(sample); }

  bit i_send(unsigned char i_data) { unsigned char i;

  for(i=0;i<8;i++) { SDA=(bit)(i_data & 0x80); i_data=i_data<<1; i_clock();} SDA=1; return(~i_clock()); } unsigned char i_receive(void) { unsigned char i_data=0; unsigned char i;

  for(i=0;i<8;i++) { i_data*=2; if(i_clock()) i_data++; } return(i_data); }

  bit start_temperature_T(void) { i_start(); if(i_send(0x90)) { if(i_send(0xee)) { i_stop(); delay(); return(1); } else { i_stop(); delay(); return(0); } } else { i_stop(); delay(); return(0); } }

  bit read_temperature_T(unsigned char *p){ i_start(); if(i_send(0x90)) { if(i_send(0xaa)) { i_start(); if(i_send(0x91)) { *(p+1)=i_receive(); i_ack(); *p=i_receive(); i_stop(); delay(); return(1); } else { i_stop(); delay(); return(0); } } else { i_stop(); delay(); return(0); } } else { i_stop(); delay(); return(0); } }

  void main(void) { P1=0xff; timecount=0; displaycount=0; TMOD=0x21;TH1=0x06; TL1=0x06; TR1=1; ET1=1; ET0=1; EA=1;

  if(start_temperature_T()) //向 DS1624 发送启动 A/D 温度转换命令,成 功则启动 T0 定时 1s。 { secondflag=0; secondcount=0; TH0=55536/256; TL0=55536%256; TR0=1; } while(1) { if(secondflag==1) { secondflag=0; TR0=0; if(read_temperature_T(temperdata)) //T0 定时 1s 时间到,读取DS1624 的温度值 { for(x=0;x<8;x++) { displaybuffer[x]=16; } x=2; result=temperdata[1]; //将读取的温度值进行数据处理,并送到显示缓 冲区 while(result/10) { displaybuffer[x]=result%10; result=result/10; x++; } displaybuffer[x]=result; result=temperdata[0]; result=result>>3; displaybuffer[0]=(dotcode[result])%10; displaybuffer[1]=(dotcode[result])/10; if(start_temperature_T()) //温度值数据处理完毕,重新启动 DS1624 开始温度转换 { secondflag=0; secondcount=0; TH0=55536/256; TL0=55536%256; TR0=1; } } } } } void t0(void) interrupt 1 using 0 //T0 用于定时 1s 时间到 { secondcount++; if(secondcount==100) { secondcount=0; secondflag=1; } TH0=55536/256; TL0=55536%256; } void t1(void) interrupt 3 using 0 //T1 定时 1ms 用数码管的动态刷新 { timecount++; if(timecount==4) //T1 定时 1ms 到 { timecount=0; if (displaycount==5) { P0=(displaycode[displaybuffer[7-displaycount]] | 0x80); //在该位 同时还要显示小数点 } else { P0=displaycode[displaybuffer[7-displaycount]]; } P2=displaybit[displaycount]; displaycount++; if(displaycount==8) { displaycount=0; }} }

阅读本文用了: 秒,转发只需1秒

转载是一种智慧分享是一种美德❀ 

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多