導航:首頁 > 操作系統 > 51單片機串口教程

51單片機串口教程

發布時間:2022-11-22 08:11:31

⑴ 51單片機串口通信的過程

單片機要用串口通信,用中斷是最好不過的了,因為單片機的內部運行速度非常快(相對串口來說的),發送後需要等好久,這段時間你可以安排它做別的事,當然你可以不用中斷,那就是由軟體來模擬串口進行,但這樣程序設計就更麻煩,單片機也不能做別的事了!

⑵ 51單片機與PC機之間的硬體如何串口連接

  1. 單片機和微機通信的電氣標准要一致,微機串口一般是RS232電氣標准,所以要加電平轉換晶元,大多用MAX232,一般單片機實驗板上都提供這樣的標准串口。

  2. 要分別編寫上位機和下位機軟體程序,單片機程序參照常式、教科書進行編寫;上位機微機可採用VB,組態軟體,Labview等軟體編寫,一般若是簡單的通信,上位機程序編寫很簡單,例如VB中學會使用mscomm控制項,有VB最基礎知識的一天就能學會。

  3. 大可以沒有單片機,沒有MAX232,沒有串列介面這些硬體就可以實現學習並掌握單片機與微機之間的串口通信。proteus可以模擬單片機,也是主流軟體。

  4. 如今的筆記本電腦幾乎都沒有保留串口,而用USB介面取而代之,不過沒關系,有了虛擬串口和串口調試助手,這些都解決了。你可以搜索一下虛擬串口,真的很不錯的。

⑶ 51單片機與PC串口通信程序,求指導 ! 具體要求如下:

功能如下:
1、程序燒進去,串口接收顯示一個菜單!《如圖》A、B、……分別代表一定的功能
例如:A項,代表修改ds1302的時間的數組
2、按照菜單的提示,如:發送A就進入了修改ds1302的時間函數,串口接收界面顯
示 A,像圖片那種,並顯示修改ds1302的操作方法,如從串口發送界面發送
0162115347就表示10年10月16日21時15分34秒星期7,
3、正如第二所說,馬上輸入1010162115347,就成功的修改了ds1302相關數據,
並返回change success!到串口界面!
4、設置一個功能就是返回主菜單界面。然後又可以就行第二、三步的操作!
5、通過串口,讀取單片機裡面相關的數據,如時鍾的數據
6、說明:可以不要ds1320相關的程序,可以用發光二極體亮來代表修改功能!

⑷ 51單片機串口的原理和過程

單片機C51串口中斷接收和發送測試常式(含通信協議的實現)

通信協議:第1位元組,MSB為1,為第1位元組標志,第2位元組,MSB為0,為非第一位元組標志,其餘類推……,最後一個位元組為前幾個位元組後7位的異或校驗和。

測試方法:可以將串口調試助手的發送框寫上 95 10 20 25,並選上16進制發送,接收框選上16進制顯示,如果每發送一次就接收到95 10 20 25,說明測試成功。

//這是一個單片機C51串口接收(中斷)和發送常式,可以用來測試51單片機的中斷接收
//和查詢發送,另外我覺得發送沒有必要用中斷,因為程序的開銷是一樣的
//程序編寫: 龔建偉 [email protected]
//技術主頁:http://www.gjwtech.com
//您有這方面的問題可以和我討論

#include <reg51.h>
#include <string.h>

#define INBUF_LEN 4 //數據長度

unsigned char inbuf1[INBUF_LEN];
unsigned char checksum,count3;
bit read_flag=0;

void init_serialcomm(void)
{
SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80; //SMOD=1;
TH1 = 0xF4; //Baud:4800 fosc=11.0592MHz
IE |= 0x90; //Enable Serial Interrupt
TR1 = 1; // timer 1 run
// TI=1;
}

//向串口發送一個字元
void send_char_com(unsigned char ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}

//向串口發送一個字元串,strlen為該字元串長度
void send_string_com(unsigned char *str,unsigned int strlen)
{
unsigned int k=0;
do
{
send_char_com(*(str + k));
k++;
} while(k < strlen);
}

//串口接收中斷函數
void serial () interrupt 4 using 3
{
if(RI)
{
unsigned char ch;
RI = 0;
ch=SBUF;
if(ch>127)
{
count3=0;
inbuf1[count3]=ch;
checksum= ch-128;
}
else
{
count3++;
inbuf1[count3]=ch;
checksum ^= ch;
if( (count3==(INBUF_LEN-1)) && (!checksum) )
{
read_flag=1; //如果串口接收的數據達到INBUF_LEN個,且校驗沒錯,
//就置位取數標志
}
}
}
}

main()
{
init_serialcomm(); //初始化串口
while(1)
{
if(read_flag) //如果取數標志已置位,就將讀到的數從串口發出
{
read_flag=0; //取數標志清0
send_string_com(inbuf1,INBUF_LEN);
}
}

}

⑸ 51單片機在什麼情況下會產生串口中斷

首先,你要用軟體允許中斷,即
C語言中
EA = 1; //允許總中斷
ES = 1; //允許串口中斷
匯編中可用
SETB EA ;允許總中斷
SETB ES ;允許串口中斷

當單片機接收到一幀數據後,RI會置1,向CPU申請中斷,若之前有中斷允許,則產生了中斷,進入中斷服務程序。當然,單片機發送完一幀數據,TI也會置1,同樣會產生中斷!

一般我們在發送數據時要關中斷,因為一般你不用在發送時不用處理數據;接收數據時要開中斷,以便你在中斷服務程序中將接收到的數據進行存儲並處理。

補充:其實,不管你有沒有允許中斷,上位機(此時即給單片機發送信息的機器)只要給單片機發送數據,單片機就會自動接收數據,並把它放在數據緩沖器SBUF中,如果你之前有允許串列口中斷,RI就會置1,向單片機CPU申請中斷,並進入中斷服務程序,即你問題中的serial()函數,做完這個函數後就會自動返回斷點。如果你沒有允許中斷,便不會產生串列中斷。

其實,你的問題有個錯誤:別的中斷都是某個I/O口電平變化產生。這只是外部中斷產生條件,不過,你之前也需要用軟體允許外部中斷。另外,常見的51系列單片機有5個中斷源三種中斷5:1、外部中斷0和1;2、定時器/計數器溢出中斷0和1;3、串列口中斷。另外,STC51系列還有定時器/計數器T2中斷,A/D轉換中斷,PWM中斷,串列中斷2等等。你還有什麼不懂的可以自己多翻一翻書,學到後面去了你就明白了。

你的問題中那個serial()函數中 P1=SBUF; 是把接收的數據送到並行P1口,然後那條 RI=0;是不可少的,這是用軟體清零RI,准備再次接受一幀數據產生中斷,如果你沒有這條語句,就會進入死循環,出不來了。

有什麼問題還可以Q我(1445090023),希望能給我評個最佳答案。

⑹ 51單片機串口初始化步驟,首先初始化那個在初始化那個,最好是華為等大公司的初始化模版

首先確定定時器1為自動重裝模式,並根據想要得到的波特率設置TH1和TL1的初值。
再確定串口的工作方式。一般發送使用查詢,接收使用中斷功能發送。當然如果開啟了串口的中斷功能,還得開啟總中斷功能。下面是一個11.0592MHz晶振下的例子:
#include "reg51.h"
void initUart(void)
{
TMOD|=0x20;// 初始化定時器1為8位自動重裝模式
SCON=0x50;// 配置串口工作模式,使能了串口接收中斷
TH1=0xfd;// 配置波特率
TL1=0xfd;
TR1=1;// 啟動定時器1
ES=1;// 打開串口中斷允許
}
void uart(void) interrupt 4
{
if(RI)//可以在這里添加接收中斷的語句
{
RI=0;
}
else
TI=0;
}
void main(void)
{
initUart();
EA=1;
while(1){;}
}

⑺ 普中 51單片機 串口通訊

你的程序不對。查詢和中斷法只可用其一。你的程序運行的結果是:收到數據,中斷搶在主程序之前響應,但你沒寫中斷程序。這樣程序就會跑飛。 正確的做法是:查詢法就把ES中斷關掉,別讓中斷響應。中斷法就是主程序什麼也別做,把工作放到中斷程序中。

⑻ 51單片機與計算機串口通信無法讀出數據

答:
1 判斷你的硬體有沒有問題;方法是 用跳線講串口的pin2 和pin3短接,用串口調試助手發送數據看調試助手能不 能自己收到,能就說明是單片機程序有問題
2 你檢查你的波特率是生成程序是否正確, 中斷和主程序用 1樓給你程序,我看了 沒問題。
這樣就可以實現串口通信了

⑼ 51單片機 串口

假設你對單片機的串口已進行了正確的配置(像什麼波特率啊,中斷程序啊,終端使能啊等等),那麼這種現象可能有以下幾種情況(但是不一定全啦):
(1)你的單片機程序的串口中斷程序有問題,是否及時清除了標志位?
(2)還是你單片機程序的問題,可以藉助於模擬器通過設斷點的方式來追蹤程序的執行情況。
(3)你的上位機程序的問題,這種情況可以用另一個單片機向其發送數據來測試。
(4)上位機發送數據的每兩個位元組之間的時間間隔是否太短,因為51畢竟很慢嘛
關於如何讓單片機能正常接收,我就不列出代碼了,因為可以參考的實在太多了,基本上是這樣一個思路:
(1)初始化串口,只要是波特率、數據長度、校驗位等的配置
(2)使能接收中斷
(3)中斷服務程序響應接收中斷,切記中斷程序中要清除中斷標志位,否則第二個位元組就接收不到了;並且程序的佔用時間不能太長,否則有可能會漏掉部分數據。

閱讀全文

與51單片機串口教程相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:757
蘋果郵件無法連接伺服器地址 瀏覽:962
phpffmpeg轉碼 瀏覽:671
長沙好玩的解壓項目 瀏覽:144
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:737
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:484
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:381
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:349
風翼app為什麼進不去了 瀏覽:778
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:150
伊克塞爾文檔怎麼進行加密 瀏覽:892
app轉賬是什麼 瀏覽:163