📄 can485_c.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 + -