|
//ICC-AVR application builder : 2012/6/19 下午 10:43:42
// Target : T13
// Crystal: 4.8000Mhz
#include <iot13v.h>
#include <macros.h>
#include "ds18b20.h"
#define CPL PORTB &= ~(1<<PB4)
#define CPH PORTB |=(1<<PB4)
#define DAL PORTB &= ~(1<<PB3)
#define DAH PORTB |=(1<<PB3)
#define FSL PORTB &= ~(1<<PB1)
#define FSH PORTB |=(1<<PB1)
char dsp,tdsp;
char adcdata=0;
flash char LED[]={
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
//0xed,0x21,0x8f,0xab,0x63,0xea,0xee,0xa1,0xef,0xeb
};
void delay1ms(void) //誤差 0us
{
unsigned char a,b;
for(b=4;b>0;b--)
for(a=248;a>0;a--);
}
void delay10ms(void) //誤差 0us
{
unsigned char a,b;
for(b=215;b>0;b--)
for(a=45;a>0;a--);
}
void beep(void) //蜂鳴器響一聲函數
{
unsigned char i;
for (i=0;i<100;i++)
{
FSH;
delay1ms();
FSL; //BEEP取反
delay1ms();
}
for (i=0;i<100;i++)
{
FSH;
//delay1ms();
//FSL; //BEEP取反
delay1ms();
}
}
void send(char a)
{
char i;
for(i=8;i>0;i--)
{
CPL;delay(1);
if(a&0x80)
{
DAH;
}
else
{
DAL;
}
CPH;delay(1);
a=a<<1;
}
}
void disp(void)
{
//FSH;
send(LED[dsp%10]+tdsp);
send(LED[dsp/10]+tdsp);
//delay(255);
//delay(255);FSL;
}
void port_init(void)
{
PORTB = 0x00;
DDRB = 0x1B;
}
void adcstar(void)
{
DIDR0=0x04;
/*
ADMUX (ADC Multiplexer Select Register) PDF86?
bit7 Res ??
bit6 REFS0 0=VCC????????;1=??????
bit5 ADLAR 0=???;1=???(8bit??ADCH??)
bit4:2 Res ??
bit1:0 MUX1,MUX0 ????,00=ADC0(PB5);01=ADC1(PB2);10=ADC2(PB4);11=ADC3 (PB3)
*/
ADMUX=(1<<REFS0)|(0<<ADLAR)|(0<<MUX1)|(1<<MUX0);
ADCSRA=(1<<ADEN)|(1<<ADSC)|(0<<ADATE)|(0<<ADIF)|(0<<ADIE)|(0<<ADPS2)|(1<<ADPS1)|(0<<ADPS0);
/*
ADCSRA (ADC Control and Status Register A) PDF 87?
bit7 ADEN ADC??=1
bit6 ADSC ??ADC????=1
bit5 ADATE ?????
bit4 ADIF ADC????
bit3 ADIE ADC????
bit2:0 ADC ??????
*/
}
#pragma interrupt_handler eeprom_ready_isr:iv_EE_RDY
void eeprom_ready_isr(void)//內部EEPROM讀寫初始化
{
//eeprom ready event
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
MCUCR = 0x00;
TIMSK0 = 0x00; //timer interrupt sources
GIMSK = 0x00; //interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
char key(void)
{
if (ADCSRA&(1<<ADIF))
{
adcdata=ADC/4;
ADCSRA|=(1<<ADSC)|(1<<ADIF); // ???ADC ???? ADIF?1???????1??0
}//delay(100);
return(adcdata);
}
void main(void)
{
char stmp,mode=0;
init_devices();
Init_DS18B20();
adcstar();
ReadTemp();
stmp=EEPROMread(0);//讀取EEPROM預設溫度數據
FSH;
// delay10ms();
//tmp=0;
while(1)
{
if(key()==0)
{
mode++;
if(mode>1)
{
mode=0;
}
while(key()==0);
}
delay10ms();
if(mode==1)
{
tdsp=0x80;
delay10ms();
if(key()==101)
{
stmp++;
if(stmp>99)
{
stmp=99;
}
EEPROMwrite(0,stmp);//向EEPROM寫入預設溫度數據
while(key()==101);
}
delay10ms();
if(key()==173)
{
stmp--;
if(stmp<1)
{
stmp=1;
}
EEPROMwrite(0,stmp);//向EEPROM寫入預設溫度數據
while(key()==173);
}
if(dsp!=stmp)
{
dsp=stmp;
disp();
}
}
ReadTemp();
delay10ms();
if(mode==0)
{
tdsp=0x00;
if(tmp>stmp)
{
beep();
}
else
{
FSH;
}
if(dsp!=tmp)
{
dsp=tmp;
disp();
}
}
//delay10ms();
}
}
/**************************************************************************
THE ds18b20 LIB
File Name: ds18b20.h
***************************************************************************/
#ifndef ds18b20_2005_4_9
#define ds18b20_2005_4_9
#define uchar unsigned char
#define DQL PORTB &= ~(1<<PB0)
#define DQH PORTB |=(1<<PB0)
#define DQ PINB&(1<<PB0)
#define DO DDRB|= (1<<PB0) //PB0定義成輸出
#define DI DDRB&=~(1<<PB0) //PB0定義成輸入
uchar tmp; //
/***********ds18b20延遲子函數(晶振12MHz )*******/
/*
void delay_18B20(unsigned int i)
{
unsigned char a,b;
for(b=9;b>0;b--)
for(a=i;a>0;a--);
}
*/
void delay(unsigned char i)
{
unsigned char a,b;
for(b=2;b>0;b--)
for(a=i;a>0;a--);
}
/**********ds18b20初始化函數**********************/
void Init_DS18B20(void)
{
unsigned char x=0;
DO;
DQH; //拉高總線
delay(30);
DQL; //單片機將DQ拉低
delay(255);delay(50); //精確延時 大于 480us
DQH; //拉高總線
DI;
if(DQ)
{x=0;}else{x=1;}
DO;
DQL;delay(55);
DQH; //拉高總線
delay(55);
}
/***********ds18b20讀一個字節**************/
unsigned char ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DO;
DQL; // 給脈沖信號
delay(1);
dat>>=1; //數據右移一位
DQH;
DI;
if(DQ)
{ dat|=0x80;} //按位或,取最高位
delay(20);
}
return(dat);
}
/*************ds18b20寫一個字節****************/
void WriteOneChar(uchar dat)
{
unsigned char i=0;
DO;
for (i=8; i>0; i--)
{
DQL;
delay(0);
if(dat&0x01)
{DQH;}
else
{DQL;}
delay(25);
DQH; //上升沿將數據送入
dat>>=1;delay(1);
}//DQH;delay(1);
}
/**************讀取ds18b20當前溫度************/
void ReadTemp(void)
{
unsigned char a=0;
unsigned char b=0;
//unsigned char t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳過讀序號列號的操作
WriteOneChar(0x44); // 啟動溫度轉換
delay(255);delay(150); // this message is wery important
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
delay(255);delay(150);
a=ReadOneChar(); //讀取溫度值低位
b=ReadOneChar(); //讀取溫度值高位
//temp_value=b<<4; //左移四位,擴大16倍,變為一個字節的高四位
//temp_value+=(a&0xf0)>>4;//取溫度值的地位的高四位,右移四位后與溫度的高四位相加得到溫度值
//delay(150);
tmp=(b<<4)+((a&0xf0)>>4);
}
//void temp_to_str() //溫度數據轉換成液晶字符顯示
//{
//tmp=temp_value;
//}
#endif
|
評分
-
查看全部評分
|