找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3568|回复: 0
收起左侧

DS18B20读取序列号+1602显示源程序

[复制链接]
ID:233067 发表于 2017-10-30 19:44 | 显示全部楼层 |阅读模式
DS18B20读取序列号+1602显示,H我没加进去,序列号开头是28H,我只放进去28.

单片机源程序如下:

  1. #include <intrins.h>
  2. #include <lcd.h>
  3. typedef unsigned char BYTE;
  4. typedef unsigned int WORD;
  5. #define uchar unsigned char
  6. #define uint unsigned int

  7. uint temp,flag1;
  8. int  LedOut[4];
  9. int temper;

  10. sbit DQ=P3^7;

  11. uchar sn[8];//存序列号

  12. uchar code table[]={0x3f,0x06,0x5b,0x4f,
  13.                                         0x66,0x6d,0x7d,0x07,
  14.                                         0x7f,0x6f,0x77,0x7c,
  15.                                         0x39,0x5e,0x79,0x71};
  16.                        


  17. /*---------        DS18B20-----------*/
  18. void delay1(unsigned char i)
  19. {
  20. while(i--);
  21. }

  22. void initionds18b20()
  23. {

  24.         DQ=0;
  25.         delay1(128);  //900us

  26.         DQ=1;
  27.                 delay1(1);


  28.         while(DQ);  //检测到应答脉冲
  29.     //i=103;while(i>0) i--;//等待870us
  30.         delay1(100);
  31. }

  32. uchar readds18b20()
  33. {  uchar i   = 0;
  34. uchar dat = 0;
  35. for(i=8;i>0;i--)
  36. {
  37.    DQ = 0;                  //将总线拉低,要在1us之后释放总线
  38.                            //单片机要在此下降沿后的15us内读数据才会有效。
  39.    _nop_();                 //至少维持了1us,表示读时序开始
  40.    dat >>= 1;               //让从总线上读到的位数据,依次从高位移动到低位。
  41.    DQ = 1;                  //释放总线,此后DS18B20会控制总线,把数据传输到总线上
  42.    delay1(1);                 //延时7us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us内的最后部分
  43.    if(DQ)                   //控制器进行采样
  44.    {
  45.     dat |= 0x80;            //若总线为1,即DQ为1,那就把dat的最高位置1;若为0,则不进行处理,保持为0
  46.    }        
  47.    delay1(10);               //此延时不能少,确保读时序的长度60us。
  48. }
  49. return (dat);
  50. }



  51. void writeds18b20(uchar dat)
  52. {
  53. uchar i = 0;
  54. for(i=8;i>0;i--)
  55. {
  56.    DQ = 0;                        //拉低总线
  57.    _nop_();                       //至少维持了1us,表示写时序(包括写0时序或写1时序)开始
  58.    DQ = dat&0x01;                 //从字节的最低位开始传输
  59.                                  //指令dat的最低位赋予给总线,必须在拉低总线后的15us内,
  60.                                  //因为15us后DS18B20会对总线采样。
  61.    delay1(10);                     //必须让写时序持续至少60us
  62.    DQ = 1;                        //写完后,必须释放总线,
  63.    dat >>= 1;
  64.    delay1(1);
  65. }
  66. }



  67. void rom() //读取序列号
  68. {
  69. uchar i;
  70. int j;
  71. initionds18b20(); //复位
  72. delay1(1); //延时
  73. writeds18b20(0x33); //发送读序列号子程序
  74. for        (j=0;j<9;j++)
  75. {
  76.          sn[j]=readds18b20(); //读取序列号


  77. }

  78. }



  79. /*---------------lLCD----------------------*/
  80. delay(BYTE ms)
  81. {                                                        // 延时子程序
  82.         BYTE i;
  83.         while(ms--)
  84.         {
  85.                 for(i = 0; i< 250; i++)
  86.                 {
  87.                         _nop_();
  88.                         _nop_();
  89.                         _nop_();
  90.                         _nop_();
  91.                 }
  92.         }
  93. }

  94. BOOL lcd_bz()
  95. {                                                        // 测试LCD忙碌状态
  96.         BOOL result;
  97.         rs = 0;
  98.         rw = 1;
  99.         ep = 1;
  100.         _nop_();
  101.         _nop_();
  102.         _nop_();
  103.         _nop_();
  104.         result = (BOOL)(P0 & 0x80);
  105.         ep = 0;
  106.         return result;       
  107. }


  108. lcd_pos(BYTE pos)
  109. {                                                        //设定显示位置
  110.         LcdWriteCom(pos | 0x80);
  111. }






  112.   void write_lcd_disp(char Rom)
  113. {
  114. uchar i,c,l,h;

  115.      l = Rom & 0x0f;            //取低4位
  116.          h = Rom & 0xf0;                //取高4位  
  117.          h >>= 4;
  118.          if( ( h >= 0x00 )&&( h <= 0x09 ) )
  119.                   LcdWriteData(h+0x30);               //取ASCII码
  120.          else  
  121.                   LcdWriteData(h+0x37);               //取ASCII码

  122.          if( ( l >= 0x00 )&&( l <= 0x09 ) )
  123.                   LcdWriteData(l+0x30);               //取ASCII码
  124.          else  
  125.                   LcdWriteData(l+0x37);               //取ASCII码  

  126.   delay(1);
  127. }




  128. void main()
  129. {

  130. int k;
  131. uchar a,b,c,d,e,f,g,h,j;
  132. LcdInit();                                // 初始化LCD       
  133.                  
  134.    rom();

  135.    a=sn[0];    //调用读序列号子程序
  136.    b=sn[1];
  137. ……………………

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

所有资料51hei提供下载:
ds18b20读取序列号 16022.rar (40.62 KB, 下载次数: 77)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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