導航:首頁 > 操作系統 > 單片機接收發送過程

單片機接收發送過程

發布時間:2024-04-08 20:57:12

1. 單片機如何接收並使用電腦發送來的數據

你可以在你的電腦和單品機通信的時候,自己定義一個通信協議——也就是定義一種通信格式:以什麼字元作為一個數據包的開始如(0x66 0xab)代表數據幀的開頭,之後的一個自己單表數據幀的總長度(如果所有的數據包是定長的可以不需要該欄位),之後一個自己定義為命令的類型(如:0x01 表示電動機的轉動方向;0x02 代表轉動圈數等),之後跟上實際要發送給單品機的數據,如正傳還是反轉,轉動的圈數是多少等。如果不放心你可以在最後加上數據幀的校驗和,用來保證數據再傳輸過程中沒有出錯。

2. 51單片機怎麼接收電腦發送的16位數據

51單片機是8位的,一次只能接一個位元組,你這16位的,要分兩次的。

電腦串口也是按兩次來發送,也就是把這個16位的拆成兩個位元組,所以每個位元組發送都是遵循串口協議的,你在單片機裡面開串口接收中斷即可。

你可能會疑問,要是第一個位元組中斷了,進入中斷函數接第一個位元組後,那第二個位元組會不會錯過,來不及接收?

這個不會的,上面說了,第二個位元組也是按串口標准發的,也就是起始位,數據位,(校驗位),結束位。

電腦在發一個位元組後,又會接著發第二個位元組。可是,要知道串口的波特率是很低的,遠遠比單片機的處理速度低。當你接了第一個位元組,將此位元組做一些處理,比如存起來時,電腦可能都還沒開始發第二個位元組呢,因為電腦發數據的速率是以K為單位的,而單片機處理速度是以M為單位的。

因此,不用擔心第二個位元組會丟失。

3. 51單片機通過串口實現數據的發送與接收程序

串口收發,要有通信協議。也就是什麼時候開始接收,接收到指令後,轉發什麼數據。這個要知道,才可以寫。而且使用不同的51單片機,其內部寄存器配置是不同的。
一般來說,過程如下:
1,配置串口參數、波特率等,開啟串口中斷;
void Init_UART()
{

}
2,中斷函數里寫中斷響應函數,根據接收的指令或者數據,執行相應的動作;
程序一般為:
void UART_ISR() interrupt x using y
{
;串口中斷處理函數
}
x - 單片機的C51中斷號
y - 指定使用的當前工作寄存器組號(0-3 PSW中的RS0,RS1組合)

3,主程序
int main(void)
{
Init_UART();
while(1)
{
;//數據發送函數
}
}

4. 簡述c51單片機串列口數據發送和數據接收過程

參考吳鑒鷹吧裡面的資料,我也學習單片機,有吳鑒鷹單片機開發板(評價不錯的一款單片機開發板),這樣實驗+理論,然後看視頻學習會更好。有興趣可以看下
串列口初始化編程格式:
SIO: MOV TMOD,#20H ;T1作波特率發生器
MOV TH1,#X ;定時初值選定波特率
MOV TL1,#X MOV PCON,#00H ;SMOD=0,就是波特率不增倍CLR TI ;清除發送中斷標志SETB TR1 ;打開定時器1 2、發送程序
查詢方式: TRAM: MOV A,@R0 ;取數據
MOV SBUF,A ;發送一個字元
WAIT:JBC TI,NEXT ;等待發送結束
SJMP WAIT NEXT: INC R0 ;准備下一次發送
SJMP TRAM3、接收程序
WAIT: JBC RI,NEXT ;查詢等待
SJMP WAIT NEXT: MOV A,SBUF ;讀取接收數據
MOV @R0,A ;保存數據
INC R0 ;准備下一次接收
SJMP WAIT 這個是用軟體查詢方法做的,沒有設定數據校驗。

5. 單片機如何接收外部的信號

如果只是開關信號,那隻要掃描IO就行;
如果是脈沖信號,只要用外部定時計數器或者外部中斷就行,比如光電編碼器;
發射出來的信號是個周期信號,不同的按鍵,其編碼不同,編碼中0和1對應的脈沖長度有差別,詳細內容可以看相關的資料。
要實現一直按著音量會一直加(減),這個過程比較復雜,需要單片機不斷的接收響應,要編寫相應的單片機程序,之後還需要調試。

6. 誰能幫我回答一個關於51單片機的問題: 簡述串列口接收和發送數據的過程。

串列介面的接收和發送是對同一個地址(99H)兩個物理控制的特殊寄存器SBUF進行讀與寫得,當向SBUF發寫命令時,即向緩沖期SBUF裝載並開始TXD引腳向外發送一幀數據,發送完便發送中斷標志T1=1,在滿足串列口接收中斷標志位R1=0的條件下,置允許接收位REN=1就會接收一幀數據進行移位寄存器,並裝載和接收到SBUF中,同時使R1=1當發讀SBUF命令時(執行 MOVA SBUF)便由接收緩沖期SBUF的信息通過內部匯流排送到CPU。

7. 51單片機如何模擬I2C匯流排中從機接收ID,發送數據的程序

#include /*頭文件的包含*/
#include
#define uchar unsigned char /*宏定義*/
#define uint unsigned int

/*埠位定義*/
sbit BELL_OUT=P3^5;
sbit SCL="P1"^3;/*模擬I2C數據傳送位*/
sbit SDA="P1"^4;/*模擬I2C時鍾控制位*/

bit ack; /*應答標志位*/

/*********************************************************************
起動匯流排函數
函數原型: void Start_I2c();
功能:啟動I2C匯流排,即發送I2C起始條件
********************************************************************/
void Start_I2c()
{
SDA="1"; /*發送起始條件的數據信號*/
_nop_();
SCL="1"; /*起始條件建立時間大於4.7us,延時*/
_nop_();
SDA="0"; /*發送起始信號*/
_nop_(); /* 起始條件鎖定時間大於4μs*/
SCL="0"; /*鉗住I2C匯流排,准備發送或接收數據 */
_nop_();
}

/***********************************************
結束匯流排函數
函數原型: void Stop_I2c();
功能:結束I2C匯流排,即發送I2C結束條件
***********************************************/
void Stop_I2c()
{

SDA="0"; /*發送結束條件的數據信號*/
_nop_(); /*發送結束條件的時鍾信號*/
SCL="1"; /*結束條件建立時間大於4μs*/
_nop_();
SDA="1"; /*發送I2C匯流排結束信號*/
_nop_();
}

/*******************************************************************
位元組數據傳送函數
函數原型: void SendByte(uchar c);
功能:將數據c發送出去,可以是地址,也可以是數據,發完後等待應答,並對此狀
態位進行操作(不應答或非應答都使ack=0 假) 。發送數據正常,ack=1;
ack=0表示被控器無應答或損壞。
********************************************************************/
void SendByte(uchar c)
{
uchar BitCnt;

for(BitCnt=0;BitCnt<8;BitCnt++) /*要傳送的數據長度為8位*/
{
SCL="0";
if((c<
else SDA="0";
SCL="1"; /*置時鍾線為高,通知被控器開始接收數據位*/
_nop_(); /*保證時鍾高電平周期大於4μs*/
}

//從機應答,可以用應答和非應答信號代替
_nop_();
SCL="0";
_nop_();
SDA="1"; //
_nop_();
SCL="1";
_nop_();

if(SDA==1){ack=0;} /*判斷是否接收到應答信號*/
else ack="1";

SCL="0";
_nop_();

}

/*******************************************************************
位元組數據傳送函數
函數原型: uchar RcvByte();
功能:用來接收從器件傳來的數據,並判斷匯流排錯誤(不發應答信號),
發完後請用應答函數。
********************************************************************/
uchar RcvByte()
{
uchar retc;
uchar BitCnt;

retc="0";

for(BitCnt=0;BitCnt<8;BitCnt++)
{
SCL="1"; /*置時鍾線為高使數據線上數據有效*/
_nop_();
retc="retc"<<1;
if(SDA==1) retc="retc"+1; /*讀數據位,接收的數據位放入retc中 */
SCL="0";
}
return(retc);
}

/********************************************************************
應答子函數
原型: void Ack_I2c();
功能:主控器進行應答信號
********************************************************************/
void Ack_I2c()
{
SDA="0"; /*在此發出應答信號 */
_nop_();
SCL="0";
_nop_();
SCL="1";
_nop_();
SCL="0"; /*清時鍾線,鉗住I2C匯流排以便繼續接收*/
_nop_();
SDA="1";
_nop_();
}

/********************************************************************
非應答子函數
原型: void NoAck_I2c();
功能:主控器進行非應答信號
********************************************************************/
void NoAck_I2c()
{
SDA="1"; /*在此發出非應答信號 */
_nop_();
SCL="1";
_nop_();
SCL="0"; /*清時鍾線,鉗住I2C匯流排以便繼續接收*/
}

/*******************************************************************
向無子地址器件發送位元組數據函數
函數原型: bit ISendByte(uchar sla,ucahr c);
功能:從啟動匯流排到發送地址,數據,結束匯流排的全過程,從器件地址sla。如果
返回1表示操作成功,否則操作有誤。
********************************************************************/
bit ISendByte(uchar sla,uchar c)
{
Start_I2c(); /*啟動匯流排*/
SendByte(sla); /*發送器件地址*/
if(ack==0)return(0);

SendByte(c); /*發送數據*/
if(ack==0)return(0);

Stop_I2c(); /*結束匯流排*/
return(1);
}

/*******************************************************************
向有子地址器件發送多位元組數據函數
函數原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
功能:從啟動匯流排到發送地址,子地址,數據,結束匯流排的全過程,從器件地址sla,
子地址suba,發送內容是s指向的內容,發送no個位元組。如果返回1表示
操作成功,否則操作有誤。
********************************************************************/
bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;

Start_I2c(); /*啟動匯流排*/
SendByte(sla); /*發送器件地址*/
if(ack==0)return(0);

SendByte(suba); /*發送器件子地址*/
if(ack==0)return(0);

for(i=0;i
{
SendByte(*s); /*發送數據*/
if(ack==0)return(0);
s++;
}
Stop_I2c(); /*結束匯流排*/
//delayMs(1); //
return(1);
}

/*******************************************************************
向無子地址器件讀位元組數據函數
函數原型: bit IRcvByte(uchar sla,ucahr *c);
功能:從啟動匯流排到發送地址,讀數據,結束匯流排的全過程,從器件地址sla,返
回值在c。如果返回1表示操作成功,否則操作有誤。
********************************************************************/
bit IRcvByte(uchar sla,uchar *c)
{
Start_I2c(); /*啟動匯流排*/
SendByte(sla+1); /*發送器件地址*/
if(ack==0)return(0);

*c=RcvByte(); /*讀取數據*/
NoAck_I2c(); /*發送非就答位*/
Stop_I2c(); /*結束匯流排*/
return(1);
}

/**********************************************************************
向有子地址器件讀取多位元組數據函數
函數原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
功能:從啟動匯流排到發送地址,子地址,讀數據,結束匯流排的全過程,從器件地址sla,
子地址suba,讀出的內容放入s指向的存儲區,讀no個位元組。如果返回1
表示操作成功,否則操作有誤。
**********************************************************************/
bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
{
Start_I2c(); /*啟動匯流排*/
SendByte(sla); /*發送器件地址*/
if(ack==0)return(0);

SendByte(suba); /*發送器件子地址*/
if(ack==0)return(0);

Start_I2c();
SendByte(sla+1);
if(ack==0)return(0);

while(no!=1)
{
*s=RcvByte();/*發送數據*/
Ack_I2c(); /*發送就答位*/
s++;
no--;
}
*s=RcvByte();
NoAck_I2c(); /*發送非應位*/
Stop_I2c(); /*結束匯流排*/
return(1);
}

8. 單片機怎樣通過串口向計算機發送數據

單片機怎樣通過串口向計算機發送數據:
單片機可以實現與計算機的發送和接收。首先,要正確配置單片機的串口,包括波特率、使用時鍾源、COM口、數據位位數、奇偶校驗位、停止位位數等,同時要保證計算機的配置和單片機的一致。然後,把要發送的數據送到發送緩存,只能一個位元組一個位元組的發送。啟動單片機發送,就可以完成發送操作。如果打開接收中斷,計算機發送數據過來的時候,就會進入到接收中斷,單片機進入接收數據狀態。
要注意的是,單片機是TTL電平,而計算機是232電平,所以在硬體電路連接上要有電平轉換晶元,常用的有MAX232等。

閱讀全文

與單片機接收發送過程相關的資料

熱點內容
node開源論壇源碼 瀏覽:8
單片機比手機晶元還貴 瀏覽:35
java課表 瀏覽:555
如何在pdf裡面修改 瀏覽:929
橙光製作器檔案框在哪個文件夾 瀏覽:991
php如何抓取網頁數據 瀏覽:642
計數器單片機 瀏覽:966
游戲aoi演算法 瀏覽:844
phpmysqlint 瀏覽:912
怎麼從appstore商城買東西 瀏覽:184
大秀直播平台源碼 瀏覽:424
java視屏 瀏覽:934
電腦中如何給程序加密 瀏覽:240
java排序容器 瀏覽:942
職稱證書在哪個app下載 瀏覽:362
四九演算法算男女 瀏覽:659
javawindows8 瀏覽:498
2021世界程序員節 瀏覽:486
php翼支付 瀏覽:884
盈通伺服器ip地址 瀏覽:791