?? jkb.c
字號:
//-----------------------------------------------------------------------------
//MAX5417寫
//-----------------------------------------------------------------------------
void i2o_write(unsigned short t,unsigned short s)
{
int i,m;
unsigned short p;//命令字;寫入易失性存貯器中,輸出更新
p=0x11;
scl=1;
for(i=0;i<255;i++){;}
sda=1;
for(i=0;i<255;i++){;}
sda=0;
for(i=0;i<255;i++){;}
scl=0;
for(m=0;m<8;m++)
{
if((s&0x80)==0)
sda=0;
else
sda=1;
scl=1;
for(i=0;i<255;i++){;}
scl=0;
for(i=0;i<255;i++){;}
s=s<<1;
}
scl=1;
for(i=0;i<255;i++){;}
scl=0;
for(i=0;i<255;i++){;}
for(m=0;m<8;m++)
{
if((p&0x80)==0)
sda=0;
else
sda=1;
scl=1;
for(i=0;i<255;i++){;}
scl=0;
for(i=0;i<255;i++){;}
p=p<<1;
}
scl=1;
for(i=0;i<255;i++){;}
scl=0;
for(i=0;i<255;i++){;}
for(m=0;m<8;m++)
{
if((t&0x80)==0)
sda=0;
else
sda=1;
scl=1;
for(i=0;i<255;i++){;}
scl=0;
for(i=0;i<255;i++){;}
t=t<<1;
}
scl=1;
for(i=0;i<255;i++){;}
scl=0;
for(i=0;i<255;i++){;}
scl=1;
for(i=0;i<255;i++){;}
sda=1;
for(i=0;i<255;i++){;}
}
/*void i2o_write(unsigned short t ,unsigned short s)
{
EA=1;//開中斷
while(BUSY); //寫數字電位器1
BUSY = 1; // SMB忙設置
SMB0CN = 0x44; // SMB使能, ACK置低
COMMAND = t; //從地址W/R字節
OP_CODE = 0x11; //命令字節
WORD = (char)t; //數據字節
STO = 0;
STA = 1;
}
void SMBUS_ISR (void) interrupt 7
{
switch (SMB0STA)
{
case 0X08:
SMB0DAT = (COMMAND & 0xFE);
//printf("aa\n");
STA = 0;
SI = 0;
break;
case 0X10:
SMB0DAT = COMMAND;
//printf("bb");
STA = 0;
SI = 0;
break;
case 0X18:
SMB0DAT = OP_CODE;
printf("cc");
SI = 0;
break;
case 0X20:
STO = 1;
STA = 1;
SI = 0;
// printf("dd");
break;
case 0X28:
SMB0DAT=WORD;
while(!SI);
printf("ee");
STO=1;
SI=0;
BUSY=0;
break;
case 0X30:
STO = 1;
STA = 1;
SI = 0;
printf("ff");
EA=0;
}
}
*/
//-----------------------------------------------------------------------------
//MAX5417讀
//-----------------------------------------------------------------------------
void i2o_read()
{
}
//-----------------------------------------------------------------------------
/*
//-----------------------------------------------------------------------------
//延時
//-----------------------------------------------------------------------------
void Delay1us(unsigned char us)
{
while (us)
{
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
--us;
}
}
void Delay15us(void)
{
Delay1us(15);
}
void Delay10us(void)
{
Delay1us(10);
}
//-----------------------------------------------------------------------------
//復位
//-----------------------------------------------------------------------------
bit RstDS1820(void) //返回0-有設備連接1-無設備連接
{
unsigned char i;
bit RstFlag;
RstFlag=1;
DataPortDS1820=0;
for (i=0;i<100;i++) //480us
Delay15us();
DataPortDS1820=1;
for (i=0;i<4;i++) //15us-60us
{
Delay15us();
}
for (i=0;i<16;i++) //60us-240us
{
Delay15us();
if (DataPortDS1820==0) RstFlag=0;
}
for (i=0;i<16;i++) //240us
{
Delay15us();
}
return RstFlag;
}
//-----------------------------------------------------------------------------
//向總線上寫一個字節
//-----------------------------------------------------------------------------
void WriteDS1820(unsigned char ch)
{
unsigned char i;
DataPortDS1820=1;
Delay1us(1);
for (i=0;i<8;i++)
{
EA=0;
DataPortDS1820=0;
Delay15us();
DataPortDS1820=ch&0x1;
EA=1;
Delay15us();Delay15us();Delay15us();
DataPortDS1820=1;
ch=ch>>1;
Delay1us(1);
}
}
//-----------------------------------------------------------------------------
//從總線上讀取一個字節
//-----------------------------------------------------------------------------
unsigned char ReadDS1820(void)
{
unsigned char i,ch;
ch=0;
DataPortDS1820=1;
Delay1us(1);
for (i=0;i<8;i++)
{
EA=0;
DataPortDS1820=0;
Delay10us();
DataPortDS1820=1;
Delay1us(2);
ch=ch>>1;
if (DataPortDS1820==1)
{
ch=ch+0x80;
}
EA=1;
Delay15us();Delay15us();Delay15us();
}
return ch;
}
void SkipROMCode(void)
{
RstDS1820();
WriteDS1820(0xcc);
}
void StartADC(void)
{
RstDS1820(); //復位
WriteDS1820(0xcc); //廣播
WriteDS1820(0x44); //啟動AD轉換 12bit700ms
}
//-----------------------------------------------------------------------------
//讀取溫度
//-----------------------------------------------------------------------------
float GetTempValue(void)
{
unsigned char i,j;
int T;
SkipROMCode();
WriteDS1820(0xBE);
i=ReadDS1820();
j=ReadDS1820();
StartADC();
T=i+j*256;
if (T==0xffff) return 0xffff;
if (T>0x8000)
{
T=-T;
return (0x8000+T*5/8);
}
else
return (T*5/8);
}*/
//-----------------------------------------------------------------------------
//延時
//-----------------------------------------------------------------------------
void delay(word useconds)
{
for(;useconds>0;useconds--);
}
//-----------------------------------------------------------------------------
//復位
//-----------------------------------------------------------------------------
byte ow_reset(void)
{
byte presence;
DQ = 0; //pull DQ line low
delay(29); // leave it low for 480us
DQ = 1; // allow line to return high
delay(3); // wait for presence
presence = DQ; // get presence signal
delay(25); // wait for end of timeslot
return(presence); // presence signal returned
} // 0=presence, 1 = no part
//-----------------------------------------------------------------------------
//從總線上讀取一個字節
//-----------------------------------------------------------------------------
unsigned char read_byte(void)
{
unsigned char i;
unsigned char value = 0;
for (i=8;i>0;i--)
{
value>>=1;
DQ = 0; // pull DQ low to start timeslot
DQ = 1; // then return high
delay(1); //for (i=0; i<3; i++);
if(DQ)value|=0x80;
delay(6); // wait for rest of timeslot
}
return(value);
}
//-----------------------------------------------------------------------------
//向總線上寫一個字節
//-----------------------------------------------------------------------------
void write_byte(char val)
{
byte i;
for (i=8; i>0; i--) // writes byte, one bit at a time
{
DQ = 0; // pull DQ low to start timeslot
DQ = val&0x01;
delay(5); // hold value for remainder of timeslot
DQ = 1;
val=val/2;
}
delay(5);
}
//-----------------------------------------------------------------------------
//讀取溫度
//-----------------------------------------------------------------------------
void Read_Temperature(void)
{
union{
byte c[2];
int x;
}temp;
ow_reset();
write_byte(0xCC); // Skip ROM
write_byte(0xBE); // Read Scratch Pad
temp.c[1]=read_byte();
temp.c[0]=read_byte();
ow_reset();
write_byte(0xCC); //Skip ROM
write_byte(0x44); // Start Conversion
lenduan= temp.x*10/16;// ;
}
//-----------------------------------------------------------------------------
//端冷的溫度值算
//-----------------------------------------------------------------------------
lenduanzhi()
{
if(lenduan&0xff)//lenduan值為溫度值的補碼,若符號位是"1"則,進行還原
{
lenduan=~lenduan;
}
else{}
}
//-----------------------------------------------------------------------------
//采樣程序
//-----------------------------------------------------------------------------
int chaiyang(void )
{
int t;
for(t=0;t<0xffff;t++){;}//延時
for(t=0;t<0xffff;t++){;}//延時
ADC0=0;
// printf("adc0 :%x\n",ADC0);
AD0EN=1;//允許ADC0
AD0INT=0;
AD0BUSY=1;
while(AD0INT==0);//等待直到轉換結束
t=ADC0;
// printf("chaiyangzhi : %x\n",t);
AD0INT=0;
//P3=0xff;
return(t);
}
//-----------------------------------------------------------------------------
//將采樣值轉換成電壓值
//-----------------------------------------------------------------------------
float chaiyangjishuan(int t)
{
int m;
float data r,u,y;
int data n;
m=minlin;
if(chanel_chanshu[((m-1)*3+1)]&0xf000)
{ n=~chanel_chanshu[((m-1)*3+1)];
//printf("%x\n",n);
y=(float)(t+n)/(float)(chanel_chanshu[((m-1)*3+2)]+n);
}
else
{ y=(float)(t-chanel_chanshu[((m-1)*3+1)])/(float)(chanel_chanshu[((m-1)*3+2)]-chanel_chanshu[((m-1)*3+1)]);}
switch(chanel_chanshu[m-1])
{
case 0:
u=y*(82.13-39.24)+39.24;
return(u);
break;
case 1:
u=y*(164.27-78.49)+78.49;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -