找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1995|回复: 1
收起左侧

单片机读取DS18B20 rom源程序

[复制链接]
ID:273434 发表于 2020-3-25 23:23 | 显示全部楼层 |阅读模式
最近搞了两天18b20单总线挂多个,发现很少能用的,终于弄了个可以用的,读取显示到1602,每两位一起,从右往左,希望给迷途的人一点方向!

单片机源程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. /********************************************************************/
  5. sbit DQ = P1^3;                                //温度传感器信号线
  6. sbit rs = P2^4;                                //LCD数据/命令选择端(H/L)位声明
  7. sbit rw = P2^5;                                //LCD读写控制,写为0,读为1
  8. sbit lcden = P2^6;                        //LCD使能信号端位声明
  9. /********************************************************************/
  10. //uint temp;                                //定义整型的温度数据
  11. //float f_temp;                                //定义浮点型的温度数据
  12. //uint warn_11 = 270;                        //定义温度设定值,是温度值乘以10后的结果
  13. //uint warn_12 = 250;                        //定义温度下限值
  14. //uint warn_h1 = 300;                        //定义温度上限值
  15. /********************************************************************/
  16. void  delay(uint z);                                //延时函数
  17. void  DS18B20_Reset(void);                        //DQ18B20复位,初始化函数
  18. bit   DS18B20_Readbit(void);                //读1位数据函数
  19. uchar DS18B20_ReadByte(void);                //读1个字节数据函数
  20. void  DS18B20_WriteByte(uchar dat);        //向DQ18B20写一个字节数据函数
  21. void  LCD_WriteCom(uchar com);                //1602液晶命令写入函数
  22. void  LCD_WriteData(uchar dat);                //1602液晶数据写入函数
  23. void  LCD_Init();                                        //LCD初始化函数
  24. void  Display18B20Rom(char Rom);        //显示18B20序列号函数
  25. /**********************************************/
  26. /*        主函数                                                                 */
  27. /**********************************************/
  28. void main()
  29. {        uchar a,b,c,d,e,f,g,h;
  30.         LCD_Init();
  31.                 rw = 0;
  32.         DS18B20_Reset();
  33.         delay(1);
  34.         DS18B20_WriteByte(0x33);
  35.         delay(1);
  36.         a = DS18B20_ReadByte();
  37.         b = DS18B20_ReadByte();
  38.         c = DS18B20_ReadByte();
  39.         d = DS18B20_ReadByte();
  40.         e = DS18B20_ReadByte();
  41.         f = DS18B20_ReadByte();
  42.         g = DS18B20_ReadByte();
  43.         h = DS18B20_ReadByte();
  44.         LCD_WriteCom(0x80+0x40);
  45.         Display18B20Rom(h);
  46.         Display18B20Rom(g);
  47.         Display18B20Rom(f);
  48.         Display18B20Rom(e);
  49.         Display18B20Rom(d);
  50.         Display18B20Rom(c);
  51.         Display18B20Rom(b);
  52.         Display18B20Rom(a);
  53.         while(1);
  54. }
  55. /***************************************************/
  56. /*         延时函数:void delay()                                                             */
  57. /*         功能:延时函数                                                                           */
  58. /***************************************************/
  59. void delay(uint z)//延时函数
  60. {
  61.         uint x,y;
  62.         for( x = z; x > 0; x-- )
  63.                 for( y = 110; y > 0; y-- );
  64. }
  65. /***************************************************/
  66. /*         DS18B20函数:void DS18B20_Reset()                                     */
  67. /*         功能:复位18B20                                                                           */
  68. /***************************************************/
  69. void DS18B20_Reset(void)//DQ18B20复位,初始化函数
  70. {
  71.         uint i;
  72.         DQ = 0;
  73.         i = 103;
  74.         while( i > 0 ) i--;
  75.         DQ = 1;
  76.         i = 4;
  77.         while( i > 0 ) i--;
  78. }
  79. /***************************************************/
  80. /*         DS18B20函数:void DS18B20_Readbit()                                  */
  81. /*         功能:读1个字节数据函数                                                              */
  82. /***************************************************/
  83. bit DS18B20_Readbit(void)   //读1位数据函数
  84. {
  85.         uint i;
  86.         bit dat;
  87.         DQ = 0;
  88.         i++;                 //i++起延时作用
  89.         DQ = 1;
  90.         i++;
  91.         i++;
  92.         dat = DQ;
  93.         i = 8;
  94.         while( i > 0 )i--;
  95.         return( dat );
  96. }
  97. /***************************************************/
  98. /*         DS18B20函数:void DS18B20_ReadByte()                               */
  99. /*         功能:读1个字节数据函数                                                              */
  100. /***************************************************/
  101. uchar DS18B20_ReadByte(void)        //读1个字节数据函数
  102. {
  103.         uchar i,j,dat;
  104.         dat = 0;
  105.         for( i = 1; i <= 8; i++ )
  106.         {
  107.                 j = DS18B20_Readbit();
  108.                 dat = ( j << 7 ) | ( dat >> 1 );
  109.         }
  110.         return(dat);
  111. }
  112. /***************************************************/
  113. /*         DS18B20函数:void DS18B20_WriteByte()                             */
  114. /*         功能:向DQ18B20写一个字节数据函数                                            */
  115. /***************************************************/
  116. void DS18B20_WriteByte(uchar dat)        //向DQ18B20写一个字节数据函数
  117. {
  118.         uint i;
  119.         uchar j;
  120.         bit testb;
  121.         for( j=1; j<=8; j++)
  122.         {
  123.                 testb = dat&0x01;
  124.                 dat= dat>>1;
  125.                 if(testb)        //写1
  126.                 {
  127.                         DQ = 0;
  128.                         i++;i++;
  129.                         DQ = 1;
  130.                         i = 8;while(i>0)i--;
  131.                 }
  132.                 else
  133.                 {
  134.                         DQ = 0;        //写0
  135.                         i = 8;while(i>0)i--;
  136.                         DQ = 1;
  137.                         i++;i++;
  138.                 }
  139.         }
  140. }
  141. /***********************************************/
  142. /*  LCD函数:void LCD_WriteCom()                                        */
  143. /*  功能:向LCD写入命令                                                             */
  144. /***********************************************/
  145. void LCD_WriteCom(uchar com)
  146. {
  147.         rs = 0;
  148.                 rw = 0;
  149.         P0 = com;
  150.         delay(5);
  151.         lcden = 0;
  152.         delay(5);
  153.         lcden = 1;
  154.         delay(5);
  155.         lcden = 0;
  156. }
  157. /***********************************************/
  158. /*  LCD函数:void LCD_WriteData(uchar dat)                             */
  159. /*  功能:向LCD写入数据                                                             */
  160. /***********************************************/
  161. void LCD_WriteData(uchar dat)
  162. {
  163.         rs = 1;                                //选择LCD为写入数据状态
  164.                 rw = 0;
  165.         lcden = 0;
  166.         P0 = dat;                            //将待写入数据放到总线上
  167.         delay(5);                           
  168.         lcden = 1;                                //给LCD使能端一个脉冲                          
  169.         delay(5);                                //信号将之前放到总线上
  170.         lcden = 0;                                //的数据写入LCD
  171.         delay(5);
  172. }
  173. /***********************************************/
  174. /*  LCD函数:void LCD_Init()                                                             */
  175. /*  功能:初始化LCD,设定LCD的初始状态                                 */
  176. /***********************************************/
  177. void LCD_Init()
  178. {        
  179.         LCD_WriteCom(0x38);                //LCD显示模式设定
  180.         delay(15);
  181.         LCD_WriteCom(0x08);                //关闭LCD显示
  182.         delay(3);
  183.         LCD_WriteCom(0x01);                //LCD显示清屏
  184.         delay(3);
  185.         LCD_WriteCom(0x06);                //设定光标地址指针为自动加1
  186.         delay(3);
  187.         LCD_WriteCom(0x0c);                //打开LCD显示,但不显示光标
  188. }
  189. /**********************************************/
  190. /*                                                                                           */
  191. /*        显示18B20序列号                                                           */
  192. /*                                                                                       */
  193. /**********************************************/
  194. void Display18B20Rom(char Rom)
  195. {
  196.          uchar h,l;
  197.          l = Rom & 0x0f;            //取低4位
  198.          h = Rom & 0xf0;                //取高4位  
  199.          h >>= 4;
  200.          if( ( h >= 0x00 )&&( h <= 0x09 ) )
  201.                   LCD_WriteData(h+0x30);               //取ASCII码
  202.          else  
  203.                   LCD_WriteData(h+0x37);               //取ASCII码
  204.          if( ( l >= 0x00 )&&( l <= 0x09 ) )
  205.                   LCD_WriteData(l+0x30);               //取ASCII码
  206.          else  
  207.                   LCD_WriteData(l+0x37);               //取ASCII码         
  208. }
复制代码

所有资料51hei提供下载:
读取rom.zip (20.94 KB, 下载次数: 24)

评分

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

查看全部评分

回复

使用道具 举报

ID:720980 发表于 2020-4-2 15:16 | 显示全部楼层
请问楼主能上传一下详细的仿真么?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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