흠..이제 회사 퇴사일도 몇일 안남아서 ..자료정리 하다보니 예전에 만든 온도계가 있더군요..
avr atmega128로 걍 ds1620 만든겁니다.. 온도는 데이터 쉬트 보면 -55도~125도 까지 됩니다..
컴파일러는 iar로 한거고 언어는 C쓴겁니다.. 아마 대학 취업나온 초기때 심심해서 만든거 같은데..
걍 참조하시라..
///////////////////////////// DS1620 이용한 온도계///////////////////
#include <iom128.h>
#include <stdio.h>
#include "delay.h"
//#include "port_set.h"
#define DQ_in PINC_Bit3
#define DQ_out PORTC_Bit1
#define SCLK PORTC_Bit2
#define RST PORTC_Bit0
void port_set (void)
{
DDRC = 0x07; // DQ PORTC.3 input, DQ,CLK,RST PORT0~2 output
PORTC = 0x00;
MCUCR = 0x00;
}
void usart(void)
{
UCSR0A = 0x0;
UCSR0B = 0x18; // Tx_enable
UCSR0C = 0x06; // 8bit 전송data
UBRR0H = 0; // 11.0592 Mhz to 115200bps
UBRR0L = 5;
}
void serial_start(char send_data) //DS1620 data 전송
{
unsigned char i;
RST =1;
for(i =0; i<8;i++)
{
SCLK =0;
delay_us(50);
DQ_out = send_data & 0x01; // LSB부터 데이터 보냄.
delay_us(50);
SCLK= 1;
delay_us(50);
send_data >>=1;
} //end for
RST = 0;
} // end serial_out
int serial(char send_data)
{
unsigned char dummy_data,i;
int data2;
dummy_data = send_data;
RST= 1;
for(i =0; i<8;i++)
{
SCLK =0;
delay_us(50);
DQ_out = dummy_data & 0x01;
delay_us(50);
SCLK= 1;
delay_us(50);
dummy_data >>=1;
} //end for
data2 =0;
for(i =0; i<9;i++)
{
SCLK =0; // 02.09
delay_us(50);
if (DQ_in)
data2 |= 0x100;
SCLK = 1; //02.09
delay_us(50);
data2>>=1;
} //end for
RST=0;
data2=data2*0x02;
return (data2);
}
void putch(char data)
{
while(!(UCSR0A & 0x20)); // UDRE0 1? data send UDRE0 0? 유지 -
UDR0 = data ; //data send-
}
int temp_read= 0x00,temp,sign = 0x00,half=0x00; // 02.10
void usart_put( int cnt)
{
char i=0x00;
putch(sign);
i=(cnt/100)+'0';
putch(i);
cnt=(cnt%100); //10
i=(cnt/10)+'0';
putch(i);
cnt = (cnt%10);
i=cnt+'0';
putch(i);
putch('.');
putch(half);
putch('\n');
putch('\r');
}
int value=0x00;
void main( void )
{
port_set();
//usart();
UCSR0B = 0x18;
UBRR0L = 5;
serial_start(0xee);
while(1)
{
value = serial(0xaa);
delay_ms(4);
// temp = value;
// sign = (value & 0x100) ; // 양수면 0 음수면 1
if((value & 0x01)==1) half = 5+'0';
else half = '0';
temp_read = (value>>=1); // 소수점 자리 표현하려고 저장 0.5표현을 위해 한자리 쉬프트
if(value & 0x100)
{
sign = '-';
temp_read = (~temp_read+1) & 0xff;
}
else sign = '+';
usart_put(temp_read);
// putch(0x0a); putch(0x0d);
delay_ms(750);
} //end while
} //end main
어떻게 보면 avr을 이용한 낭비일수도 있지만.. 초기 공부하려는데 낭비가 머가 있겠습니까..
더구나 회사에서 남은 부품으로 만드니.. ㅋㅋ...
그럼 수고
첫댓글 감사합니다
멀요 ㅡ_ㅡ;;
자료 올려주셔서 감사 하다구요^^*
참 이거는 온도가 영상일때는 + 영하일때는 - 로 하여 표현되고 232통신을 합니다. 표현되는 시간은 계산안했지만..대충보니 맨 밑 루프에 딜레이 미리세컨드에 750이니 0.75초 꼴로 나오겠죠..대충... 통신은 새롬데이터맨 쓰면 될듯 싶군요..허허허
넵...또..거듭 감사드립니다