?? cewen529.c
字號(hào):
//精確0.1
//Pd4 單總線
//PD765 液晶
#include<iom16v.h>
#include<macros.h>
#include<stdio.h>
#include"1602.h"
#define uchar unsigned char
#define uint unsigned int
#define OUT DDRD|=(1<<PD4) //PA7輸出
#define IN DDRD&=~0X10 //PA7輸入
#define DQ_SET PORTD|=(1<<PD4) //PA7拉高
#define DQ_CLE PORTD&=~(1<<PD4) //PA7拉低
#define SKIP_ROM 0xCC //跳過(guò)ROM
#define CONVERT_TEM 0x44 //轉(zhuǎn)換溫度
#define READ_RAM 0xBE //讀暫存器
uchar dqbit,dqdata;//讀暫存器位,字節(jié)
uint Height,Low;
uint w[1];
//延時(shí)1us,晶振8M
void delay_1us(uint m)
{
while(m)
{
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
m--;
}
}
//延時(shí)1ms,晶振8M
/*void delay_1ms(uint t)
{
uint i,j;
for(i=0;i<t;i++)
{
for(j=1;j<(8*143-2);j++)
{
;
}
}
}
*/
/*讀18b20的DQ位*/
uchar DS18B20_DQ_DAT(void)//讀出的位放在dqbit里,該位為1返回1,該位為0返回0
{
dqbit=PIND&0x10; //讀PA7,其余位為0
if(dqbit==0x10) //PA7為1返回1
return 1;
else //PA7為0返回0
return 0;
}
//---------------------------------------------
//name:Ds18b20Reset
//description:復(fù)位ds18b20芯片進(jìn)行初始化
//parameter: no
//---------------------------------------------
void Ds18b20Reset(void)
{
OUT; //PD7置為輸出
DQ_CLE; //主機(jī)拉低總線,產(chǎn)生復(fù)位脈沖
delay_1us(410);//主機(jī)復(fù)位脈沖至少為400us
DQ_SET; //主機(jī)釋放總線
IN; //PD7置為輸入
delay_1us(20); //1820檢測(cè)到總線上升沿后等待15-60us
while(DS18B20_DQ_DAT()); //等待1820發(fā)出應(yīng)答脈沖
while(!DS18B20_DQ_DAT());//1820發(fā)出存在脈沖,持續(xù)60-240us
delay_1us(20); //20us
OUT; //PD7置為輸出
DQ_SET; //主機(jī)釋放總線
}
//---------------------------------------------
//name:Ds18b20Write
//description: 寫一個(gè)字節(jié)
//parameter: dat 要寫入的數(shù)據(jù),無(wú)符號(hào)字符型
//---------------------------------------------
void Ds18b20Write(uchar data)//
{
uchar i;
for(i=0;i<8;i++)
{
DQ_CLE; //總線拉低
//寫1
if(data&0x01)
{
delay_1us(2); //2us
DQ_SET; //寫1
delay_1us(60); //60us,1820采樣,釋放總線,延時(shí)1us后開始寫第二位
}
//寫0
else
{
DQ_CLE; //寫0
delay_1us(65); //65us,寫入0,1820采樣
DQ_SET; //電阻上拉,釋放總線
delay_1us(1); //延時(shí)1us后開始寫第二位
}
data = data>>1;
}
}
//---------------------------------------------
//name:Ds18b20ReadBit
//description: 讀一個(gè)字節(jié)
//parameter: no
//---------------------------------------------
void Ds18b20ReadByte(void)
{
uchar i;
dqdata=0;
for(i=0;i<8;i++)
{
dqdata=dqdata>>1;
OUT; //PD7置為輸出
DQ_CLE; //主機(jī)拉低總線
delay_1us(2); //延時(shí)2us
DQ_SET; //主機(jī)釋放總線,接下來(lái)(15-2)us內(nèi)讀有效
IN; //PD7置為輸入
delay_1us(2); //延時(shí)2個(gè)us后進(jìn)行讀
DS18B20_DQ_DAT(); //讀DQ的數(shù)據(jù)位存放在dqbit的最高位
delay_1us(70); //60us后讀完成
DQ_SET; //主機(jī)釋放總線
if(dqbit) //把讀入的數(shù)存入dqdata
dqdata=(dqdata|0x80);
}
}
//---------------------------------------------
//name:Ds18b20Convert
//description: 命令Ds18b20開始轉(zhuǎn)換溫度
//parameter: no
//---------------------------------------------
void Ds18b20Convert(void)
{
Ds18b20Reset();
delay_1ms(1);
Ds18b20Write(SKIP_ROM); //單接點(diǎn)可以跳過(guò)ROM
Ds18b20Write(CONVERT_TEM);
}
//---------------------------------------------
//name:Ds18b20ReadTem
//description: 從Ds18b20讀取溫度
//parameter: no
//---------------------------------------------
void Ds18b20ReadTem(void)
{
uchar j;
uint Temp,i;
Ds18b20Reset(); //初始化
delay_1ms(1);
Ds18b20Write(SKIP_ROM); //單接點(diǎn)可以跳過(guò)ROM
Ds18b20Write(READ_RAM); //讀存儲(chǔ)器
Ds18b20ReadByte();//0
Low =dqdata;
Ds18b20ReadByte();//1
Height =dqdata;
}
//------------------------------------------
//計(jì)算要輸出的溫度
//------------------------------------------
uint getwendu(void)
{
uchar flag;
float t_shiji;
uint k[3];
//讀取溫度
Ds18b20Convert();
delay_1ms(800);
Ds18b20ReadTem();//獲得Height,Low
flag=Low&0x01;//獲得2(-4)
t_shiji=0.0625*flag;
Low>>=1;
flag=Low&0x01;//2(-3)
t_shiji+=0.125*flag;
Low>>=1;
flag=Low&0x01;//2(-2)
t_shiji+=0.25*flag;
Low>>=1;
flag=Low&0x01;//2(-1)
t_shiji+=0.5*flag;
Low>>=1;
Height<<=4;
t_shiji=Low+Height+t_shiji;
t_shiji*=100;
k[0]=t_shiji/10;//十位,個(gè)位,小數(shù)點(diǎn)
return k[0];
}
//------------------------------
//顯示溫度
//------------------------------
void display(void)
{
uchar s[5];
sprintf(s,"%d",w[0]);
DisplayListChar(s,0);
delay_1ms(50);
}
//-----------------------------
//液晶初始化
//-----------------------------
void init(void)
{
DDRD|=(1<<PD7)|(1<<PD6)|(1<<PD5);
DDRC=0XFF;
delay_1ms(500);
Lcd_Ini();
delay_1ms(500);
}
void main(void)
{
init(); //液晶初始化
while(1)
{
w[0]=getwendu();//獲取最后溫度
display(); //顯示最后溫度
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -