找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4038|回复: 0
打印 上一主题 下一主题
收起左侧

实现稳定的单片机ds1820一线多点测温系统,C51源码,12864液晶显示温度值

[复制链接]
跳转到指定楼层
楼主
美国DALAS公司的温度传感器ds1820芯片具有高灵敏度、易用性、编程布线简单等优点,被应用到工控行业的各种产品中。
本C51源码能够实现稳定的一线多点测温系统,液晶显示温度值。结合硬件的通信即可实现远程多点测温。本c51的ds1820的c语言驱动程序通过实践使用,程序效率高、稳定准确,可直接使用。
且本原码包括了FYD12864液晶显示源码,为FYD12864液晶初使用者提供了一个实例。


  1. //DS1820 C51 子程序
  2. //这里以11.0592M晶振为例,不同的晶体速度可能需要调整延时的时间
  3. #include<reg52.h>
  4. #include<lcd.h>
  5. #include <absacc.h>
  6. /////////////**********先为液晶初始化函数变量声明**********///////////
  7. void WRD(uchar DATA);  //写lcd数据子函数声明
  8. void WRI(uchar com) ; //写lcd指令子函数声明
  9. void RD(uchar INDATA) ; //读lcd数据子函数声明
  10. void CHEBF();  //读lcdBF子函数声明
  11. void lcdinitialdat() ;  //写lcd数据初始化声明
  12. void delaylong(int n) ; //延迟声明
  13. void delay(void);
  14. void locatecursor(uchar H,uchar L);  //定位游标,行H,列L (最大可到四行八列)
  15. uchar bdata state;
  16. sbit BF=state^7;
  17. uchar idata DDRAM;      //设定DDRAM地址第一行80~87,第二行90~97,
  18.                         //第三行为88-8F,第四行为98-9F
  19. uchar idata basfuncset ;    /*0X30基本指令,8位数据 0X34   扩充指令,8位数据*/
  20. uchar idata shiftcursorr=0X14;//游标移位:为14H时,游标右移
  21. uchar idata shiftcursorl=0X10;  //游标移位:为10H时,游标左移                          
  22.                       //18H时为显示左移(在一三行之间或二四行之间),游标跟移;
  23.                                                          //1CH时为显示右移,游标跟移
  24. uchar idata page;     //页号
  25. ////////////////////////////////////////////////////////////////////////////////////////////
  26. sbit DQ =P1^1;//根据实际情况定义端口
  27. typedef unsigned int uint;
  28. void tmdelay(uchar useconds) ;
  29. uchar tm_initial(void) ;
  30. void read_char(void) ;
  31. void write_char(char val) ;
  32. void Read_Temperature(uchar no) ;
  33. uchar temdate[2][2]=
  34. {0,0,  //NO1温度值的低字节和高字节
  35. 0,0}; //NO2温度值的低字节和高字节
  36. uchar tempkey[2][8]=
  37. {0X28,0X8F,0XF3,0X85,0,0,0,0X60, //NO1
  38. 0X28,0X52,0XA4,0X85,0,0,0,0X2A}; //NO2

  39. uchar dy=0;
  40. uchar value = 0;
  41. uchar temint=0;
  42. uint temdot=0;
  43. //////////////////////////////////////////////main staet////////////////////////////////////////////////

  44. main()
  45. {  uchar k=0;
  46.    delaylong(500) ; /////此处必须延时300ms以上,500时为约大于1秒
  47.         //delaylong(350) ; //779ms
  48.   lcdinitialdat() ;//写lcd数据初始化
  49.   delay() ;
  50.   while(1)
  51.   {k=0;
  52.   while(k<2)
  53.   {temint=0;temdot=0;
  54.   Read_Temperature(k);
  55.   locatecursor(k+1,1);  //从第2行首列显示
  56.   WRD('T');WRD('E');   WRD('M');WRD(0X30+k);WRD(':');
  57.   temint=((temdate[k][1]<<4)|(temdate[k][0]>>4));
  58.   temdot=temdate[k][0]&0X0F;
  59.   temdot=temdot*625;
  60.   temint+=temdot/10000;
  61.   WRD(0X30+temint/100);WRD(0X30+temint%100/10);WRD(0X30+temint%10);
  62.   WRD('.');
  63.   WRD(0X30+(temdot%10000/1000));WRD(0X30+temdot%1000/100);
  64.   WRD(0X30+(temdot%100/10));WRD(0X30+temdot%10);
  65.   k++;
  66.   }
  67.   }

  68. }//end main

  69. ///////////////////////////////////////////////end main/////////////////////////////////////////////
  70. //延时
  71. void tmdelay(uchar useconds)
  72. {
  73. while(useconds>0)useconds--;
  74. }  
  75. /*tmdelay(1) ;//16.28us//增加一个就加6.5us
  76.   tmdelay(2) ;//22.78us
  77.   tmdelay(3) ;//29.30us
  78.   tmdelay(4) ;//35.81us
  79.   tmdelay(70) ;//465.49
  80.   tmdelay(74) ;//491.54
  81.   tmdelay(80) ;//530.60
  82.   tmdelay(115)  ;//150us */


  83. //复位
  84. uchar tm_initial(void) ///对的
  85. {
  86. uchar answer=1;
  87. NOANSWE:
  88. DQ = 0; //pull DQ line low
  89. tmdelay(74); // leave it low for 490us
  90. DQ = 1; // allow line to return high
  91. tmdelay(12); // wait >60us for answer pulse
  92. if(DQ==1) {answer=1;goto NOANSWE;}
  93. else if(DQ==0)answer=0;
  94. //locatecursor(1,5);
  95. //WRD(0X30+answer);
  96. tmdelay(40) ;//>250us
  97. DQ=1;
  98. return(answer); //0表示有DS18B20应答,1表示没有应答
  99. }

  100. //从 1-wire 总线上读取一个字节
  101. void read_char(void)
  102. {
  103. uchar i;
  104. value=0;
  105. for (i=8;i>0;i--)
  106. {
  107. value>>=1;
  108. DQ = 1;
  109. dy++;dy++;
  110. DQ = 0; // pull DQ low
  111. dy++;dy++;dy++;dy++;dy++; // wait 1-15us for data in bus
  112. DQ=1; dy++; //pull high
  113. //tmdelay(1);
  114. if(DQ==1)
  115. {value|=0x80;
  116. }else{;}
  117. tmdelay(18) ;//>120us
  118. }
  119. //return(value);
  120. }

  121. //向 1-WIRE 总线上写一个字节
  122. void write_char(uchar val)
  123. {
  124. uchar i;
  125. locatecursor(3,1);
  126. for (i=8; i>0; i--) // writes uchar, one bit at a time
  127. {
  128. //DQ = 1;
  129. //tmdelay(1);
  130. DQ = 0; // pull DQ low to start timeslot
  131. tmdelay(1);
  132. if(val&0X01==1)
  133. {DQ = 1;tmdelay(12); }
  134. else {DQ=0;tmdelay(12); DQ=1;tmdelay(1); }
  135. //tmdelay(10); // hold value for remainder of timeslot

  136. val=val>>1;
  137. }
  138. DQ = 1;
  139. tmdelay(1);
  140. }

  141. ///////读DS18B20的64bit的KEY

  142. //读取温度
  143. void Read_Temperature(uchar no)
  144. {
  145. uchar j=0;
  146. value=0;
  147. if(tm_initial()==1)  goto noanswer;
  148. write_char(0X55); // 匹配 ROM
  149. //写暂存存储器(4EH)、读暂存存储器(BEH)、复制暂存存储器(48H)、温度变换(44H)、重
  150. //新调出EERAM(B8H)和读电源供电方式(B4H)命令
  151. while(j<8)
  152. {
  153. write_char(tempkey[no][j]);
  154. j++;
  155. }
  156. write_char(0x44); // Start Conversion
  157. delaylong(355) ; //>780ms// 延时一段时间,等待AD转换结束,默认12位则>750ms
  158. if(tm_initial()==1)  goto noanswer;
  159. write_char(0X55); // 匹配 ROM
  160. j=0;
  161. while(j<8)
  162. {
  163. write_char(tempkey[no][j]);
  164. j++;
  165. }
  166. write_char(0xBE); // Read Scratch Pad
  167. read_char(); //first temperatue low
  168. temdate[no][0]=value;
  169. read_char(); //then temperatue high
  170. temdate[no][1]=value;
  171. //tm_initial();
  172. //write_char(0xCC); //Skip ROM

  173. //return temp.x/2;
  174. noanswer:;
  175. } //////////////////////////end Read_Temperature(void) ////////////////////



  176. ///////////////////////////

  177. /***************************现为各液晶子函数体******************/////
  178. void WRD(uchar DATA)  //写lcd数据子函数
  179. {
  180.   CHEBF();
  181.   ADWRD=DATA;
  182.   ADWRD=DATA;

  183. }
  184. void WRI(uchar com)  //写lcd指令子函数
  185. {
  186.   CHEBF();
  187.   ADWRI=com;
  188.   ADWRI=com;

  189. }

  190. void CHEBF()    //读lcdBF子函数
  191. {
  192. state=ADRI;
  193. while(BF)
  194. {
  195.   state=ADRI;
  196. }
  197. }
  198. void lcdinitialdat()   //写lcd数据初始化
  199. {
  200.   WRI(0X30) ;      //RE=0基本指令设定
  201.   delay();
  202.   WRI(0X30) ;      //延迟39us
  203.   delay();
  204.   WRI(stadis2);   //游标开,反白允许
  205.   //WRI(0X0E);   //游标开,反白不允许
  206.   //WRI(stadis1);  //游标关,反白不允许
  207.   delay(); //延迟39us
  208.   WRI(clrdis)  ;  //清除显示
  209.   delay(); //延迟39us
  210.   WRI(inpointcursorup);  //AC+1
  211.   delay(); //延迟39us
  212.   

  213. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

下载:
C51源码能够实现稳定的一线多点测温系统,液晶显示温度值.rar (259.6 KB, 下载次数: 57)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表