只需要將stm32的串列埠的tx線和18b20的dq相連線,通過4.7k上拉電阻讓tx線拉到3.3v即可(ps:就不貼圖了)。
/*
*配置串列埠2
*/void ds18b20_init()
只配置了tx管腳,使能單線半雙工模式(usart_halfduplexcmd函式)
/*
*復位18b20,
*返回0:找到裝置,裝置響應。
*返回1:沒有找到裝置,設定無響應
*/int ds18b20_reset()//復位18b20
while (usart_getflagstatus(usart2, usart_flag_rxne) == reset) //等待傳送完成
while(usart_getflagstatus(usart2, usart_flag_rxne) != reset)//等待收到資料,tx和rx內部連線,肯定能收到資料
usart_initstructure.usart_baudrate = 115200;//將波特率改為115200
usart_initstructure.usart_wordlength = usart_wordlength_8b;
usart_initstructure.usart_stopbits = usart_stopbits_1;
usart_initstructure.usart_parity = usart_parity_no;
usart_initstructure.usart_hardwareflowcontrol = usart_hardwareflowcontrol_none;
usart_initstructure.usart_mode = usart_mode_rx | usart_mode_tx;
usart_init(usart2, &usart_initstructure);
if(status == 0xf0)
return
1; else
return
0;}
void ds18b20_writebit(unsigned char bit)
while (usart_getflagstatus(usart2, usart_flag_rxne) == reset) //等待收到資料
usart_receivedata(usart2);
usart_clearflag(usart2,usart_flag_rxne);
}void ds18b20_writebyte(unsigned char
byte)
}
char ds18b20_readbit()//讀取一位資料
while (usart_getflagstatus(usart2, usart_flag_rxne) == reset) //等待傳輸完成
status = usart_receivedata(usart2);
usart_clearflag(usart2,usart_flag_rxne);
if(status == 0xff)
status = 1;
else
status = 0;
return status;
}char ds18b20_readbyte()
return status;
}
void ds18b20_start()
float ds18b20_gettemp()
else
t=1;//溫度為正
tem=th; //獲得高八位
tem<<=8;
tem+=tl;//獲得底八位
temp = (float)tem*0.0625;
if(t)return temp; //返回溫度值
else
return -temp;
}
STM32串列埠實驗
實驗階段1,定時器計時1s觸發中斷,在中斷中往外傳送資料 定時器設定為36000分頻,週期設定為2000,並開啟中斷,配置 如下 tim timebase struct.tim countermode tim countermode up tim timebase struct.tim clockd...
STM32 串列埠DMA(一)
今天調usart,資料在晶元內部用dma傳到串列埠快取,發現dma真的很好,很快,而且不消耗系統資源。只是在傳輸完的時候中斷的標誌置位。下面解釋一下程式。void dma configuration void 再弄幾個重要的語句。這裡是開始dma傳輸前的一些準備工作,將usart1模組設定成dma方...
STM32串列埠 DMA使用1
stm32串列埠 dma使用 stm32有5個串列埠資源 usart1,usart2,usart3及uart4,uart5 其中3個usart 通用同步 非同步收 髮器universalsynchronous asynchronous receiver and transmitter 2個uart ...