打印
[技术问答]

有没有新唐M051系列的18b20程序

[复制链接]
669|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhuomuniao110|  楼主 | 2019-4-29 13:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求分享个

使用特权

评论回复
沙发
zhuomuniao110|  楼主 | 2019-4-29 13:42 | 只看该作者
/********************************
FILE NAME:        DS18B20.c
CHIP TYPE:        ATMEGA16
CLOCK FREQUENCY:  8MHZ
IDE:              VSMStudio
COMPILER:         AVR-GCC
TIME:             September 2010
********************************/

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

#define uchar unsigned char
#define uint unsigned int
#define BUS PORTC

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

// Pins definition
#define s_digit1 sbit(5,PORTC)
#define c_digit1 cbit(5,PORTC)
#define s_digit2 sbit(4,PORTC)
#define c_digit2 cbit(4,PORTC)
#define out    PORTC
#define DQ_IN  DDRA&=~(1<<7)
#define DQ_OUT DDRA|=(1<<7)
#define S_DQ   sbit(7,PORTA)
#define C_DQ   cbit(7,PORTA)
#define DQ     pin(7,PINA)

// Function Prototypes
void init_ds18b20(void);
uchar readbyte(void);
void writecommand(uchar);
uchar readtemp(void);
uchar a, b, tt;

// Main program
int main(void)
{ uchar i=0, temp;
   // Initialize Stack Pointer
   SPL=0x54;
   SPH=0x04;
   // Configure port pins
   DDRC = 0xff;
   DDRA = 0xff;
   while(1)
    { temp = readtemp();
      for(i=0; i<10; i++)     // 10 measures
       { // output the units
         out = (temp/10) & 0x0f;
         s_digit1;
         c_digit2;
         _delay_ms(5);  
         // output the tens
         out = (temp%10) & 0x0f;
         c_digit1;
         s_digit2;
         _delay_ms(5);  
       }
    }
}

// Start transaction with 1-wire line.
void init_ds18b20(void)
{ DQ_OUT;
   C_DQ ;   
   _delay_us(600);
   S_DQ;   
   _delay_us(50);  
   DQ_IN;
   while(DQ);
   _delay_us(240);
   DQ_OUT;   
   S_DQ;   
   _delay_us(300);
}

// Read a byte from the sensor
uchar readbyte(void)
{ uchar i = 0,data = 0;
   DQ_OUT;
   for (i=0; i<8; i++)
    { C_DQ ;
      data >>= 1;
      _delay_us(3);
      S_DQ;
      DQ_IN;
      _delay_us(12);
      if(DQ)
         data |= 0x80;
      DQ_OUT;
      S_DQ;
      _delay_us(45);
      _delay_us(5);
    }
   return(data);
}

// Write a command to the sensor
void writecommand(uchar data)
{ uchar  i;
   for(i=0; i<8; i++)
    { C_DQ;
      _delay_us(15);   
      if(data & 0x01)
         S_DQ;
      else
         C_DQ;
      _delay_us(45);
      data >>= 1;
      S_DQ;
      _delay_us(2);
    }
}

// Read value from the sensor
uchar readtemp(void)
{ uint t;
   init_ds18b20();
   // Convert
   writecommand(0xCC);
   writecommand(0x44);
   init_ds18b20();
   // Read Scratch memory area
   writecommand(0xCC);
   writecommand(0xBE);
   a = readbyte();
   b = readbyte();
   t = b;
   t <<= 8;
   t = t|a;
   tt = t*0.0625;
        return(tt);
}

使用特权

评论回复
板凳
zhuomuniao110|  楼主 | 2019-4-29 13:42 | 只看该作者
找了一个其他的,等会儿修改修改。

使用特权

评论回复
地板
小灵通2018| | 2019-4-29 17:54 | 只看该作者
把上面的代码需要部分搞出来,替换相应的操作指令为051的

使用特权

评论回复
5
小灵通2018| | 2019-4-29 17:54 | 只看该作者
延时函数也实现了,就可以了。

使用特权

