关于松翰2501d与ds18b20接口问题

[复制链接]
查看4697 | 回复3 | 2015-6-12 11:31:04 | 显示全部楼层 |阅读模式
                是必须要把这个信号口接到P10么。而且使能p10开漏输出么?
zhaofu88 | 2015-7-1 08:56:40 | 显示全部楼层
;************************************************************
;-----------------------------------------------------------*
;  DS18B20 sub start                                            *
;-----------------------------------------------------------*
;************************************************************
;************************DS18B20主函数************************
DS18B20_Start:
        call        DS18B20_Init
        mov        A,#0CCH
        call        DS18B20_Write
        mov        A,#044H
        call        DS18B20_Write

        call        DS18B20_Init
        mov        A,#0CCH
        call        DS18B20_Write
        mov        A,#0BEH
        call        DS18B20_Write

        call        DS18B20_Read
        clr        Temper_dp
        clr        Temper_Int

        bts0        Read_Buf.3
        bset        Temper_dp.3
        bts0        Read_Buf.2
        bset        Temper_dp.2
        bts0        Read_Buf.1
        bset        Temper_dp.1
        bts0        Read_Buf.0
        bset        Temper_dp.0

        bts0        Read_Buf.7
        bset        Temper_Int.3
        bts0        Read_Buf.6
        bset        Temper_Int.2
        bts0        Read_Buf.5
        bset        Temper_Int.1
        bts0        Read_Buf.4
        bset        Temper_Int.0

        call        DS18B20_Read

        bts0        Read_Buf.3
        bset        Temper_Int.7
        bts0        Read_Buf.2
        bset        Temper_Int.6
        bts0        Read_Buf.1
        bset        Temper_Int.5
        bts0        Read_Buf.0
        bset        Temper_Int.4

        b0mov        R,#0
        mov        A,Temper_Int
        call        _HEX_TO_DEC
       
        nop

        ret
;----------------------------------------
;----------- DS18B20 Init ---------------
DS18B20_Init:
        bset        DataPinM
        bset        DataPin
        nop
        nop
        bclr        DataPin                ;拉低480us-960us

        b0mov        R,#250                ;
        decms        R
        jmp        $-1

        bclr        DataPinM        ;然后释放总线等待15us-60us

        b0mov        R,#10
        decms        R
        jmp        $-1

        bts0        DataPin                ;等待低电平
        jmp        $-1

        bts1        DataPin                ;等待释放总线电平
        jmp        $-1

        ret
;----------------------------------------
;----------- DS18B20 Write Byte ---------
DS18B20_Write:
        mov        Write_Buf,A
        mov_        WR_Cnt,#8
DS18B20_Write_Loop:
        rrcm        Write_Buf                ;从低位开始写
        bts0        FC
        jmp        DS18B20_Write1
        bts1        FC
        jmp        DS18B20_Write0
DS18B20_Write0:
        bset        DataPinM
        bclr        DataPin
        b0mov        R,#80
        decms        R
        jmp        $-1       
        bclr        DataPinM
        jmp        DS18B20_Write_Ex
DS18B20_Write1:
        bset        DataPinM
        bclr        DataPin        ;写1,在一开始拉低总线电平1微秒后就释放总线为高电平,一直到写周期结束
        nop
        nop
        bclr        DataPinM
        b0mov        R,#80       
        decms        R
        jmp        $-1
        jmp        DS18B20_Write_Ex
DS18B20_Write_Ex:
        decms        WR_Cnt
        jmp        DS18B20_Write_Loop
        ret
;----------------------------------------
;----------- DS1302 Read Byte -----------
DS18B20_Read:
        clr        Read_Buf
        mov_        WR_Cnt,#8
DS18B20_Read_Loop:
        bset        DataPinM        ;
        bset        DataPin
        bclr        DataPin                ;拉低1us之后马上开始读
        nop
        nop
        bclr        DataPinM
        nop
        nop

        b0mov        R,#8                ;14个us之内必须读完
        decms        R
        jmp        $-1

        bclr        FC
        bts0        DataPin
        bset        FC
        rrcm        Read_Buf                ;从低位开始读

        b0mov        R,#60
        decms        R
        jmp        $-1

        decms        WR_Cnt
        jmp        DS18B20_Read_Loop
        mov        A,Read_Buf
        ret
;************************************************************
;-----------------------------------------------------------*
;  DS18B20 sub end                                                *
;-----------------------------------------------------------*
;************************************************************
品丶秋味 | 2015-6-30 13:54:54 | 显示全部楼层

#include<sn8p2511.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ds FP10//sbit ds=FP10
#define led FP12
#define _nop_();
uint temp;
uint f_temp;
#define led2 FP13
#define led1 FP54
void delayms(unsigned long  z)
{
        unsigned long int  x,y;
        for(x=z;x>0;x--)
                for(y=330;y>0;y--);
}
void delayus(unsigned long int xus)
{
        unsigned long int i;
        for(i=xus;i>0;i--);        //7us
        //        for(j=330;j>0;j--);
}
void delay()
{

        _nop_();                //2us
}
/*void main()
{
        FP10M=1;
        P1UR=0XFF;
        while(1)
        {
                FP10=1;
                delayus(300);        900us
                FP10=0;
                delayus(150);        }//500us
}*/
void dsreset(void)
{
//        uint i;
        ds=0;
        delayus(300);//900us
        //i=103;
//        while(i>0)i--;
        ds=1;
        delayus(150);        //500us
//        i=4;
//        while(i>0)i--;
}
        
bit tempreadbit(void)
{
//        uint i;
        bit dat;
        ds=0;delayus(2);
        ds=1;delayus(3);//delay();//i++;i++;
        dat=ds;
        delayus(150);//        i=8;while(i>0)i--;
        return(dat);
}

uchar tempread(void)
{
        uchar i,j,dat;
        dat=0;
        for(i=1;i<=8;i++)
        {
                j=tempreadbit();
                dat=(j<<7)|(dat>>1);
        }
        return(dat);
}

void tempwritebyte(uchar dat)
{
//        uint i;
        uchar j;
        bit testb;
        for(j=1;j<=8;j++)
        {
                testb=dat&0x01;
                dat=dat>>1;
                if(testb)
                {
                        ds=0;
                        delayus(3);//delay();        //i++;i++;
                        ds=1;
                        delayus(150);//        i=8;while(i>0)i--;
                }
                else
                {
                        ds=0;
                delayus(150);//        i=8;while(i>0)i--;
                        ds=1;
                        delayus(3);//i++;i++;
                }
        }
}

void tempchange(void)
{
        dsreset();
        delayms(1);
        tempwritebyte(0xcc);
        tempwritebyte(0x44);
}

uint get_temp()
{

        uchar a,b;
        dsreset();
        delayms(1);
        tempwritebyte(0xcc);
        tempwritebyte(0xbe);
        a=tempread();
        b=tempread();
        temp=b;
        temp<<=8;
        temp=temp|a;
        f_temp=temp*0.0625;
        temp=f_temp*10;//+0.5;
//        f_temp=f_temp+0.05;
        return temp;
}

void deal(uint temp)
{
        if((temp>270)&&(temp<=300))
        {
        FP12=0;        //warn(40,0x01);
        led2=1;
        }                                 
/*        else if(t<=270)
        {
                led1=0;
        }*/
        else  if((temp<370)&&(temp>=300))
        {
        led2=0;        
        FP12=1;//warn(40,0x04);
        }
        }
void main()
{
        FP10M=1;
        FP12M=1;
        FP13=1;
        P1UR=0XFF;
        //FP12=1;
        while(1)
        {
        tempchange();
        get_temp();
        deal(temp);
        }
}

这个程序无法执行,请大神们帮忙看看。。非常感谢!!
zhaofu88 | 2015-7-1 08:57:45 | 显示全部楼层
可以使用普通IO口,但是要注意输入输出模式寄存器的设置,过程需要不断切换
您需要登录后才可以回帖 登录 | 注册

本版积分规则