欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
數碼管顯示溫度并控制電機正反轉程序
[打印本頁]
作者:
dai16508878
時間:
2016-6-2 11:28
標題:
數碼管顯示溫度并控制電機正反轉程序
介紹:DS18B20模塊程序文件,調用時請根據你所接的IO口不同修改dq的值
使用說明:調用時,只用調用ds18b20_read_temperature(uint16 *t)函數,返回值為所得溫度的10倍,
假設溫度16.1度,返回和值為161
作者:方正電子工作室
時間:20170323
*****************************************************************/
#include<reg52.h>
#include<intrins.h>
#include"common.h"
sbit dq = P3^0;
void delay(uint8 x)
{
while(x--);
}
/************************DS18b20初始化程序**********************
輸出參數:1 表示沒有檢測到DS18B20
0 表示檢測到DS18B20
****************************************************************/
bit ds18b20_init()
{
bit flag;
dq = 1;
delay(1);
dq = 0; //將總線拉低產生低電平復位脈沖并延時最小480us
delay(80);
dq = 1; //釋放總線
delay(7);
if(dq == 1) //DS18B20檢測上升脈動沖等待15-60us,將總線拉為電平,表明初始化成功,否則失敗,并持續60-240us
flag = 1;
else
flag = 0;
dq = 1; //將總線拉高
delay(20);
return flag; //返回初始化結果
}
/************************DS18b20讀一字節數據**********************
輸出參數:返回讀到的一個字節的數據
*****************************************************************/
void ds18b20_read_byte(uint8 *dat)
{
uint8 i;
dq = 1;
_nop_();
for(i=0;i<8;i++)
{
dq = 0; //起始信號
*dat >>= 1; //數據從高位讀取,保存讀到的數據
dq = 1; //總線釋放
_nop_();
_nop_();
if(dq == 1) //讀總線上數據,如果是1,將最高位置為1
*dat |= 0x80;
delay(8); //延時45us以上
dq = 1;
}
}
/************************DS18b20寫一字節數據**********************
輸入參數:需要寫入的一個字節數據
*****************************************************************/
void ds18b20_write_byte(uint8 dat)
{
uint8 i;
for(i=0;i<8;i++)
{
dq = 0; //起始信號
_nop_(); //延時2us
_nop_();
dq = dat & 0x01; //將低位數據放入總線
delay(10);
dq = 1;
dat >>= 1;
}
}
/************************DS18b20讀溫度**********************
輸出參數:讀取的溫度值
***********************************************************/
void ds18b20_read_temperature(uint16 *t)
{
uint8 TL,TH;
bit flag = 0;
if(ds18b20_init() == 1)
*t = 0x00;
else
{
ds18b20_write_byte(0xcc); //跳過ROM檢測
ds18b20_write_byte(0x44); //溫度轉換
ds18b20_init();
ds18b20_write_byte(0xcc); //跳過ROM檢測
ds18b20_write_byte(0xbe); //讀取溫度命令
ds18b20_read_byte(&TL);
ds18b20_read_byte(&TH);
if((TH & 0xf8) == 0xf8) //如果是負溫度
{
TH = ~TH;
TL = ~TL + 1;
if(TL == 0x00)
TH = TH + 1;
flag = 1;
}
*t = (uint16)(((TH & 0x07)<<4) | ((TL & 0xf0 )>>4)); //整數部分
*t = *t * 10 + (uint16)((TL & 0x0f)*10/16); //整數部分乘以10加上小數部分返回的數據為得到的溫度的10倍,一位小數
if(flag == 1)
*t = *t + 10000; //如果溫度大于10000表示為負溫度
}
}
作者:
Dailymaycry
時間:
2018-6-25 13:22
厲害了
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1