欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
DS18b20與單片機連接串口通訊電路及程序
[打印本頁]
作者:
王振龍
時間:
2023-3-26 11:23
標題:
DS18b20與單片機連接串口通訊電路及程序
壓縮包內包含:單片機 Keil uVision5 C程序
proteus電路
如需要CVI程序見本人貼
http://m.raoushi.com/bbs/dpj-227709-1.html
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png
(28.97 KB, 下載次數: 34)
下載附件
2023-3-29 16:34 上傳
單片機源程序如下:
#include <reg51.h>
#include <intrins.h>
#include <stdio.h>
sbit DIO = P1^6;
void delay_5us(unsigned char y) //(2.17*y+5)us延時,11.0592M晶振
{
while(--y);
}
void OneWireWByte(unsigned char x) //向1wire總線寫一個字節,X是要寫的字節
{
unsigned char i;
for(i=0;i<8;i++)
{
DIO=0; //拉低總線
_nop_(); //要求>1us,但又不能超過15us
_nop_();
if(0x01&x)
{
DIO=1; //如果最低位是1,則將總線拉高
}
delay_5us(30); //延時60-120us
DIO=1; //釋放總線
_nop_(); //要求>1us
x=x>>1; //移位,準備發送下一位
}
}
void delay(unsigned int v)
//1ms單位延時(實際是0.998ms)。50是49ms;500是490ms,還算準. 晶振11.0592M
{
unsigned char i;
while(v--)
{
for(i=0;i<111;i++);
}
}
unsigned char OneWireRByte(void) //從1-wire總線讀一個字節.返回讀到的內容
{
unsigned char i,j;
j=0;
for(i=0;i<8;i++)
{
j=j>>1;
DIO=0; //拉低總線
_nop_(); //要求>1us,但又不能超過15us
_nop_();
DIO=1; //釋放總線
_nop_();
_nop_();
if(DIO==1) //如果是高電平
{
j|=0x80;
}
delay_5us(30); //要求總時間在60-120us
DIO=1; //釋放總線
_nop_(); //要求>1us
}
return j;
}
void DS18b20_int(void) //每次上電都給18b20初始化,設置18b20的參數.
{
DIO=0;
delay_5us(255); //要求480-960us
DIO=1; //釋放總線
delay_5us(30); //要求60-120us
if(DIO==0)
{
delay_5us(200); //要求釋放總線后480us內結束復位
DIO=1; //釋放總線
OneWireWByte(0xcc); //發送Skip ROM命令
OneWireWByte(0x4e); //發送"寫"暫存RAM命令
OneWireWByte(0x00); //溫度報警上限設為0
OneWireWByte(0x00); //溫度報警下限設為0
OneWireWByte(0x7f); //將18b20設為12位,精度就是0.25度
DIO=0;
delay_5us(255); //要求480-960us
DIO=1; //釋放總線
delay_5us(240); //要求釋放總線后480us內結束復位
DIO=1; //釋放總線
}
}
unsigned int DS18b20_readTemp(void) //讀18b20溫度值
{
unsigned int temp;
unsigned char DS18b20_temp[2]; //溫度數據
DIO=0;
delay_5us(255); //要求480-960us
DIO=1; //釋放總線
delay_5us(30); //要求60-120us
if(DIO==0)
{
delay_5us(200); //要求釋放總線后480us內結束復位
DIO=1; //釋放總線
OneWireWByte(0xcc); //發送Skip ROM命令
OneWireWByte(0x44); //發送溫度轉換命令
DIO=1; //釋放總線
delay(1000); //1000ms
DIO=0;
delay_5us(255); //要求480-960us
DIO=1; //釋放總線
delay_5us(30); //要求60-120us
if(DIO==0)
{
delay_5us(200); //要求釋放總線后480us內結束復位
DIO=1; //釋放總線
OneWireWByte(0xcc); //發送Skip ROM命令
OneWireWByte(0xbe); //發送"讀"暫存RAM命令
DS18b20_temp[0]=OneWireRByte(); //讀溫度低字節
DS18b20_temp[1]=OneWireRByte(); //讀溫度高字節
temp = 256 * DS18b20_temp[1] + DS18b20_temp[0];
DIO=0;
delay_5us(255); //要求480-960us
DIO=1; //釋放總線
delay_5us(240); //要求釋放總線后480us內結束復位
DIO=1; //釋放總線
}
}
return temp;
}
void DelayMS(unsigned int ms)
{
unsigned char i;
while(ms--)
{
for(i=0;i<120;i++);
}
}
void InitUART(void)
{
TMOD = 0x20; //9600bps
SCON = 0x50;
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TI = 1;
TR1 = 1;
}
int main(void)
{
int temp;
InitUART();
DS18b20_int(); //初始化18B20
while(1)
{
temp = DS18b20_readTemp(); //讀溫度數據
// putchar(temp/0xff); //然后將溫度數據通過串口發送
// putchar(temp%0xff);
if(temp>=0){
printf("+%4.2f",temp*0.5/8);}
else{
printf("%4.2f",temp*0.5/8);}
DelayMS(100);
}
}
復制代碼
Keil代碼與Proteus仿真下載:
單片機程序.7z
(56.65 KB, 下載次數: 27)
2023-3-29 16:35 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1