A. ds18820與單片機怎麼連接啊,請求高手指教,小妹比較菜,希望能說詳細點,謝咯
DS18B20資料先下一份。
連接方法灰常簡單。加電。其中DQ連到單片機某個管腳,最好上拉5.1K電阻。
程序如下:
//Author:seuzhouww
#include <reg52.h>
#define FAILURE 0
#define SUCCESS 1
#define uchar unsigned char
#define uint unsigned int
#ifdef F110592MHZ
#define DELAY1820_30 30 //30us時基
#endif
#define SKIPROM 0xcc //取消配置或預置地址(單個DS18B20應用情況下)。
#define MATCROM 0x55 //配置或預置地址
#define WRSCRAT 0x4e //寫中間暫存器內容(報警閾值)2位元組,後面跟TH,TL.
#define RDSCRAT 0xbe //讀中間暫存器內容(報警閾值)9位元組
#define CPSCRAT 0x48 //備份中間暫存器內容(報警閾值)需要延遲10mS等待編程。
#define CONVTEM 0x44 //轉換溫度命令。
#define CURRADD 0x8701 //0x00000000 00008701,64位ROM地址。
#define ALARMTEMPL 0x00
#define ALARMTEMPH 0x50
bit Reset1820(void); //復位DS18B20,返回在線信息。
unsigned char Read1820(void); //獲取1個位元組。
void Write1820(unsigned char dd);
void Control1820(unsigned char); //向DS18B20發命令。
unsigned int ReadTemp(void); //此函數直接讀取溫度.
sbit DQ =P3^5; //第一版為P3.3 第二版為P3.5
unsigned char CurTempL; //當前溫度L
unsigned char CurTempH; //當前溫度H
unsigned char AlarmTempL; //當前溫度L
unsigned char AlarmTempH;
bit Reset1820(void) //復位DS18B20,返回在線信息。
{
uchar i;
DQ=1;
DQ=0;
for(i=0;i<255;i++); //復位低脈寬480-960uS.
DQ=1;
for(i=0;i<DELAY1820_30;i++);
for(i=0;i<DELAY1820_30;i++);
i=0;
while((DQ==1)&&(i<DELAY1820_30)){i++;}
if(i==DELAY1820_30)return FAILURE;//器件在線情況下的ACK.
for(i=0;i<200;i++); //等待器件驗證結束.
DQ=1;
return SUCCESS;
}
uchar Read1820(void) //獲取1個位元組。
{
uchar i=0;
uchar j=0;
uchar k=0;
for(k=0;k<8;k++) //讀取8位
{
DQ=1;
DQ=1;
j>>=1;
DQ=0;
DQ=1; //在讀取前先置1 !!!
for(i=9;i<DELAY1820_30;i++); //14uS
if(DQ==1) j+=0x80; //(LSB)D0 First.
for(i=0;i<DELAY1820_30;i++);
for(i=0;i<DELAY1820_30;i++);
DQ=1;
}
return j;
}
void Write1820(uchar dat)
{
uchar i=0;
uchar j=dat;
uchar k=0;
for(k=0;k<8;k++) //讀取8位
{
DQ=1;
DQ=1;
DQ=0;
DQ=0;
DQ=0;
if((j&1)==1) //(LSB)D0 First.
DQ=1;
for(i=0;i<DELAY1820_30;i++);
for(i=0;i<DELAY1820_30;i++);
for(i=0;i<DELAY1820_30;i++);
j>>=1;
DQ=1;
}
}
void Control1820(uchar command) //向DS18B20發命令。
{
uint add;
uchar crc;
uchar i;
switch(command)
{
case SKIPROM:// 0xcc //取消配置或預置地址(單個DS18B20應用情況下)。
Write1820(SKIPROM);
break;
case MATCROM:// 0x55 //配置或預置地址
Write1820(MATCROM);
add=CURRADD;
Write1820(add&0xff);
Write1820(add>>8);
for(i=0;i<6;i++)
Write1820(0); //64bit ROM add.
break;
case WRSCRAT:// 0x4e //寫中間暫存器內容(報警閾值)2位元組,後面跟TH,TL.
Write1820(WRSCRAT);
Write1820(ALARMTEMPL);
Write1820(ALARMTEMPH);
break;
case RDSCRAT:// 0xbe //讀中間暫存器內容(報警閾值)9位元組
Write1820(RDSCRAT);
CurTempL=Read1820(); //當前溫度L
CurTempH=Read1820(); //當前溫度H
AlarmTempL=Read1820(); //當前溫度L
AlarmTempH=Read1820(); //當前溫度H
crc=Read1820();
crc=Read1820();
crc=Read1820();
crc=Read1820();
crc=Read1820();
break;
case CPSCRAT:// 0x48 //備份中間暫存器內容(報警閾值)需要延遲10mS等待編程。
Write1820(CPSCRAT);
//delay 6mS
add=6500;
while((add--)!=0);
break;
case CONVTEM:// 0x44 //轉換溫度命令。
Write1820(CONVTEM);
break;
default:
break;
}
}
uint ReadTemp(void) //此函數直接讀取溫度./獲取溫度。
{
//以下考慮的是僅單個感測器的讀取。Table5
uint temp;
bit presence;
presence=Reset1820();
if(presence==FAILURE) return 0;
Control1820(SKIPROM);
Control1820(CONVTEM);
while(Read1820()!=0xff);
presence=Reset1820();
if(presence==FAILURE) return 0;
Control1820(SKIPROM);
Control1820(RDSCRAT);
presence=Reset1820();
if(presence==FAILURE) return 0;
temp=CurTempH;
temp<<=8;
temp+=CurTempL;
return temp;
}
B. 普通單片機與加有前綴ds的單片機有什麼區別
都是Microchip公司的PIC系列的單片機。
但你說的後者PIC30F2010不存在。不信去PIC單片機的官方網站查:www.microchip.com
PIC單片機有很多種。PIC10、PIC12、PIC16、PIC18這些都是8位的單片機
而你說的dsPIC30和dsPIC33系列單片機是屬於帶DSP(數字信號處理)功能的16位單片機。而PIC24系列是跟dsPIC30系列單片機相似,就是不帶DSP的16位單片機。
還有就是PIC32系列是32位的單片機,是microchip為了和ARM爭奪高端32位嵌入式晶元市場而生產地。
補充:有dsPIC字樣的是帶DSP功能的16位單片機,可以理解為有ds字樣的就是DSP晶元。DSP晶元:數字處理晶元,可以在一個時鍾周期里完成一個MAC,就是16位乘上16位數,其積再加上一個32位數這兩個操作一個時鍾周期完成。在dsPIC中,就是兩個晶振周期完成,如果晶振是4MHz的話,就是說上述乘法和加法的操作能在2微秒內完成。這MAC是衡量DSP晶元的一個指標。還有就是FFT(快速傅里葉變換)等等。
PIC18和PIC24系列的也有內部的乘法器,但他們的乘法器速度遠遠追不上DSP晶元的MAC。 你可以看看網路對DSP的詳解。
DSP怎麼用,舉個例子:有的語音DSP晶元,可以做一個數字濾波器,兩個人同時說話,麥克風錄入這些聲音到這個濾波器里,濾波器的喇叭可以實時算出某個人的聲音,並且只輸入這個人的聲音(實時的,旁觀者根本分辨不出延時)。這就是DSP晶元的快速數字運算能力所決定的。不要跟我說計算機的CPU也有這么快,計算機的微處理器只是頻率高,在某些工程數學運算場合,它根本比不上DSP晶元。
至於Microchip的dsPIC30系列,因為它是面向於對電機、變頻器的數字控制,所以它要實現上述的語音實時濾波比較困難。至於dsPIC33系列的,因為我沒用過這系列的DSP,所以不敢確定是否能實現上述功能。
使用DSP晶元的快速運算功能需要編程者有《信號與系統》《復變函數》《有限元分析》《小波變換》等等的研究生才學的課程,如果只是拿來做普通單片機,那就太大材小用了。
C. 單片機 DS18B20
意思是說在電氣結構上此時要經過一個足夠的電阻上拉,這樣才能確保之後18B20有能力把匯流排拉低。
匯流排主控端有義務產生符合要求的初始化時序,所以才要寫程序啊……
D. DS1820 怎麼用於單片機哦
他靠單線埠通訊,就是它只需要一根線和單片機連接,剩下兩根分別接電源正極和負極。
編程如下:
先使用一段匯編語言,將其保存為ds.asm
/*-------------------------------------------
程序名: 溫度數據匯編精確時間採集
編寫人: 杜洋
-------------------------------------------*/
DSSP SEGMENT CODE ;程序段
PUBLIC DSS ;入口地址,跳轉到DL標號處執行匯編程序
RSEG DSSP ;程序段
IN EQU P1.6
FLAG1 EQU 05H ;DS18B20器件存在標志
TTL EQU 07H ;溫度讀出值(高位在TTL-1中,低位在TTL中)
;-------------------------------------------DS18B20讀數據程序(0~99度)
; 這是DS18B20復位初始化子程序
INIT_1820:
SETB IN
NOP
CLR IN
;主機發出延時537微秒的復位低脈沖
MOV R1,#18;#3
TSR1:MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB IN;然後拉高數據線
NOP
NOP
NOP
NOP;12倍
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOV R0,#0DEH;#25H
TSR2:
JNB IN,TSR3;等待DS18B20回應
DJNZ R0,TSR2
LJMP TSR4 ; 延時
TSR3:
SETB FLAG1 ; 置標志位,表示DS1820存在
LJMP TSR5
TSR4:
CLR FLAG1 ; 清標志位,表示DS1820不存在
LJMP TSR7
TSR5:
MOV R7,#6
TSR6:
MOV R0,#117
DJNZ R0,$ ; 時序要求延時一段時間 */
DJNZ R7,TSR6 ; 時序要求延時一段時間 */
TSR7:
SETB IN
RET
;------------------------------------------讀出轉換後的溫度值
DSS:
DS1820PRO:
;這里通過調用顯示子程序實現延時一段時間,等待AD轉換結束,12位的話750微秒
SETB IN
LCALL INIT_1820;先復位DS18B20
JB FLAG1,TSS2
jmp BCD33 ; 判斷DS1820是否存在?若DS18B20不存在則返回
TSS2:
MOV A,#0CCH ; 跳過ROM匹配
LCALL WRITE_1820
MOV A,#44H ; 發出溫度轉換命令
LCALL WRITE_1820
CALL DL1MS
SETB IN
LCALL INIT_1820;准備讀溫度前先復位
MOV A,#0CCH ; 跳過ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 發出讀溫度命令
LCALL WRITE_1820
LCALL READ_18200; 將讀出的溫度數據保存到35H/36H
MOV A,TTL
MOV B,TTL-1
MOV C,B.0;將28H中的最低位移入C
RRC A
MOV C,B.1
RRC A
MOV C,B.2
RRC A
MOV C,B.3
RRC A
MOV TTL,A
BCD33:
JB FLAG1,BCD44
mov R7,#0FFH
JMP TORET
BCD44:
MOV R7,TTL
TORET:
RET
;--------------------------------寫DS18B20的子程序(有具體的時序要求)
WRITE_1820:
MOV R2,#8;一共8位數據
CLR C
WR1:
CLR IN
MOV R3,#36;#6
DJNZ R3,$
RRC A
MOV IN,C
MOV R3,#192;#23
DJNZ R3,$
SETB IN
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R2,WR1
SETB IN
RET
;-----------------------------讀DS18B20的程序,從DS18B20中讀出兩個位元組的溫度數據
READ_18200:
MOV R4,#2 ; 將溫度高位和低位從DS18B20中讀出
MOV R1,#TTL ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:
MOV R2,#8;數據一共有8位
RE01:
CLR C
SETB IN
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR IN
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SETB IN
MOV R3,#54;#9
RE10:
DJNZ R3,RE10
MOV C,IN
MOV R3,#138;#23
RE20:
DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
DL1MS:
MOV R7,#6
DL1MS2:
MOV R6,#255
DJNZ R6,$
DJNZ R7,DL1MS2
RET
END
然後可以這樣在C語言中調用(在Keil中,且主程序文件與ds.asm放於同一文件夾內,以下是配合帶中文字元庫的128×64LCD顯示屏,完整程序Hi我)
sbit DQ = P1 ^ 6; //DS18B20溫度感測器定義
unsigned char DSS (void); //匯編語言讀18B20溫度程序聲明
i = DSS();//將DSS匯編程序取得的溫度值放入溫度寄存器變數
if(i < 60){//讀不出溫度數據時不顯示溫度字樣
lcm_w_test(0,0x9C); //溫度在LCM上的寫入位置
lcm_w_word("溫度"); //度C
lcm_w_test(1,i/10+0x30); //顯示溫度十位
lcm_w_test(1,i%10+0x30); //個位
lcm_w_word("℃"); //度C
}
}
E. 單片機中DS03H什麼意思
DS03H沒有任何特別意義,或許應該是D503H,這是一個雙位元組16進制數。
F. DS單片機例如(DS12CR887+5)如何下載程序,例如要用到什麼軟體、什麼線或者什麼驅動的
根據你使用的單片機來決定軟體
另外DS12C887是一款RTC晶元不是單片機
G. 單片機ds18b20程序翻譯
將定時器的初值改一下,4毫秒掃描可能稍微有點短,改為5毫秒試試。
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
H. dsPIC單片機
沒有真沒有
I. 單片機dsdi,dsdo dsck什麼意思
dsck: 時鍾信號。
dsdi: 數據輸入。
dsdo:數據輸出。
上圖是 MPC850的時序圖,圓圈內是晶元參數說明的序號,你忽略即可。
J. 51單片機與DS18B20程序
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P2^2; //數據口define interface
sbit la = P2^6; //數碼管段選
sbit wela = P2^7; //數碼管位選
uint temp; //溫度值 variable of temperature
//不帶小數點
unsigned char code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//帶小數點
unsigned char code table1[] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
/*************精確延時函數*****************/
void delay(unsigned char i)
{
while(--i);
}
/******************************************
此延時函數針對的是12Mhz的晶振
delay(0):延時518us 誤差:518-2*256=6
delay(1):延時7us (原帖寫"5us"是錯的)
delay(10):延時25us 誤差:25-20=5
delay(20):延時45us 誤差:45-40=5
delay(100):延時205us 誤差:205-200=5
delay(200):延時405us 誤差:405-400=5
*******************************************/
/*****************DS18B20******************/
void Init_Ds18b20(void) //DS18B20初始化send reset and initialization command
{
DQ = 1; //DQ復位,不要也可行。
delay(1); //稍做延時
DQ = 0; //單片機拉低匯流排
delay(250); //精確延時,維持至少480us
DQ = 1; //釋放匯流排,即拉高了匯流排
delay(100); //此處延時有足夠,確保能讓DS18B20發出存在脈沖。
}
uchar Read_One_Byte() //讀取一個位元組的數據read a byte date
//讀數據時,數據以位元組的最低有效位先從匯流排移出
{
uchar i = 0;
uchar dat = 0;
for(i=8;i>0;i--)
{
DQ = 0; //將匯流排拉低,要在1us之後釋放匯流排
//單片機要在此下降沿後的15us內讀數據才會有效。
_nop_(); //至少維持了1us,表示讀時序開始
dat >>= 1; //讓從匯流排上讀到的位數據,依次從高位移動到低位。
DQ = 1; //釋放匯流排,此後DS18B20會控制匯流排,把數據傳輸到匯流排上
delay(1); //延時7us,此處參照推薦的讀時序圖,盡量把控制器采樣時間放到讀時序後的15us內的最後部分
if(DQ) //控制器進行采樣
{
dat |= 0x80; //若匯流排為1,即DQ為1,那就把dat的最高位置1;若為0,則不進行處理,保持為0
}
delay(10); //此延時不能少,確保讀時序的長度60us。
}
return (dat);
}
void Write_One_Byte(uchar dat)
{
uchar i = 0;
for(i=8;i>0;i--)
{
DQ = 0; //拉低匯流排
_nop_(); //至少維持了1us,表示寫時序(包括寫0時序或寫1時序)開始
DQ = dat&0x01; //從位元組的最低位開始傳輸
//指令dat的最低位賦予給匯流排,必須在拉低匯流排後的15us內,
//因為15us後DS18B20會對匯流排采樣。
delay(10); //必須讓寫時序持續至少60us
DQ = 1; //寫完後,必須釋放匯流排,
dat >>= 1;
delay(1);
}
}
uint Get_Tmp() //獲取溫度get the temperature
{
float tt;
uchar a,b;
Init_Ds18b20(); //初始化
Write_One_Byte(0xcc); //忽略ROM指令
Write_One_Byte(0x44); //溫度轉換指令
Init_Ds18b20(); //初始化
Write_One_Byte(0xcc); //忽略ROM指令
Write_One_Byte(0xbe); //讀暫存器指令
a = Read_One_Byte(); //讀取到的第一個位元組為溫度LSB
b = Read_One_Byte(); //讀取到的第一個位元組為溫度MSB
temp = b; //先把高八位有效數據賦於temp
temp <<= 8; //把以上8位數據從temp低八位移到高八位
temp = temp|a; //兩位元組合成一個整型變數
tt = temp*0.0625; //得到真實十進制溫度值
//因為DS18B20可以精確到0.0625度
//所以讀回數據的最低位代表的是0.0625度
temp = tt*10+0.5; //放大十倍
//這樣做的目的將小數點後第一位也轉換為可顯示數字
//同時進行一個四捨五入操作。
return temp;
}
/****************數碼碼動態顯示函數**************/
void Display(uint temp) //顯示程序
{
uchar A1,A2,A3;
A1 = temp/100; //百位
A2 = temp%100/10; //十位
A3 = temp%10; //個位
la = 0;
P0 = table[A1]; //顯示百位
la = 1; //打開段選,對應74573的鎖存位,高電平不鎖存
la = 0;
wela = 0;
P0 = 0x7e;
wela = 1; //打開位選
wela = 0;
delay(0);
la = 0;
P0 = table1[A2]; //顯示十位,使用的是有小數點的數組(因為temp值擴大了10倍,雖然是十位,實際為個位)
la = 1;
la = 0;
wela = 0;
P0 = 0x7d;
wela = 1;
wela = 0;
delay(0);
P0 = table[A3]; //顯示個位
la = 1;
la = 0;
P0 = 0x7b;
wela = 1;
wela = 0;
delay(0);
}
void main()
{
while(1)
{
Display(Get_Tmp());
}
}