http://download.csdn.net/source/1395968 å
ä¸è¿éçç硬件软件é½æãä¸é¢æ¯è½¯ä»¶çï¼è¯´æï¼æ¬ç¨åºä½¿ç¨1602LCDæ¾ç¤ºã温度ééè¯çå·²ç»éæï¼æ¸©åº¦æ¨¡æä¿¡å·å·²ç»å¨DS18B20å
é¨è½¬æ¢ææ°åä¿¡å·ï¼åªéè¦éè¿18B20çæ°æ®å¼è读åå³å¯ï¼å
·ä½è¯·è¯¦ç»é
读DS18B20æ°æ®æåãè¦ç仿çç»æ请å°ä¸ªäººç©ºé´ã大åå°å¼ï¼æ³¨ææ¶åºï¼ä¸²è¡è¯»åæ¶åºè¦æ±æä¸¥æ ¼,ç¨åºæ³¨éå¾è¯¦ç»äºã
/************************************
硬件:M16,DS18B20,å¼èè¿çº¿:DQ-PD2,
仿ç:è¦æ±M16æ¶æ¯è¾¾8MHZ
Author:LCA from WHUT
Application: Temperature Measureing
Date:2007-10
*************************************/
#include "1602LCD.h"
#include "DS1302.h"
//#include "key.h"
#include <iom16v.h>
#include <macros.h>
//BITå¨<macros.h>ä¸å·²ç»å®ä¹#define BIT(x) (1 << (x))
#define DQ_DIR_IN() DDRD&=~BIT(2) //data input
#define DQ_DIR_OUT() DDRD|=BIT(2) //data output
#define DQ_BUS_L() PORTD&=~BIT(2) //Pin output high
#define DQ_BUS_H() PORTD|=BIT(2) //Pin output low
#define BUS_state() (PIND & 0x04) //æ£æµ ds18b20è¿åä¿¡å·
unsigned char wmh,wml,wm3,sign_flag=0;
//unsigned char table[]={"0123456789"};
void DS18B20_init()
{ DQ_DIR_OUT(); //设置PD2 为è¾åº
DQ_BUS_H();
DQ_BUS_L(); //å é¢æ»çº¿
delay_nus(480); //480us以ä¸
DQ_BUS_H(); //éæ¾æ»çº¿
DQ_DIR_IN();
delay_nus(20); //15~60us
while(BUS_state()); //å读DS18B20è¿åä¿¡å·
DQ_DIR_OUT();
DQ_BUS_H(); //éæ¾æ»çº¿
delay_nus(140); //60~240us
}
/**********************************
å½æ°:write_18B20()
åè½:å¾18B20ä¸åå
¥æ°æ®(å½ä»¤)
è¾å
¥åæ°:æ°æ®(å½ä»¤)
è¿ååæ°:æ
注æ:延æ¶
************************************/
void write_18B20(unsigned char x)
{
unsigned char m;
for(m=0;m<8;m++)
{
DQ_BUS_L(); //å é¢æ»çº¿
if(x&(1<<m)) //åæ°æ®äºï¼å
åä½ä½ç
DQ_BUS_H();
else
{DQ_BUS_L();}
delay_nus(40); //15~60us
DQ_BUS_H(); //å®æ¯åéæ¾æ»çº¿
}
DQ_BUS_H();
}
/************************************
å½æ°:read_18B20()
åè½:ä»18B20ä¸è¯»åæ°æ®
è¾å
¥åæ°:æ
è¿ååæ°:读åå¼
注æ:延æ¶
*************************************/
unsigned char read_18B20(void)
{
unsigned char temp,n;
temp=0;
for(n=0;n<8;n++)
{
DQ_BUS_L(); //æä½æ»çº¿
DQ_BUS_H(); //ç½®é«æ»çº¿
DQ_DIR_IN(); //data input
if(BUS_state()) //读æ°æ®,ä»ä½ä½å¼å§
temp|=(1<<n);
else
temp&=~(1<<n);
delay_nus(50); //60~120us
DQ_DIR_OUT(); //data output
}
return (temp);
}
/************************************
å½æ°:get_temper_value();
åè½:ä»18B20ä¸è¯»å温度å¼
è¾å
¥åæ°:æ
è¿ååæ°:æ (å¤çå¼wm3,wmh,wml-å
¨å±åé)
注æ:æ£è´æ¸©åº¦ç转æ¢æ¹æ³,æåä¸æ°æ®
åå¨æ ¼å¼ä¸º:é«8ä½çé«4ä½ä¸ºç¬¦å·ä½
**************************************/
void get_temper_value(void) //读å温度å¼
{
unsigned char temh,wm1;
unsigned char wm0,teml,wm2;
DS18B20_init(); //å¤ä½18b20
write_18B20(0xcc); //skip ROM
write_18B20(0x44); //ååºè½¬æ¢å½ä»¤
DS18B20_init();
write_18B20(0xcc); //skip rom
write_18B20(0xbe); //ååºè¯»å½ä»¤
teml=read_18B20(); //读æ°æ®
temh=read_18B20();
wm0=teml>>4; //ä½8ä½çé«åä½ï¼æ¸©åº¦èå´0~115å¦ï¼
wm1=temh<<4; //åªè¦é«8ä½çä½åä½
wm2=wm1+wm0 ; //16è¿å¶è½¬10è¿å¶
if(wm1&0x80) //æµè¯ç¬¦å·ä½,æµæ¸©èå´-55
{wm2=256-wm2; //æ±åè¡¥ç <br>sign_flag=1; <br>} //为è´æ¸©åº¦
else
{
sign_flag=0;
}
wm3=wm2/100; //ç¾ä½
wmh=(wm2%100)/10; //åºå£åæ°äºï¼wmhæ¯æ¾ç¤ºçé«ä½ï¼wml使æ¾ç¤ºçä½ä½ ,åä½
wml=(wm2%100)%10; //个ä½
}
/************************************
å½æ°:data_display();
åè½:温度å¼æ¾ç¤º(æ¾ç¤ºç¬¦å·ä¸º,ç¾ä½,åä½,个ä½,å°æ°ç¹)
è¾å
¥åæ°:æ (å
¨å±åéwm3,wmh,wml)
è¿ååæ°:æ
注æ:æ¾ç¤ºå°åçå¤ç
**************************************/
void data_display(void)
{ unsigned char add=0;
add=LCD_display_string(0,0,"Tem:");
if(sign_flag)
{LCD_display_string(add++,0,"-");} //æ¾ç¤ºè´å·
if(!sign_flag) //è´æ¸©åº¦çæ¶åä¸æ¾ç¤ºç¾ä½
{LCD_display_num(add++,0,table[wm3]);} //ç¾ä½0
LCD_display_num(add++,0,table[wmh]); //åä½
LCD_display_num(add++,0,table[wml]);
LCD_display_string(add++,0,".");
LCD_display_string(add++,0,"00");
LCD_display_string(add+1,0,"C");
}
void devices_init(void)
{
LCD_init();
DS18B20_init();
DS1302_init();
}
void main()
{unsigned char num=0; <br>devices_init(); <br>while(1) <br>{get_temper_value(); //è·åæ¸©åº¦å¼ <br>data_display(); //æ¾ç¤ºæ¸©åº¦å¼ <br>get_time(); //读åæ¶é并æ¾ç¤º <br>// num=get_key(); <br>//if(num) <br>// {LCD_display_string(14,1,"keynum"); }
}
}