⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 can485_c.c

📁 本人最近编写的dsp2407采用ds18b20测温程序
💻 C
字号:
#include "string.h"
#include "UART_func.h"
#include "SEED-DEC2407.h"

#define uchar unsigned char
#define uint unsigned int
#define PIN_HIGH {*PADATDIR=0xFFFF;}
#define PIN_LOW {*PADATDIR=0xff00;}
#define PIN_READ{time0=*PADATDIR&0x0008;}
/******变量定义*********/
unsigned int     GPR0;
unsigned int     NUMBER;      // SCI receive
unsigned int     NUMBER1;	//	CRC
unsigned int     NUMBER2;	//CRC
unsigned int     time0;      //SCI tressmit
unsigned int     tempdf;           //CRC
unsigned int     tempint;           //CRC
unsigned int     DATA;
unsigned int     DATA1;
unsigned int     DAC0VAL=0x09D0;
unsigned int     DAC1VAL=0x09D0;
unsigned int     DAC2VAL;

/************************/
unsigned int  read_status[8]={0x0001,0x0003,0x0000,0x0041,0x0000,0x0008,0x0014,0x0018};    //Read the status of inveter
unsigned int  read_fault[8]={0x0001,0x0003,0x0000,0x0021,0x0000,0x0001,0x00D4,0x0000};  //Read the fault of inveter
unsigned int  write_inveter[17]={0x0001,0x0010,0x0000,0x0001,0x0000,0x0004,0x0008,0x0000,0x0000,0x0017,0x0070,0x0000,0x0000,0x0005,0x0050,0x0000,0x0000};
unsigned int  feedback_read_status[21];
unsigned int  feedback_read_fault[8];
unsigned int  feedback_write_inveter[8];
/*******子函数列表******/
void SystemInit(void);
void PHANTOM(void);
void set_ds18b20();
void get_temperature();
void read_ds18b20(); 
void write_ds18b20(uchar);
void delay(int n);

/*********主函数*******/

void main(void)
{
                DINT;
                *IFR=*IFR;
             	ESXM;
                EOVM;
                ECNF;
				SystemInit();
               
    while(1)
     {
        NOP;

       set_ds18b20();//初始化ds18b20
	   write_ds18b20(0xcc);//发送 跳过rom匹配命令
	   write_ds18b20(0x44);//发送 温度转换命令
	   delay(60);  //延时等待转换结束600us
	   set_ds18b20(); //初始化ds18b20
	   write_ds18b20(0xcc); //发跳过ROM匹配命令
	   write_ds18b20(0xbe); //发出读温度命令
	   read_ds18b20();   //读温度转换值 

		*WDKEY=0x5555;
        *WDKEY=0x0AAAA;
             }





}
void SystemInit(void)
{
        WSGR = 0x1ff;
        *WDCR = 0x6f;
        *SCSR1 = 0x00DD;//0 0 00 001 0 1101 1101
        *WDKEY=0x5555;
        *WDKEY=0x0AAAA;
        *MCRA = 0x0000;
		*PADATDIR=0x0ffff;
      
}

void PHANTOM(void)
{
 //asm("ret");
 }

void delay(int n)
{int d;
 for(d=0;d<n;d++)
 {
  NOP;
  NOP;
  }

}
/***********************************
名称:set_ds18b20
  功能:初始化ds18b20
  输入参数:无
  输出参数:无
*************************************/
void set_ds18b20()
{
    while(1)
    {
        uchar  flag,d;
        flag=0;
		PIN_HIGH;
		NOP;NOP;NOP;NOP; //先数据线拉高,>1us拉低

        time0=0;    //数据线置低电平
		PIN_LOW;
        for(d=0;d<213;d++){;}
        //delay(65);	//低电平保持480-960us
               
        time0=1;    //数据线置高电平
		PIN_HIGH;
		for(d=0;d<26;d++){;}
        //delay(4);  //高电平保持15-60us
        *PADATDIR=0x00ff;
        time0=*PADATDIR&0x0008;           
        while(time0==0)             //判断DS18B20是否发出低电平信号
        {
            for(d=0;d<106;d++){;}
           // delay(24);            //DS18B20响应脉冲的存在时间为60-240us,延时60-240us
		    *PADATDIR=0x00ff;
			time0=*PADATDIR&0x0008;
            if(time0==0x0008)               //DS18B20发出高电平初始化成功,返回
            {
                flag=1;           //DS18B20初始化成功标志
                break;
            }
        }
        if(flag)                  //初始化成功,再延时480us
        {
        for(d=0;d<213;d++){;}
        // delay(48);
         break;
        }
    }
}
void read_ds18b20()
{
    uchar i,j,temp,temph,templ,delay1,d;
    j=2;                          //读2位字节数据
    do
    {
	  PIN_HIGH;     //先设高电平再拉低
    for(i=8;i>0;i--)              //一个字节分8位读取
    {  
        temp>>=1;                 //读取1位右移1位
        
        time0=0;                    //数据线置低电平>1us
        PIN_LOW;
       NOP;NOP;NOP;NOP;
	   NOP;NOP;NOP;NOP;
        time0=1;                    //数据线置高电平,释放总线
        PIN_HIGH;
       for(d=0;d<6;d++){;}
       // delay(1);            //数据线变低15us后读取数据
        *PADATDIR=0x00ff;
        time0=*PADATDIR&0x0008;
        if(time0==0x0008)                   //读取1位数据
            temp|=0x8000;
		else
		    temp&=0x7FFF;
        PIN_HIGH;
        for(d=0;d<26;d++){;}
      //  delay(6);                //读取数据后延时60us,保证两次读取间隔》60us
         
    }
    if(j==2)                      //读取的第一字节存templ
        templ=temp>>8;
    else
        temph=temp>>8;               //读取的第二字节存temph
    }while(--j);
    tempdf=templ&0x000f;            //将读取的数据转换成温度值,整数部分存tempint,小数部分存tempdf
    templ>>=4;
    temph<<=4;
    tempint=temph|templ;
}
void write_ds18b20(uchar command)
{
    uchar delay1,i,d;
	PIN_HIGH;
    for(i=8;i>0;i--)              //将一字节数据一位一位写入
    {
        time0=0;                    //数据线置低电平
        PIN_LOW;
        NOP;NOP;NOP;NOP;                  //延时>1us,15us内发送数据
        NOP;NOP;NOP;NOP;
        time0=command&0x0001;         //将数据放置在数据线上
        *PADATDIR=0x0ff00|0x0008&(time0<<3);
         for(d=0;d<26;d++){;}
        //delay(5);                 //延时60us,发送数据60-120us
        command=command>>1;       //准备发送下一位数据
        time0=1;                    //发送完一位数据,数据线置高电平
        PIN_HIGH;
        NOP;NOP;NOP;NOP;
		NOP;NOP;NOP;NOP;
        //delay(1);            //延时>1us
           
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -