找回密码
 立即注册

QQ登录

只需一步,快速开始

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

1T单片机的DS18B20源程序(c语言和汇编语言的都有)

[复制链接]
ID:326484 发表于 2018-5-10 02:51 | 显示全部楼层 |阅读模式
1T单片机驱动ds18b20和传统的12t在延时方面有些区别
1T单片机源程序如下:
  1. /**************************************
  2. 温度传感器DS18B20测试程序
  3. 主芯片  : STC12C5A60S2 (1T)
  4. 工作频率: 12.000MHz
  5. **************************************/

  6. #include "REG51.H"
  7. #include "INTRINS.H"

  8. typedef unsigned char BYTE;

  9. sbit DQ = P3^3;                     //DS18B20的数据口位P3.3
  10. BYTE TPH;                           //存放温度值的高字节
  11. BYTE TPL;                           //存放温度值的低字节

  12. void DelayXus(BYTE n);
  13. void DS18B20_Reset();
  14. void DS18B20_WriteByte(BYTE dat);
  15. BYTE DS18B20_ReadByte();

  16. void main()
  17. {
  18.     DS18B20_Reset();                //设备复位
  19.     DS18B20_WriteByte(0xCC);        //跳过ROM命令
  20.     DS18B20_WriteByte(0x44);        //开始转换命令
  21.     while (!DQ);                    //等待转换完成

  22.     DS18B20_Reset();                //设备复位
  23.     DS18B20_WriteByte(0xCC);        //跳过ROM命令
  24.     DS18B20_WriteByte(0xBE);        //读暂存存储器命令
  25.     TPL = DS18B20_ReadByte();       //读温度低字节
  26.     TPH = DS18B20_ReadByte();       //读温度高字节

  27.     while (1);
  28. }

  29. /**************************************
  30. 延时X微秒(STC12C5A60S2@12M)
  31. 不同的工作环境,需要调整此函数
  32. 此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
  33. **************************************/
  34. void DelayXus(BYTE n)
  35. {
  36.     while (n--)
  37.     {
  38.         _nop_();
  39.         _nop_();
  40.     }
  41. }

  42. /**************************************
  43. 复位DS18B20,并检测设备是否存在
  44. **************************************/
  45. void DS18B20_Reset()
  46. {
  47.     CY = 1;
  48.     while (CY)
  49.     {
  50.         DQ = 0;                     //送出低电平复位信号
  51.         DelayXus(240);              //延时至少480us
  52.         DelayXus(240);
  53.         DQ = 1;                     //释放数据线
  54.         DelayXus(60);               //等待60us
  55.         CY = DQ;                    //检测存在脉冲
  56.         DelayXus(240);              //等待设备释放数据线
  57.         DelayXus(180);
  58.     }
  59. }

  60. /**************************************
  61. 从DS18B20读1字节数据
  62. **************************************/
  63. BYTE DS18B20_ReadByte()
  64. {
  65.     BYTE i;
  66.     BYTE dat = 0;

  67.     for (i=0; i<8; i++)             //8位计数器
  68.     {
  69.         dat >>= 1;
  70.         DQ = 0;                     //开始时间片
  71.         DelayXus(1);                //延时等待
  72.         DQ = 1;                     //准备接收
  73.         DelayXus(1);                //接收延时
  74.         if (DQ) dat |= 0x80;        //读取数据
  75.         DelayXus(60);               //等待时间片结束
  76.     }

  77.     return dat;
  78. }

  79. /**************************************
  80. 向DS18B20写1字节数据
  81. **************************************/
  82. void DS18B20_WriteByte(BYTE dat)
  83. {
  84.     char i;

  85.     for (i=0; i<8; i++)             //8位计数器
  86.     {
  87.         DQ = 0;                     //开始时间片
  88.         DelayXus(1);                //延时等待
  89.         dat >>= 1;                  //送出数据
  90.         DQ = CY;
  91.         DelayXus(60);               //等待时间片结束
  92.         DQ = 1;                     //恢复数据线
  93.         DelayXus(1);                //恢复延时
  94.     }
  95. }
复制代码

所有资料51hei提供下载:
http://www.51hei.com/bbs/dpj-116703-1.html


回复

使用道具 举报

ID:61140 发表于 2022-3-31 08:04 | 显示全部楼层
说好的C与汇编的都有呢,汇编在哪我没看到....
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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