[技术问答] 有没有新唐M051系列的18b20程序

[复制链接]
1006|11
 楼主| zhuomuniao110 发表于 2019-4-29 13:09 | 显示全部楼层 |阅读模式
 楼主| zhuomuniao110 发表于 2019-4-29 13:42 | 显示全部楼层
  1. /********************************
  2. FILE NAME:        DS18B20.c
  3. CHIP TYPE:        ATMEGA16
  4. CLOCK FREQUENCY:  8MHZ
  5. IDE:              VSMStudio
  6. COMPILER:         AVR-GCC
  7. TIME:             September 2010
  8. ********************************/

  9. #include <avr/io.h>
  10. #include <util/delay.h>

  11. #define uchar unsigned char
  12. #define uint unsigned int
  13. #define BUS PORTC

  14. // Low level port/pin definitions
  15. #define sbit(x,PORT) (PORT) |= (1<<x)
  16. #define cbit(x,PORT) (PORT) &= ~(1<<x)
  17. #define pin(x,PIN) (PIN) & (1<<x)

  18. // Pins definition
  19. #define s_digit1 sbit(5,PORTC)
  20. #define c_digit1 cbit(5,PORTC)
  21. #define s_digit2 sbit(4,PORTC)
  22. #define c_digit2 cbit(4,PORTC)
  23. #define out    PORTC
  24. #define DQ_IN  DDRA&=~(1<<7)
  25. #define DQ_OUT DDRA|=(1<<7)
  26. #define S_DQ   sbit(7,PORTA)
  27. #define C_DQ   cbit(7,PORTA)
  28. #define DQ     pin(7,PINA)

  29. // Function Prototypes
  30. void init_ds18b20(void);
  31. uchar readbyte(void);
  32. void writecommand(uchar);
  33. uchar readtemp(void);
  34. uchar a, b, tt;

  35. // Main program
  36. int main(void)
  37. { uchar i=0, temp;
  38.    // Initialize Stack Pointer
  39.    SPL=0x54;
  40.    SPH=0x04;
  41.    // Configure port pins
  42.    DDRC = 0xff;
  43.    DDRA = 0xff;
  44.    while(1)
  45.     { temp = readtemp();
  46.       for(i=0; i<10; i++)     // 10 measures
  47.        { // output the units
  48.          out = (temp/10) & 0x0f;
  49.          s_digit1;
  50.          c_digit2;
  51.          _delay_ms(5);  
  52.          // output the tens
  53.          out = (temp%10) & 0x0f;
  54.          c_digit1;
  55.          s_digit2;
  56.          _delay_ms(5);  
  57.        }
  58.     }
  59. }

  60. // Start transaction with 1-wire line.
  61. void init_ds18b20(void)
  62. { DQ_OUT;
  63.    C_DQ ;   
  64.    _delay_us(600);
  65.    S_DQ;   
  66.    _delay_us(50);  
  67.    DQ_IN;
  68.    while(DQ);
  69.    _delay_us(240);
  70.    DQ_OUT;   
  71.    S_DQ;   
  72.    _delay_us(300);
  73. }

  74. // Read a byte from the sensor
  75. uchar readbyte(void)
  76. { uchar i = 0,data = 0;
  77.    DQ_OUT;
  78.    for (i=0; i<8; i++)
  79.     { C_DQ ;
  80.       data >>= 1;
  81.       _delay_us(3);
  82.       S_DQ;
  83.       DQ_IN;
  84.       _delay_us(12);
  85.       if(DQ)
  86.          data |= 0x80;
  87.       DQ_OUT;
  88.       S_DQ;
  89.       _delay_us(45);
  90.       _delay_us(5);
  91.     }
  92.    return(data);
  93. }

  94. // Write a command to the sensor
  95. void writecommand(uchar data)
  96. { uchar  i;
  97.    for(i=0; i<8; i++)
  98.     { C_DQ;
  99.       _delay_us(15);   
  100.       if(data & 0x01)
  101.          S_DQ;
  102.       else
  103.          C_DQ;
  104.       _delay_us(45);
  105.       data >>= 1;
  106.       S_DQ;
  107.       _delay_us(2);
  108.     }
  109. }

  110. // Read value from the sensor
  111. uchar readtemp(void)
  112. { uint t;
  113.    init_ds18b20();
  114.    // Convert
  115.    writecommand(0xCC);
  116.    writecommand(0x44);
  117.    init_ds18b20();
  118.    // Read Scratch memory area
  119.    writecommand(0xCC);
  120.    writecommand(0xBE);
  121.    a = readbyte();
  122.    b = readbyte();
  123.    t = b;
  124.    t <<= 8;
  125.    t = t|a;
  126.    tt = t*0.0625;
  127.         return(tt);
  128. }
 楼主| zhuomuniao110 发表于 2019-4-29 13:42 | 显示全部楼层
找了一个其他的,等会儿修改修改。
小灵通2018 发表于 2019-4-29 17:54 | 显示全部楼层
把上面的代码需要部分搞出来,替换相应的操作指令为051的
小灵通2018 发表于 2019-4-29 17:54 | 显示全部楼层
延时函数也实现了,就可以了。
643757107 发表于 2019-4-29 23:34 | 显示全部楼层
时序应该就是按照上面那个,然后替换成你单片机选择管脚的IO。
gejigeji521 发表于 2019-4-30 09:40 | 显示全部楼层
  1. /*所用单片机型号为STC89C52RC,晶振为11.0592MHz*/

  2. #include<reg52.h>

  3. #include<intrins.h>



  4. sbit Bus=P1^1;//数据单总线



  5. unsigned int Ds_Result();//返回最终结果
  6. bit DS_Init();//初始化子函数
  7. void Ds_Write(unsigned char dat);//“写”子函数(用于向总线写命令)
  8. unsigned char Ds_Read();//“读”子函数(用于从总线读值)
  9. void Ds_Change();//开始转换温度
  10. unsigned int Get_Temp();//获取温度子函数
  11. void Delay10us(unsigned int t);//延时10*t微秒

  12. void Delay1ms(unsigned int t);



  13. /*ds18b20 10*t延时函数*/
  14. void Delay10us(unsigned int t)
  15. {
  16.     unsigned int i;
  17.     for(i=t;i>0;i--)
  18.     {
  19.         _nop_();  _nop_();
  20.         _nop_();  _nop_();
  21.         _nop_();  _nop_();
  22.     }
  23. }




  24. /*dsb8b20 1ms延时函数*/
  25. void Delay1ms(unsigned int t)   //误差 0us
  26. {
  27.     unsigned char a,b,c;
  28.         for(t;t>0;t--)
  29.             for(c=1;c>0;c--)
  30.                 for(b=142;b>0;b--)
  31.                     for(a=2;a>0;a--);
  32. }
  33. /*ds18b20初始化*/
  34. bit Ds_Init()
  35. {
  36.         bit ack;
  37.         Bus=0;
  38.         Delay10us(60);//最小480,最大960
  39.         Bus=1;
  40.         Delay10us(6);//15-60us
  41.         while(Bus==0);
  42.         Bus=1;//让传感器释放总线,避免影响下一步
  43.         return ack;//ack为0则响应成功
  44. }




  45. /*ds18b20写时序*/
  46. void Ds_Write(unsigned char dat)//一个写周期为60-120us,主机在15--45us内对信号采样
  47. {
  48.         unsigned char mask;
  49.         for(mask=0x01;mask!=0;mask<<=1)
  50.         {


  51.                 Bus=0;
  52.                 _nop_();
  53.                 if((mask&dat)==0)
  54.                 {
  55.                         Bus=0;
  56.                 }
  57.                 else
  58.                 {
  59.                         Bus=1;
  60.                 }
  61.                 Delay10us(6);//15-60us采样
  62.                 Bus=1;
  63.                 _nop_();
  64.                 _nop_();
  65.         }
  66. }


  67. /*ds18b20读时序*/
  68. unsigned char Ds_Read()
  69. {
  70.         unsigned char dat=0;
  71.         unsigned char mask,fmask;
  72.         for(mask=0x01;mask!=0;mask<<=1)//一个周期需要至少60us,但采样要在15us内完成
  73.         {
  74.                 Bus=0;
  75.                 _nop_();
  76.                 Bus=1;
  77.                 _nop_();
  78.                 _nop_();
  79.                 _nop_();
  80.                 _nop_();
  81.                 _nop_();
  82.                 _nop_();
  83.                 if(Bus==0)//读0
  84.                 {
  85.                         fmask=~mask;
  86.                         dat=dat&fmask;
  87.                 }
  88.                 else
  89.                 {
  90.                         dat|=mask;
  91.                 }
  92.                 Delay10us(5);
  93.                 Bus=1;


  94.         }
  95.         return dat;
  96. }


  97. /*转换温度子函数*/
  98. void Ds_Change()
  99. {
  100.         Ds_Init();
  101.         Delay1ms(1);
  102.         Ds_Write(0xCC);//跳过ROM寻址
  103.         Ds_Write(0x44);//启动一次温度转换




  104. }


  105. /*ds18b20获取温度子函数*/
  106. unsigned int Get_Temp()
  107. {
  108.         unsigned int temp=0;
  109.         unsigned char LSB,MSB;//用来储存数据的第八位与高八位
  110.         Ds_Init();
  111.         Delay1ms(1);
  112.         Ds_Write(0xCC);//跳过寻址
  113.         Ds_Write(0xBE);//发送读值命令·
  114.         LSB=Ds_Read();
  115.         MSB=Ds_Read();
  116.         temp=MSB;
  117.         temp<<=8;
  118.         temp|=LSB;
  119.         return temp;
  120. }


  121. /*ds18b20  返回最终结果子函数*/
  122. unsigned int Ds_Result()
  123. {
  124.         float tp;
  125.         unsigned int temp;
  126.         Delay1ms(10);//10ms度过不稳定期
  127.          Ds_Change();//转换温度
  128.         Delay1ms(1000);//延时1s等待转化
  129.         temp=Get_Temp();
  130.         tp=temp;
  131.         temp=tp*0.0625;
  132.         return temp;//最终结果为temp
  133. }



  134. int main()

  135. {

  136.     unsigned int temp;

  137.     temp=Ds_Result();//该值即为结果

  138. }
gejigeji521 发表于 2019-4-30 09:41 | 显示全部楼层
51的参考多,直接修改就行。
BigLeo8 发表于 2019-4-30 15:15 | 显示全部楼层
huahuagg 发表于 2020-2-17 22:14 | 显示全部楼层
自己实现啊。
幸福小强 发表于 2020-2-17 22:36 | 显示全部楼层
仔细研究时序图
幸福小强 发表于 2020-2-17 22:39 | 显示全部楼层
按照这个时序,延时用库函数替换。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

233

主题

3529

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部