1. 程式人生 > >微控制器利用串列埠通訊傳送溫度

微控制器利用串列埠通訊傳送溫度

/********該程式主要是利用DS18B20採集溫度,然後通過數碼管顯示溫度*************/
/*當程式收到上位機發送的命令之後,該程式會將當時的溫度值通過串列埠傳送給上位機*/
#include<reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P1^0;//定義DS18B20的訊號線埠
uchari,j;
uchardis_buffer[4];//定義資料緩衝陣列
ucharbit_ser[]={0xfe,0xfd,0xfb,0xf7};//定義數碼管片選陣列
ucharseven_seg[]={0xc0,0xf9,0xa4,0xb0
,0x99,0x92,0x82,0xf8,0x80,0x90};
//定義數碼管段選陣列
/****************************延時函式*********************************/
voiddelay(uintx)
{
while(x)
x--;
}
/*************************DS18B20初始化函式***************************/
voidInit_DS18B20(void)
{
unsignedcharx=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中讀一個位元組************************/
ucharReadOneChar(void)
{
uchari=0;
uchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//給脈衝訊號
dat>>=1;
DQ=1;//給脈衝訊號
if(DQ)
dat|=0x80;
delay(8);
}
return(dat);
}
/***************************向18B20中寫一個位元組************************/
Write_OneChar(uchardat)
{
uchari=0;
for(i=8;i>0;i--)
{
DQ=0;//給脈衝訊號
DQ=dat&0x01;
delay(5);
DQ=1;//給脈衝訊號
dat>>=1;
}
delay(4);
}
/**************************從18B20中讀取一個位元組***********************/
intRead_Temperature(void)
{
uchari=0,t=0,a,b;
inttemp;
Init_DS18B20();
Write_OneChar(0xcc);//跳過讀序號列號的操作
Write_OneChar(0x44);//啟動溫度轉換
Init_DS18B20();
Write_OneChar(0xcc);//跳過讀序號列號的操作
Write_OneChar(0xbe);//讀取溫度暫存器等(共可讀9個暫存器)前兩個就是溫度
i=ReadOneChar();//讀取溫度值低位
t=ReadOneChar();//讀取溫度值高位
a=i&0x0f;
b=t;
i=i>>4;//低位右移4位,捨棄小數部分
t=t<<4;//高位左移4位,捨棄符號位
t=t|i;
temp=(t+a*0.0625)*100;//得到一個比實際溫度擴到100倍的值,主要是為了更好的顯示和傳輸
return(temp);//返回溫度值
}
/***************************初始化定時器0******************************/
voidtimer0_init(void)//
{
TMOD=0x21;//由於串列埠通訊需要使用定時器1,因此TMOD的值是0x21
TL0=(65536-5000)%256;
TH0=(65536-5000)/256;
EA=1;
ET0=1;
TR0=1;
}
/*************************傳送資料的函式********************************/
voidtxd_data(charsend_data)
{
SBUF=send_data;//將需要傳送的資料放入傳送緩衝區
while(!TI);//等待發送資料
TI=0;
}
/********************T0中斷處理函式,主要用於顯示當前溫度***************/
voidtimer0_isr(void)interrupt1
{
inttemp;
TR0=0;
TL0=(65536-5000)%256;
TH0=(65536-5000)/256;
TR0=1;
switch(i)
{
case0:
P2=bit_ser[0];
P0=seven_seg[dis_buffer[0]];
break;
case1:
P2=bit_ser[1];
P0=seven_seg[dis_buffer[1]]&0x7f;
break;
case2:
P2=bit_ser[2];
P0=seven_seg[dis_buffer[2]];
break;
case3:
P2=bit_ser[3];
P0=seven_seg[dis_buffer[3]];
break;
}
i++;
if(i>=4)
{
i=0;
j++;
if(j>=10)//如果到200ms就會讀取一次溫度,並將溫度值放入顯示緩衝區
{
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;
}
}
}
/***************************串列埠通訊初始化函式***************************/
voiduart_init(void)
{
SCON=0x50;//方式1,充許接收
TMOD=0x21;//T1方式2定時,T0方式是1
TH1=0xFd;//波特率9600,Fosc=11.0592MHz
TL1=0xFd;
TR1=1;
ES=1;//開啟串列埠中斷
}
/**************************串列埠中斷處理函式*****************************/
voiduart()interrupt4
{
chary,i;
while(!RI);
y=SBUF;//讀取接收的資訊,然後判斷是否為傳送溫度命令
if(y=='0')//如果為傳送命令,就將當前資料緩衝陣列內的資料傳送給上位機
{
for(i=0;i<=3;i++)
{
txd_data(dis_buffer[i]+48);
}
}
RI=0;
}
/*******************************主函式*********************************/
voidmain()
{
timer0_init();//呼叫T0初始化函式
uart_init();//呼叫串列埠初始化函式
while(1)
{}
}

相關推薦

微控制器利用串列通訊傳送溫度

/********該程式主要是利用DS18B20採集溫度,然後通過數碼管顯示溫度*************/ /*當程式收到上位機發送的命令之後,該程式會將當時的溫度值通過串列埠傳送給上位機*/ #i

51微控制器串列通訊(一)

串列埠通訊好東西,但我沒用過。 下面照著普中科技的ppt搬運下。        隨著多微機系統的廣泛應用和計算機網路技術的普及,計算機的通訊功能愈來愈顯得重要。計算機通訊是指計算機與外部裝置或計算機與計算機之間的資訊交換。 通訊方式 有並行

51微控制器學習——串列通訊

51微控制器的UART串列埠的結構由序列口控制暫存器SCON、傳送和接收電路三部分構成。 SCON位分配 位 7 6 5 4 3 2 1 0 符號

51微控制器串列通訊(一)

一.基礎知識 1.序列通訊和並行通訊:目前用的比較多的是序列通訊。序列通訊優點是連線簡單,傳輸距離遠;缺點是傳輸速度慢。 2.序列通訊:分為同步通訊和非同步通訊;非同步通訊是指傳送和接收裝置利用各自

51微控制器串列通訊

一、程式下載的不同方式 1、程式傳送和電平介面: 由於兩個電平無法通訊,所以需要轉換電平 1、轉換電平可以裝驅動(CH340) 2、可以使用轉電平晶片 一般採用第一種方式 二、通訊方式 (一)、並行通訊 (二)、序列通訊 三、序列通訊傳輸方向 四、序列通訊的分

微控制器串列如何傳送超過8位的資料

原文中有點小錯誤,做了小更改。 在做下位機通訊時往往會用到串列埠,包括下位機將資料傳輸給上位機,或者是下位機與下位機之間進行資料傳輸,這時候就會遇到傳送資料的問題,微控制器通過串列埠傳送資料時往往是一次一個位元組(8位),如果傳輸char(8位)型資料則很好辦,只需要直

STM32微控制器串列通訊波特率應該這樣計算~

1什麼是波特率不管是什麼微控制器,在使用串列埠通訊的時候,有一個非常重要的引數:波特率。什麼是波

51 微控制器UART 串列通訊[ 方式1 ]實現

1  51序列口結構 51微控制器的UART序列通訊是基於其序列口的可程式設計硬體結構,只要用正確的程式程式碼通過初始化序列口對應暫存器的形式將其序列硬體結構初始化,再編寫符合此序列口通訊的程式程式碼

PIC微控制器-RS232串列通訊

編寫程式實現以下功能。在計算機上使用串列埠大師向開發板發每次傳送1個字元。開發板每接收到一個數據,則交換該資料的高低4位,再發送回計算機。 埠初始化時使能傳送與接收,使用掃描方式接收資料,接收到資料後立即交換高低四位併發送,交換高低四位方式如下: i = ((RCREG

STC12C5A60S2微控制器-雙串列通訊

STC12C5A60S2微控制器是一款功能比較強大的微控制器,它擁有兩個全雙工序列通訊介面,串列埠1的功能及操作與傳統51微控制器序列口相同;特殊的是STC12C5A60S2微控制器內部有一個獨立波特率發生器,串列埠1可以使用定時器1作為波特率發生器,也可以使用獨立波特率發

51微控制器串列通訊傳送與接收

51微控制器的串列埠,是個全雙工的串列埠,傳送資料的同時,還可以接收資料。 當序列傳送完畢後,將在標誌位 TI 置 1,同樣,當收到了資料後,也會在 RI 置 1。 無論 RI 或 TI 出現了 1,只要串列埠中斷處於開放狀態,微控制器都會進入串列埠中斷處理程式。 在中斷

51微控制器串列通訊(電腦傳送數字到微控制器數碼管顯示)

#include<reg51.h> #include<intrins.h> //--定義使用的IO--// #define GPIO_DIG P0 sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; typ

FPGA-14-串列通訊的原理和傳送模組

瞭解串列埠通訊首先要了解串列埠通訊的原理: 串列埠通訊的概念非常簡單,串列埠按位(bit)傳送和接收位元組。儘管比按位元組(byte)的並行通訊慢,但是串列埠可以在使用一根線傳送資料的同時用另一根線接收資料。它很簡單並且能夠實現遠距離通訊。比如IEEE488定義並行通行狀態時,規定裝置線總長不得

STM32串列通訊中使用printf傳送資料配置方法(開發環境 Keil RVMDK)

出處:STM32串列埠通訊中使用printf傳送資料配置方法(開發環境 Keil RVMDK) http://home.eeworld.com.cn/my/space-uid-338727-blogid-47176.html 在STM32串列埠通訊程式中使用printf傳送資料,非常的方便。

利用WinAPI進行串列通訊程式設計

轉載於:https://blog.csdn.net/L_Andy/article/details/51131232 轉載只為了方便查詢,希望大家從源連線進行檢視! 總結來看串列埠通訊原理,(也可以說大多數通訊原理也是如此)。 通訊首先要有個通訊,可以簡單的把通訊看成一個

教你如何在51微控制器上模擬串列通訊!!!

我們可以不使用微控制器本身帶有的串列埠,而自己用程式去模擬一個串列埠並達到和本身的串列埠具有同樣的功能, 首先,我們需要用到CH340串列埠模組,大家可以上某寶自行購買。 正面: 反面:   然後我們需要了解一下這串列埠模組上的引腳: 5V  :與VCC短路為5V TL

樹莓派ASCII指令串列通訊(十六進位制傳送

對於指令文字 ENQ STX 08 PS 0500 F0 ETX的ASCII傳送 首先按照我上一篇部落格開啟串列埠 >>ser.write("\x05\x02\x30\x38\x50\x53\x20\x20\x30\x35\x30\x30\x46\x30\x0

FPGA-串列通訊的接收模組(傳送接收模組)

接收模組和傳送模組類似:        在接收的過程中為了保證接收資料的準確性對單個時鐘波特率進行分頻,單個時鐘訊號下分頻16次,進行資料採集保證了資料的準確性,這裡的程式碼思想借鑑了小梅哥的程式碼的編寫思想。 傳送接收模組的驗證:  

QT筆記(8)——Qt與51微控制器串列通訊

工業控制中微控制器與pc機通訊,常常通過串列埠通訊來完成,本次基於RS232通訊來完成的,硬體是普中的STC51微控制器開發板;板子如下圖: 不需要液晶顯示器,自帶的例子這裡就不貼了,主要實驗是Qt進行串列埠連結,傳送資料,微控制器判斷髮送的內容並做出反饋; 微控制器

vc利用串列傳送檔案

示例下載地址:http://download.csdn.net/detail/qq_23992597/9556236 自己寫的一個示例程式,功能有: 1:串列埠功能:開啟關閉串列埠; 2:選擇檔案功能; 3:傳送檔案功能; 4:取消傳送功能; 5:取餘計算功能; 6:視窗置