评论回复
6
643757107| | 2019-4-29 23:34 | 只看该作者
时序应该就是按照上面那个,然后替换成你单片机选择管脚的IO。

使用特权

评论回复
7
gejigeji521| | 2019-4-30 09:40 | 只看该作者
/*所用单片机型号为STC89C52RC,晶振为11.0592MHz*/

#include<reg52.h>

#include<intrins.h>



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



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

void Delay1ms(unsigned int t);



/*ds18b20 10*t延时函数*/
void Delay10us(unsigned int t)
{
    unsigned int i;
    for(i=t;i>0;i--)
    {
        _nop_();  _nop_();
        _nop_();  _nop_();
        _nop_();  _nop_();
    }
}




/*dsb8b20 1ms延时函数*/
void Delay1ms(unsigned int t)   //误差 0us
{
    unsigned char a,b,c;
        for(t;t>0;t--)
            for(c=1;c>0;c--)
                for(b=142;b>0;b--)
                    for(a=2;a>0;a--);
}
/*ds18b20初始化*/
bit Ds_Init()
{
        bit ack;
        Bus=0;
        Delay10us(60);//最小480,最大960
        Bus=1;
        Delay10us(6);//15-60us
        while(Bus==0);
        Bus=1;//让传感器释放总线,避免影响下一步
        return ack;//ack为0则响应成功
}




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


                Bus=0;
                _nop_();
                if((mask&dat)==0)
                {
                        Bus=0;
                }
                else
                {
                        Bus=1;
                }
                Delay10us(6);//15-60us采样
                Bus=1;
                _nop_();
                _nop_();
        }
}


/*ds18b20读时序*/
unsigned char Ds_Read()
{
        unsigned char dat=0;
        unsigned char mask,fmask;
        for(mask=0x01;mask!=0;mask<<=1)//一个周期需要至少60us,但采样要在15us内完成
        {
                Bus=0;
                _nop_();
                Bus=1;
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                if(Bus==0)//读0
                {
                        fmask=~mask;
                        dat=dat&fmask;
                }
                else
                {
                        dat|=mask;
                }
                Delay10us(5);
                Bus=1;


        }
        return dat;
}


/*转换温度子函数*/
void Ds_Change()
{
        Ds_Init();
        Delay1ms(1);
        Ds_Write(0xCC);//跳过ROM寻址
        Ds_Write(0x44);//启动一次温度转换




}


/*ds18b20获取温度子函数*/
unsigned int Get_Temp()
{
        unsigned int temp=0;
        unsigned char LSB,MSB;//用来储存数据的第八位与高八位
        Ds_Init();
        Delay1ms(1);
        Ds_Write(0xCC);//跳过寻址
        Ds_Write(0xBE);//发送读值命令·
        LSB=Ds_Read();
        MSB=Ds_Read();
        temp=MSB;
        temp<<=8;
        temp|=LSB;
        return temp;
}


/*ds18b20  返回最终结果子函数*/
unsigned int Ds_Result()
{
        float tp;
        unsigned int temp;
        Delay1ms(10);//10ms度过不稳定期
         Ds_Change();//转换温度
        Delay1ms(1000);//延时1s等待转化
        temp=Get_Temp();
        tp=temp;
        temp=tp*0.0625;
        return temp;//最终结果为temp
}



int main()

{

    unsigned int temp;

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

}

使用特权

评论回复
8
gejigeji521| | 2019-4-30 09:41 | 只看该作者
51的参考多,直接修改就行。

使用特权

评论回复
9
BigLeo8| | 2019-4-30 15:15 | 只看该作者

使用特权

评论回复
10
huahuagg| | 2020-2-17 22:14 | 只看该作者
自己实现啊。

使用特权

评论回复
11
幸福小强| | 2020-2-17 22:36 | 只看该作者
仔细研究时序图

使用特权

评论回复
12
幸福小强| | 2020-2-17 22:39 | 只看该作者
按照这个时序,延时用库函数替换。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

188

主题

3247

帖子

10

粉丝