/********該程序主要是利用DS18B20采集溫度,然后通過數(shù)碼管顯示溫度*************/
/*當程序收到上位機發(fā)送的命令之后,該程序會將當時的溫度值通過串口發(fā)送給上位機*/
#include
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P1^0; //定義DS18B20的信號線端口
uchar i,j;
uchar dis_buffer[4];//定義數(shù)據(jù)緩沖數(shù)組
uchar bit_ser[]={0xfe,0xfd,0xfb,0xf7}; //定義數(shù)碼管片選數(shù)組
uchar seven_seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//定義數(shù)碼管段選數(shù)組
/****************************延時函數(shù)*********************************/
void delay(uint x)
{
while(x)
x--;
}
/*************************DS18B20初始化函數(shù)***************************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ復位
delay(8); //稍做延時
DQ = 0; //單片機將DQ拉低
delay(80); //精確延時 大于 480us
DQ = 1; //拉高總線
delay(14);
x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
delay(20);
}
/***************************從18B20中讀一個字節(jié)************************/
uchar ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號
dat>>=1;
DQ = 1; // 給脈沖信號
if(DQ)
dat|=0x80;
delay(8);
}
return(dat);
}
/***************************向18B20中寫一個字節(jié)************************/
Write_OneChar(uchar dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ = 0; //給脈沖信號
DQ = dat & 0x01;
delay(5);
DQ = 1; //給脈沖信號
dat >>= 1;
}
delay(4);
}
/**************************從18B20中讀取一個字節(jié)***********************/
int Read_Temperature(void)
{
uchar i = 0,t = 0,a,b;
int temp;
Init_DS18B20();
Write_OneChar(0xcc); // 跳過讀序號列號的操作
Write_OneChar(0x44); // 啟動溫度轉(zhuǎn)換
Init_DS18B20();
Write_OneChar(0xcc); //跳過讀序號列號的操作
Write_OneChar(0xbe); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
i = ReadOneChar(); //讀取溫度值低位
t = ReadOneChar(); //讀取溫度值高位
a = i & 0x0f;
b = t;
i = i >> 4; //低位右移4位,舍棄小數(shù)部分
t = t << 4; //高位左移4位,舍棄符號位
t = t | i;
temp = (t + a * 0.0625) * 100; //得到一個比實際溫度擴到100倍的值,主要是為了更好的顯示和傳輸
return(temp); //返回溫度值
}
/***************************初始化定時器0******************************/
void timer0_init(void) //
{
TMOD = 0x21; //由于串口通信需要使用定時器1,因此TMOD的值是0x21
TL0 = (65536-5000) % 256;
TH0 = (65536-5000) / 256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
/*************************發(fā)送數(shù)據(jù)的函數(shù)********************************/
void txd_data(char send_data)
{
SBUF = send_data; //將需要發(fā)送的數(shù)據(jù)放入發(fā)送緩沖區(qū)
while(!TI); //等待發(fā)送數(shù)據(jù)
TI = 0;
}
/********************T0中斷處理函數(shù),主要用于顯示當前溫度***************/
void timer0_isr(void) interrupt 1
{
int temp;
TR0 = 0;
TL0 = (65536-5000) % 256;
TH0 = (65536-5000) / 256;
TR0 = 1;
switch(i)
{
case 0:
P2 = bit_ser[0];
P0 = seven_seg[dis_buffer[0]];
break;
case 1:
P2 = bit_ser[1];
P0 =seven_seg[dis_buffer[1]] & 0x7f;
break;
case 2:
P2 = bit_ser[2];
P0 =seven_seg[dis_buffer[2]];
break;
case 3:
P2 = bit_ser[3];
P0 =seven_seg[dis_buffer[3]];
break;
}
i++;
if(i >= 4)
{
i = 0;
j++;
if(j >= 10) //如果到200ms就會讀取一次溫度,并將溫度值放入顯示緩沖區(qū)
{
j = 0;
temp = Read_Temperature();
dis_buffer[0] = temp / 1000;
dis_buffer[1] = temp % 1000 / 100;
dis_buffer[2] = temp % 100 / 10;
dis_buffer[3] = temp % 10;
}
}
}
/***************************串口通信初始化函數(shù)***************************/
void uart_init(void)
{
SCON = 0x50; //方式1,充許接收
TMOD = 0x21; //T1方式2定時,T0方式是1
TH1 = 0xFd; //波特率9600,Fosc=11.0592MHz
TL1 = 0xFd;
TR1 = 1;
ES = 1; // 打開串口中斷
}
/**************************串口中斷處理函數(shù)*****************************/
void uart() interrupt 4
{
char y,i;
while(!RI);
y = SBUF; //讀取接收的信息,然后判斷是否為發(fā)送溫度命令
if(y == '0') //如果為發(fā)送命令,就將當前數(shù)據(jù)緩沖數(shù)組內(nèi)的數(shù)據(jù)發(fā)送給上位機
{
for(i = 0;i <= 3;i++)
{
txd_data(dis_buffer[i] + 48);
}
}
RI = 0;
}
/*******************************主函數(shù)*********************************/
void main()
{
timer0_init(); //調(diào)用T0初始化函數(shù)
uart_init(); //調(diào)用串口初始化函數(shù)
while(1)
{}
}
上一篇:單片機實時溫度采集并通過串口通信上傳電腦顯示
下一篇:DS18B20溫度傳感器+12864液晶串口顯示
推薦閱讀
史海拾趣
設計資源 培訓 開發(fā)板 精華推薦
- Microchip 升級數(shù)字信號控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領先的新器件
- 意法半導體STM32MP23x:突破成本限制的工業(yè)AI應用核心
- 意法半導體推出用于匹配遠距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設置字重-ESP32篇
- 使用樹莓派進行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- 480Wh/kg!湖南久森半固態(tài)金屬鋰負極電池即將量產(chǎn)
- 中國首條硫化物固體電解質(zhì)量產(chǎn)線正式落地
- QUT開發(fā)出新的LENS系統(tǒng) 可以讓機器人進行類似大腦的導航
- 毫米波雷達裝機量分析:毫米波雷達裝車量持續(xù)攀升,大陸和博世占據(jù)60%以上市場份額
- TDK推出適用于車載濾波器的同軸電纜供電電感器
- 大摩給“人形機器人100”清單注入新思路
- 行家預判:2025年車載Mini LED反超OLED
- 2025數(shù)智未來峰會:深度解讀AI賦能工業(yè)的趨勢與實踐
- 工業(yè)自動化中的Raspberry Pi:簡化經(jīng)濟實惠的邊緣計算
- 意法半導體宣布擴大在新加坡的“Lab-in-Fab”廠內(nèi)實驗室合作項目
- 再增加投資 1.53 億英鎊,英國量子技術商業(yè)化要來了?
- 建設智慧城市有哪些個問題?該如何解決?
- 藍牙設備出貨量有望再創(chuàng)新高,各大公司動作不斷
- 全球最大代工廠富士康創(chuàng)始人郭臺銘退位由商入仕
- 產(chǎn)能過剩或?qū)е氯騆ED芯片供應出現(xiàn)疲軟?
- Uber公布外賣無人機最新外觀設計,將于2020年試送外賣
- Akamai被評為零信任eXtended生態(tài)系統(tǒng)平臺提供商的領導者
- 尼得科聯(lián)手中國廣汽成立新能源汽車驅(qū)動馬達合資公司
- 歐司朗紅外LED讓虛擬現(xiàn)實與增強現(xiàn)實應用更具“真實感”
- 英特爾亮出云網(wǎng)融合與創(chuàng)新應用殺手锏,推動5G應用創(chuàng)新落地