📄 ds18b20z.c
字号:
//ds18b20 采样程序,每15ms采样读取一次温度值,调用温控算法程序求出对应的占空比,输出PWM波控制TEC工作
//------------------------------------------------------
#include "DSP281x_Device.h"
#include "DSP281x_Examples.h"
//#include "ds18b203.h"
#include "ds18.h"
//float temperature;
void delay(int count);//给count 设定值,延时1us,count=50
int k;
//int v1=0xfffe;
//int v2=0xffff;
void main(void)
{
InitSysCtrl();
//InitGpio();
DS_IO;
DS_QUAL;
EALLOW;
DS_OUT;
// EDIS;
// DINT;
// InitPieCtrl();
// IER = 0x0000;//禁止所有的中断
// IFR = 0x0000;
// InitPieVectTable();
// EALLOW;
// EDIS;
// EINT; // Enable Global interrupt INTM
// ERTM; // Enable Global realtime interrupt DBGM
while(1) //recycle interrupt
{
//float read_temp();
// int j;
// unsigned char buff[2];
//float temprature=0;
while(reset_ds1820()==1){}
write_byte(0xCC);
write_byte(0x44);
// for (j=0;j<1000;j++) delay(3750);
while(reset_ds1820()==1){}
write_byte(0xCC);
write_byte(0xBE);
read_byte();
//read_byte(buff);
//read_byte(buff+1);
// temprature=transform(buff);
DS_OUT;
DS_HI;
//for(k=0;k++;k<5000){delay(3750);}
}
}
unsigned char reset_ds1820(void)
{
// EALLOW;
// int i;
unsigned char flag;
DS_OUT;
DS_HI;
delay(12);//1us
DS_LOW;
delay(6390);//510us
DS_HI;//拉高总线
delay(1000);//80us //等待DS18B20的应答
DS_IN;
flag=DS_DATA;
DS_OUT;
DS_HI;
delay(1600);//200us
return(flag);
}
unsigned char read_byte(void)
{
int i;
Uint16 temp;
temp=0x0000;
DS_OUT;
DS_HI;
for(i=12;i>0;i--)
{
DS_LOW;
//修改于2007,8,14
//delay(25);//2us
//DS_HI;
// delay(175);//14us
delay(175);//14us
DS_HI;
delay(750);//60us
DS_IN;
//delay(480);//58us
if(DS_DATA)temp=temp|0x1000;
else temp=temp&0xefff;
temp=temp>>1;
DS_OUT;
DS_HI;
delay(20);
}
// *readbyte=temp;
return temp ;
}
float transform(unsigned char *t)
{
unsigned char temp=0;
float temprature=0;
temp|=(*(t+1)<<8);
temp|=(*t);
if((temp&0x0F800)==0x0F800)
temprature=0-((~temp)+1)*0.0625;
else temprature=temp*0.0625;
return(temprature);
}
float read_temp()
{
int j;
unsigned char buff[2];
float temprature=0;
while(reset_ds1820()==1){}
write_byte(0xCC);
write_byte(0x44);
for (j=0;j<1000;j++) delay(3750);
while(reset_ds1820()==1){}
write_byte(0xCC);
write_byte(0xBE);
//read_byte(buff);
// read_byte(buff+1);
temprature=transform(buff);
DS_OUT;
DS_HI;
return(temprature);
}
void write_byte(unsigned char command)
{
unsigned char i;
DS_OUT;
DS_HI;
for(i=0.;i<8;i++)
{
DS_LOW;
//delay(71);//10us
delay(125);//10us
GpioDataRegs.GPADAT.all=command&0x0001;
delay(750);//60us
command=command>>1;
delay(9);//1us
}
DS_OUT;
DS_HI;
}
//一条指令执行时间是1/150M,for(i=0;i<count;i++)执行一次相当于用了4count个指令周
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -