久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
51單片機讀取ds18b20數碼管顯示
[打印本頁]
作者:
永遠的lgz
時間:
2018-1-7 20:45
標題:
51單片機讀取ds18b20數碼管顯示
ds1820是簡易的溫度傳感器,簡單易用,下面給我大家分享一下,ds18b20的簡易程序
#include<reg52.H> //單片機頭文件
GetTemp(); //聲明引用外部函數
externunsigned int idata Temperature; // 聲明引用外部變量
voiddelay(unsigned int i);
sbit LS138A=P2^2; //管腳定義
sbit LS138B=P2^3;
sbit LS138C=P2^4;
sbit EN573= P1^3;
//此表為 LED 的字模, 共陰數碼管 “01234567899 –”
unsignedchar code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
unsignedlong LedOut[5],LedNumVal;
voidsystem_Ini() //初始化定時器函數,定時一段時間后,重新讀取溫度值
{
TMOD= 0x11;
TH1 = 0xD8; //10
TL1 = 0xF0;
IE = 0x8A;
TR1 = 1;
}
main()
{
unsigned char i;
EN573=0;
system_Ini();
while(1)
{
GetTemp(); //獲取溫度函數,這個函數再Temp.c 文件中,
/********以下將讀18b20的數據送到LED數碼管顯示*************/
LedNumVal=Temperature; //把實際溫度送到LedNumVal變量中
LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
LedOut[1]=Disp_Tab[LedNumVal%1000/100];
LedOut[2]=Disp_Tab[LedNumVal%100/10]; //十位
LedOut[3]=Disp_Tab[LedNumVal%10]; //個位
for(i=0; i<4; i++)
{
P0 = LedOut ;
switch(i)
{ //138譯碼
case 0:LS138A=0; LS138B=0;LS138C=0; break;
case 1:LS138A=1; LS138B=0;LS138C=0; break;
case 2:LS138A=0; LS138B=1;LS138C=0; break;
case 3:LS138A=1; LS138B=1;LS138C=0; break;
}
delay(100);
}
P0 = 0;
}
}
//延時程序
voiddelay(unsigned int i)
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
Temp.c文件
/*************************此部分為18B20的驅動程序*********/
#include <reg52.H>
#include <intrins.h>
sbit D18B20=P1^7;
#define NOP() _nop_() /* 定義空指令 */
#define _Nop() _nop_() /*定義空指令*/
void TempDelay (unsigned int idata us);
void Init18b20 (void); //18B20初始化復位
void WriteByte (unsigned char idatawr); //單字節寫入函數
void read_bytes (unsigned char idata j); // 讀出一單字節函數
unsigned char CRC (unsigned char j); // CRC 校驗函數
void GemTemp (void);
void Config18b20 (void); //配置18B20函數
void ReadID (void); //讀取器件序列號函數
void TemperatuerResult(void); //讀取溫度函數
bit flag;
unsigned int idata Temperature;
unsigned char idata temp_buff[9]; //存儲讀取的字節,readscratchpad為9字節,readrom ID為8字節
unsigned char idata id_buff[8]; //定義器件ID值變量
unsigned char idata *p,TIM;
unsigned char idata crc_data;
unsigned char code CrcTable [256]={
0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80, 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53}; //CRC校驗查詢表
/************************************************************
*Function:延時處理
*parameter:
*Return:
*Modify:
*************************************************************/
voidTempDelay (unsigned int idata us)
{
while(us--);
}
/************************************************************
*Function:18B20初始化
*parameter:
*Return:
*Modify:
*************************************************************/
voidInit18b20 (void)
{
D18B20=1;
_nop_();
D18B20=0;
TempDelay(530); //delay 530 uS
_nop_();
D18B20=1;
TempDelay(100); //
_nop_();
_nop_();
_nop_();
if(D18B20==0)
flag = 1; //DS18B20響應,初始化完成
else
flag = 0; //DS18B20初始化失敗
TempDelay(200);
_nop_();
_nop_();
D18B20= 1;
}
/************************************************************
*Function:向18B20寫入一個字節
*parameter:
*Return:
*Modify:
*************************************************************/
voidWriteByte (unsigned char idata wr) //單字節寫入
{
unsigned char idata i;
for (i=0;i<8;i++)
{
D18B20 = 0;
_nop_();
D18B20=wr&0x01;
TempDelay(3); //delay 45 uS //5
_nop_();
_nop_();
D18B20=1;
wr >>= 1;
}
}
/************************************************************
*Function:讀18B20的一個字節
*parameter:
*Return:
*Modify:
*************************************************************/
unsignedchar ReadByte (void) //讀取單字節
{
unsigned char idata i,u=0;
for(i=0;i<8;i++)
{
D18B20 = 0;
u >>= 1;
D18B20 = 1;
if(D18B20==1)
u |= 0x80;
TempDelay (2);
_nop_();
}
return(u);
}
/************************************************************
*Function:讀18B20多個字節,讀取j 個字節
*parameter: j
*Return:
*Modify:
*************************************************************/
voidread_bytes (unsigned char idata j)
{
unsigned char idata i;
for(i=0;i<j;i++)
{
*p = ReadByte();
p++;
}
}
/************************************************************
*Function:CRC校驗
*parameter:
*Return:
*Modify:
*************************************************************/
unsignedchar CRC (unsigned char j)
{
unsignedchar idata i,crc_data=0;
for(i=0;i<j;i++) //查表校驗
crc_data= CrcTable[crc_data^temp_buff];
return (crc_data);
}
/************************************************************
*Function:讀取溫度
*parameter:
*Return:
*Modify:
*************************************************************/
voidGemTemp (void)
{
read_bytes (9);
if (CRC(9)==0) //校驗正確
{
Temperature = temp_buff[1]*0x100 + temp_buff[0];
// Temperature *= 0.625;
Temperature /= 16;
TempDelay(1);
}
}
/************************************************************
*Function:內部配置
*parameter:
*Return:
*Modify:
*************************************************************/
voidConfig18b20 (void) //重新配置報警限定值和分辨率
{
Init18b20(); //復位18B20
WriteByte(0xcc); //skiprom 如果總線上只有一個18B20,就可使用此命令,
WriteByte(0x4e); //0x4e 這個指令時接下來向DS18B20寫三個字節數據,分別是:
//寫暫存器第2、3和4字節的數據(即TH,TL和配置寄存器)
WriteByte(0x19); //上限
WriteByte(0x1a); //下限
WriteByte(0x7f); //set 12bit (0.125) 轉換精度
Init18b20();
WriteByte(0xcc); //skiprom
WriteByte(0x48); //保存設定值,將暫存器中的TH,TL和配置字節
//復制到EPPROM中
Init18b20();
WriteByte(0xcc); //skip rom
WriteByte(0xb8); //回調設定值,將TH,TL和配置字節從EPPROM讀回至暫存器中
}
/************************************************************
*Function:讀18B20ID
*parameter:
*Return:
*Modify:
*************************************************************/
voidReadID (void)//讀取器件id
{
Init18b20();
WriteByte(0x33); //read rom 指令
read_bytes(8); //讀取器件ID指令
}
/************************************************************
*Function:讀取18B20溫度值
說明一下:我們再例程里只讀取溫度值,其他功能暫時不演示,其他功能只需要添加就可以
現在我們將其他代碼屏蔽掉,如果需要恢復相應功能即可。
*************************************************************/
voidTemperatuerResult(void)
{
// p = id_buff;
// ReadID();
Config18b20();
Init18b20 ();
WriteByte(0xcc); //skip rom
//WriteByte(0x44); //Temperature convert
TempDelay(7000) ;
Init18b20 ();
WriteByte(0xcc); //skip rom
WriteByte(0xbe); //read Temperature
p = temp_buff;
GemTemp();
}
voidGetTemp() //
{
if(TIM==100) //每隔 1000ms讀取溫度
{ TIM=0;
TemperatuerResult();
}
}
/*************************************
[t1 (10ms)中斷]中斷,初始化函數在TemMain.c文件中
*************************************/
voidT1zd(void) interrupt 3
{
TH1 = 0xD8; //10
TL1 = 0xF0;
TIM++;
}
復制代碼
作者:
sadlucky1996
時間:
2018-6-11 14:44
謝謝樓主啊
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
欧美一级二级在线观看
|
国内精品一区二区三区
|
国产精品欧美一区二区三区不卡
|
国产高潮好爽受不了了夜色
|
亚洲福利一区二区
|
www.精品国产
|
欧美a∨
|
日韩久久久久久
|
亚洲免费精品
|
av男人的天堂av
|
欧美一二三四成人免费视频
|
午夜一区
|
美女天堂
|
波多野吉衣在线播放
|
国产精品免费一区二区
|
在线一区二区三区
|
欧美一区二区小视频
|
久久国产精品一区二区三区
|
精品国产99
|
免费一区在线观看
|
www久久av
|
亚州春色
|
日韩精品一区二区三区中文字幕
|
日批av
|
国产高清精品一区
|
五月天婷婷丁香
|
欧美精品一区二区三区在线
|
亚洲一区二区视频
|
国产成人精品午夜视频免费
|
午夜精品久久久久久久99黑人
|
亚洲日本激情
|
日韩午夜场
|
成人亚洲性情网站www在线观看
|
亚洲精品一区二区在线观看
|
久久视频精品在线
|
久久成人精品视频
|
91视频正在播放
|
久久剧场
|
瑟瑟视频在线看
|
国产成人精品免高潮在线观看
|
欧美成人免费在线视频
|