?? temp.c
字號:
#include <msp430x22x4.h>
#include "lcdforadc.h"
#define DQ1 P4OUT|=BIT4
#define DQ0 P4OUT&=~BIT4
float Temper=0.0;
int temperature=0;
unsigned char Error = 0;
unsigned char rom_seq[8];
unsigned char tab[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
void GetTemp();
//----------------------------------
//功能:us 級別延時
// n=10,則延時10*5+6=56uS
//----------------------------------
void DelayNus(unsigned int n)
{
while(n--){};
}
//-----------------------------------
//功能:寫18B20
//-----------------------------------
void Write_18B20(unsigned char n)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ0;
DelayNus(1);//延時13us 左右
if((n&0X01)==0X01) DQ1;
else DQ0;
n=n>>1;
DelayNus(9);//延時50us 以上
DQ1;
}
}
//------------------------------------
//功能:讀取18B20
//------------------------------------
unsigned char Read_18B20(void)
{
unsigned char i;
unsigned char temp;
for(i=0;i<8;i++)
{
temp=temp>>1;
DQ0;
_NOP();//延時1us
DQ1;
_NOP();_NOP();//延時5us
_NOP();_NOP();_NOP();
P4DIR&=~BIT4;
if((P4IN&BIT4)==0)
temp=temp&0x7F;
else
temp=temp|0x80;
DelayNus(7);//延時40us
P4DIR|=BIT4;
DQ1;
}
return temp;
}
//-----------------------------------
void Init (void)
{
DQ0;
DelayNus(50);//延時500us
DQ1;
DelayNus(17);//延時90us
P4DIR&=~BIT4;
if((P4IN&BIT4)==BIT4) //0001 1111b=1f
{
Error =1; //失敗1
P4DIR|=BIT4;
}
else
{
Error = 0;//初始化成功
P4DIR|=BIT4;
DQ1;
}
}
//----------------------------------
void Skip(void)
{
Write_18B20(0xcc);
}
//----------------------------------
void Convert (void)
{
Write_18B20(0x44);
}
//----------------------------------
void ReadDo (void)
{
Write_18B20(0xbe);
}
//----------------------------------
void ReadTemp(void)
{
char temp_low,temp_high; //溫度值
temp_low=Read_18B20(); //讀低位
temp_high=Read_18B20(); //讀高位
temperature=(temp_high&0x0f);
temperature<<=8;
temperature|=temp_low;
Temper=temperature*0.0625;
}
void GetTemp(void)
{
Init();
Skip();
Convert();
DelayNus(60000);
DelayNus(60000);
DelayNus(60000);//延時1s以上
Init();
Skip();
ReadDo();
ReadTemp();
}
void GetRom()
{
unsigned char i;
Init();
Write_18B20(0x33);
for(i=0;i<8;i++)
{
rom_seq[i]=Read_18B20();
}
}
void InitTA(void)//TA實現定時,每一秒采樣一次
{
TACTL=TASSEL0+TACLR;//定時器A時鐘源為LFXT1,并清TAR
TACCTL0|=CCIE;//CCR0中斷使能
TACCR0=32768;//定時時間為1s
TACTL|=MC0;
}
#pragma vector=TIMERA0_VECTOR//定時器中斷
__interrupt void TA0()
{
GetTemp();
LPM0_EXIT;
}
void showtemp(unsigned char x,unsigned char y)
{
DisplayOneChar(x,y,number[(int)Temper/10]);
DisplayOneChar(x+1,y,number[(int)Temper%10]);
DisplayOneChar(x+2,y,'.');
DisplayOneChar(x+3,y,number[(int)(Temper*10)%10]);
DisplayOneChar(x+4,y,number[(int)(Temper*100)%100%10]);
DisplayOneChar(x+5,y,number[(int)(Temper*1000)%1000%100%10]);
}
void main(void)
{
unsigned char n;
WDTCTL=WDTPW+WDTHOLD; //停狗
P4DIR|=BIT4;
DQ1;
GetRom();
InitTA();
InitLcd();
for(n=0;n<8;n++)
{
DisplayOneChar(n*2,0,tab[rom_seq[n]/16]);
DisplayOneChar(n*2+1,0,tab[rom_seq[n]%16]);
}
DisplayListChar(0,1,"Temper:");
_EINT();
while(1)
{
LPM0;
showtemp(8,1);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -