?? 18b20.txt
字號(hào):
//**************************************************//
//函 數(shù) 功 能: 18B20溫度讀取
//函數(shù)輸入?yún)?shù): PB0 數(shù)據(jù)輸入連接18B20 t溫度數(shù)據(jù)輸出
//CPU芯片類型: ATMEGA16 時(shí)鐘:8M
//編譯器版本: ICCAVR 6.31
//創(chuàng)建人: 寧坤
//創(chuàng)建日期: 2006-8-5
//HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH//
#include<iom16v.h> //包含定義ATmega16寄存器的頭文件
#include<macros.h> //包含一些常用的宏定義
#define LCD_EN_PORT PORTA
#define LCD_RW_PORT PORTA
#define LCD_RS_PORT PORTA
#define LCD_DATA_PORT PORTA
#define LCD_DATA_DDR DDRA
#define LCD_DATA_PIN PINA
#define LCD_EN (1<<PA2) //portc5 out
#define LCD_RW (1<<PA1) //portd3 out/in
#define LCD_RS (1<<PA0) //portc4 out
#define LCD_DATA ((1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7)) //portd4/5/6/7 out
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
void delay(int i) //定時(shí)程序 1.5us左右
{
while(i>=0)
{i--;}
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//復(fù)位程序
int reset()
{
int test=0; //定義返回值 0成功 1失敗
DDRB=0XFF; //設(shè)置數(shù)據(jù)線口為輸出狀態(tài)
PORTB=0xfe; //拉低總線 準(zhǔn)備復(fù)位
delay(450); //延時(shí)600us
PORTB=0xff; //釋放總線
delay(40); //等待60us 準(zhǔn)備接受器件存在信號(hào)
DDRB=0x00; //數(shù)據(jù)口設(shè)置為輸入
test=PINB; //接收器件返回的復(fù)位信號(hào)
delay(400); //等待480us完成復(fù)位
test&=0x01; //處理返回信號(hào)成一位數(shù)據(jù)
DDRB=0XFF; //數(shù)據(jù)口設(shè)置為輸出
PORTB=0XFF; //輸出高電平 釋放總線
return test;
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//寫一比特
void write(int bit)
{int i=8; //循環(huán)8次寫一字節(jié)
for(i=8;i>0;i--)
{DDRB=0XFF; //設(shè)置為輸出
PORTB=0X00; //拉低總線 開始準(zhǔn)備寫數(shù)據(jù)
delay(3); //等待4us
PORTB=0XFF; //釋放總線
delay(10); //延時(shí)15us
PORTB=bit&0x01; //寫數(shù)據(jù)
delay(40); //等待60us 18B20采集數(shù)據(jù)
DDRB=0XFF; //釋放總線
PORTB=0XFF;
bit=bit>>1; //數(shù)據(jù)**右移位** 先發(fā)低位
}
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//讀一字節(jié)
int read(void)
{int i,temp=0,bit=0;
for(i=0;i<8;i++) //循環(huán)8次讀一字節(jié)
{
DDRB=0Xff; //設(shè)置輸出準(zhǔn)備讀數(shù)據(jù)
PORTB=0x00; //拉低總線 開始讀時(shí)間隙
delay(2); //等待3us
PORTB=0XFF; //釋放總線
delay(2); //等待3us
DDRB=0x00; //數(shù)據(jù)口設(shè)置為輸入
delay(1);
temp=PINB; //接收數(shù)據(jù)
delay(40); //等待60us完成讀周期
temp<<=7;
temp&=0x80; //接收數(shù)據(jù)轉(zhuǎn)化為位數(shù)據(jù)
DDRB=0XFF; //釋放總線
PORTB=0XFF;
bit=bit>>1; //數(shù)據(jù)**右移位,先接受高位
bit=bit|temp; //轉(zhuǎn)化為并行數(shù)據(jù)
}
return bit;
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//顯示程序
void led(unsigned long int BCDdata)
{
char led[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//位選緩沖區(qū)
int display[4]={0,0,0,0};//數(shù)據(jù)緩沖區(qū)***跟隨顯示位數(shù)變化而變化
//int ledtable[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段碼列表
unsigned long int data;//臨時(shí)數(shù)據(jù)
int y=100,i;//循環(huán)變量 ****Y滿足18B20轉(zhuǎn)換所需要的500ms**
//DDRC=0Xff; //PD口設(shè)置為段碼輸出
//DDRA=0Xff; //PB口設(shè)置為數(shù)據(jù)輸出
//PORTC=0xff; //顯示消隱
//PORTA=0xff; //顯示消隱
//數(shù)據(jù)轉(zhuǎn)換成十進(jìn)制顯示值
while(y>=0)
{
data=BCDdata;
for(i=0;i<4;i++) //刷新顯示緩沖區(qū)
{
display[i]=data%10|0x30;//16位數(shù)據(jù)轉(zhuǎn)10進(jìn)制數(shù)據(jù)
data=data/10;
}
LCD_write_string1(8,1, display[3]); //百位數(shù)顯示
LCD_write_string1(9,1, display[2]);//十位數(shù)顯示
LCD_write_string1(0x0A,1, display[1]); //個(gè)位數(shù)顯示
LCD_write_string1(0x0C,1, display[0]); //小數(shù)位數(shù)顯示
delay(300); //延時(shí)450us
y--;
}
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
void main()
{int test=0,k=0; //復(fù)位返回 和9直接讀取循環(huán)變量
int m,n,t=0; //臨時(shí)數(shù)據(jù)
int da[9]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};//定義數(shù)據(jù)緩沖區(qū)
DDRA|=LCD_DATA|LCD_RW;
DDRA|=LCD_RS|LCD_EN;
LCD_init();
LCD_write_char(0x01,0); //初始化LCD
LCD_write_string(0,0," DS18B20 OK ");
LCD_write_string(0,1," TEMP: . C ");
while(1)
{
reset(); //復(fù)位
write(0xcc); //發(fā)送不提供ROM編碼命令
write(0x44); //發(fā)送開始轉(zhuǎn)換命令
//循環(huán)顯示500ms以完成溫度轉(zhuǎn)換
reset(); //復(fù)位 準(zhǔn)備讀數(shù)據(jù)
write(0xcc); //發(fā)送不提供ROM編碼命令
write(0xbe); //發(fā)送讀數(shù)據(jù)命令
for(k=0;k<=8;k++) //循環(huán)讀9個(gè)字節(jié)的數(shù)據(jù) 并存儲(chǔ)進(jìn)數(shù)據(jù)緩沖區(qū)
{
test=read();
da[k]=test; //9字節(jié)數(shù)據(jù)依次讀入數(shù)據(jù)緩沖區(qū)
}
reset(); //復(fù)位 下面開始數(shù)據(jù)轉(zhuǎn)換成溫度值
m=da[0]; //度讀溫度低位數(shù)據(jù)
n=da[1]; //讀溫度高位數(shù)據(jù)
n=n<<8; //數(shù)據(jù)整合為16位數(shù)據(jù)
m=(m|n)*10; //數(shù)據(jù)擴(kuò)大10倍,顯示取一位小數(shù)點(diǎn)
t=m>>4;
led(t); //計(jì)算實(shí)際溫度值 t為溫度數(shù)據(jù)*/
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -