導航:首頁 > 操作系統 > 單片機串口接收程序

單片機串口接收程序

發布時間:2022-06-19 04:16:43

單片機接收串口數據

你通過串口助手要接受字元串或一組數據需要在單片機端開辟一個緩沖區,否則可能丟失數據。
以下程序是較為通用的串口收發常式,開辟一個16位元組的緩沖區,兩個指針,一個存數指針,一個取數指針,兩指針相等,證明沒有新的接收數據。
#include<reg51.h>
#define uchar unsigned char
uchar buf[16],getptr,putptr;
void uart_isr() interrupt 4
{
if(RI)
{
RI=0;
buf[putptr]=SBUF;
putptr++;
putptr&=0x0f;
}
}
main()
{
TMOD=0x20;
SCON=0x50;
TH1=TL1=0xfd;
TR1=1;
ES=1;
EA=1;
putptr=0;
getptr=0;
while(1)
{
if(getptr!=putptr) //取數指針和存數指針如果不等
{
SBUF=buf[getptr];
getptr++;
getptr&=0x0f;
while(!TI);
TI=0;
}
}
}

② 編寫單片機串口收發數據的完整程序(C語言編寫)

我用的新唐晶元,8051內核,跟51差不多,望採納
void UART_Initial (void)
{
P02_Quasi_Mode; //Setting UART pin as Quasi mode for transmit
P16_Quasi_Mode; //Setting UART pin as Quasi mode for transmit

SCON_1 = 0x50; //UART1 Mode1,REN_1=1,TI_1=1
T3CON = 0x08; //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1), UART1 in MODE 1
clr_BRCK;
RH3 = HIBYTE(65536 - (1000000/u32Baudrate)-1); /*16 MHz */
RL3 = LOBYTE(65536 - (1000000/u32Baudrate)-1); /*16 MHz */
set_TR3; //Trigger Timer3
}
以上是初始化的
void Send_Data_To_UART1(UINT8 c)
{
TI_1 = 0;
SBUF_1 = c;
while(TI_1==0);
}
這個是發送
void UART_isr (void) interrupt 4 //串列中斷服務程序
{
if (RI_1==1)
{ /* if reception occur */
clr_RI_1; /* clear reception flag for next reception */
Receive_Date[c] = SBUF_1;
if (Receive_Date[0] == First_Date)
{
c++;
}
else if(Receive_Date_Size > 0 && Receive_Date_Size < 4)
{
c++;
}
else if(Receive_Date[c] == Last_Date && Receive_Date_Size ==4)
{
c = 0;
Flag_Receive_One = 1;
}
else
{
c = 0;
}
}
}
接收

③ 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相關的程序,可以用發光二極體亮來代表修改功能!

④ 單片機串口接收命令的程序怎樣寫

先初始化串口,再接收數據就可以了。比如:
#include<reg51.h>
#define uchar unsigned char
uchar rec;
bit flag=0;
void uart() interrupt 4
{
if(RI)
{
RI=0;
rec=SBUF;
flag=1;
}
}

main()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
SCON=0x50;
TR1=1;
ES=1;
EA=1;
while(1)
{
if(flag)
{
case ....
case ....
default:break
}
}
}

⑤ 51單片機間串口通訊,接收端程序調用完接收子程序,主程序不能繼續運行

因為在你recieve()函數里有一個while(1)循環處理過程,其實你這程序在用KEIL編譯的時候會有警告提示的,即:led1=0這句將永遠不會被執行的


從事音頻設備開發好多年——VX:xuquanfugui-2020


⑥ 單片機接收串口接收程序

你在中斷函數里寫個while(1)干什麼,那進中斷不就出不來了
還有,初始化的時候ri應該置0,而不是1
另外把com_interrupt(void)interrupt
4
using
3
改成void
com_interrupt()
interrupt
4試試,你那種寫法我看不太懂。。。
你想要什麼樣的結果?接收串口數據到c,然後呢?
怎麼體現出來它接收到了?
還有,你的程序調試通過了嗎?

⑦ 51單片機從電腦串口接收10位元組的數據,程序用c語言

可靠的接受程序!!從LZ 的display(a1......a10)看出來這程序就不咋樣,如果顯示函數 還是 用 延時做的,可靠的接受程序給LZ 也是 白瞎……
以下是 UART 驅動程序

/***10位非同步收發串口通訊驅動——火柴天堂作品-20130119***/
/***源程序硬體環境:52單片機,11.0592MHz晶振,定時器1作為波特率發生器,通訊波特率9600 bit/s***/
/******/
#define UART_H
#include"REG52.h" //包含52頭文件
#include"UART.h" //包含串口頭文件
#define th1 0xfa //6.51us at 11.0592MHz Fosc for 8bit auto reload mode

static uchar UART_DataR; //串口接收數據寄存器
static uchar bdata Flag=0; //標志位 寄存器
sbit UART_ReFlag=Flag^0; //串口接收標志位 0:無數據 1:新數據
sbit UART_SendFlag=Flag^1; //串口發送標志位 0:空閑中 1:發送中

void UART()interrupt 4 //串口中斷函數
{
if(RI) //若串口接收完成
{
RI=0; //清 串口接收溢出位
UART_DataR=SBUF; //將串口收到的數據存進 UART_DataR
UART_ReFlag=TRUE; //串口接收標志位 置位(有新數據)
}
if(TI) //若串口發送完成
{
TI=0; //清 串口發送溢出位
UART_SendFlag=FALSE; //清串口發送標志位(空閑中)
}
}

void UART_Init() //串口初始化函數
{
SCON=0x50; //選擇通訊方式:10位非同步收發,串口中斷使能
PCON=0x80; //波特率倍頻
TMOD&=0x0f; //定時器1控制位清0
TMOD|=0x20; //定時器1工作模式2(8位自重裝,做波特率發生器)
TH1=th1; //定時器初值
TL1=th1; //定時器初值
TR1=1; //開始計時
ES=1; //允許串口中斷
EA=1; //允許系統中斷
}

bit UART_SendByte(uchar send_data) //串口發送位元組函數,發送內容send_data,返回值:0 操作失敗,1操作成功
{
if(!UART_SendFlag) //若串口空閑中,則
{
SBUF=send_data; //將發送內容 送到 串口寄存器
UART_SendFlag=TRUE; //置位串口發送標志位(進入忙態)
return TRUE; //返回1,操作成功
}
return FALSE; //否則,返回0,操作失敗
}

uchar ASCII_ToHex(uchar ascii_data) //ASCII 轉 Hex 函數
{
uchar hex_data=0; //定義 Hex變數存儲轉換結果
if(ascii_data>='0' && ascii_data<='9') hex_data=ascii_data-'0'; //若 轉換內容為 字元'0-9',則轉成對應數字0-9
else if(ascii_data>='a' && ascii_data<='f') hex_data=ascii_data-'a'+10; //若 轉換內容為 字元'a-f',則轉成數字10-15
else if(ascii_data>='A' && ascii_data<='F') hex_data=ascii_data-'A'+10; //若 轉換內容為 字元'A-F',則轉成數字10-15
return hex_data; //返回轉換結果,非以上字元,不在Hex(0-F)范圍內,默認0
}

bit UART_ReadByte(uchar *p_data,bit data_mode) //串口讀位元組函數,返回值0 無數據,1 有數據,將data_mode模式(ASCII_Mode或HEX_Mode)轉成Hex結果存到p_data指向地址
{
if(!UART_ReFlag) return FALSE; //若無新數據,則返回 0(無數據)
UART_ReFlag=FALSE; //否則,清 串口接收標志位
if(data_mode==HEX_Mode) *p_data=UART_DataR; //Hex模式,將串口接收結果存到p_data指向地址
if(data_mode==ASCII_Mode) *p_data=ASCII_ToHex(UART_DataR); //ASCII模式,將串口接收結果轉成Hex後,存到p_data指向地址
return TRUE; //返回 1(有數據)
}

⑧ 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)
{
;//數據發送函數
}
}

⑨ 求51單片機串口方式0接收程序寫法

#include <AT89X51.H>//單片機51頭文件,存放著單片機的寄存器
unsigned char dat; //用於存儲單片機接收發送緩沖寄存器SBUF裡面的內容
sbit gewei=P2^2; //個位選通定義
sbit shiwei=P2^3; //十位選通定義
unsigned char code table[]=;
//;// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
void Delay(unsigned int tc) //延時程序
{
while( tc != 0 )
{unsigned int i;
for(i=0; i<100; i++);
tc--;}
}
void LED() //LED顯示接收到的數據
{
shiwei=0;
P0=~table[dat/16];
Delay(8);
shiwei=1;
gewei=0;
P0=~table[dat%16];
Delay(5);
gewei=1;
}
void Init_Com(void)//功能:串口初始化,波特率9600,方式1
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
void main()//主程序功能:實現接收數據並把接收到的數據原樣發送回去///////
{
Init_Com();//串口初始化
// P1=0xf0;
while(1)
{
if ( RI ) //掃描判斷是否接收到數據,
{
dat = SBUF; //接收數據SBUF賦與dat
RI=0; //RI清零。
SBUF = dat; //在原樣把數據發送回去
}
LED(); //顯示接收到的數據
}
}

⑩ 簡單51單片機串口程序

試試下列程序,這時用中斷發送的。

#include<reg51.h>
#define uchar unsigned char
uchar txt[] = "hello";
uchar i = 0;
void main(void)
{
PCON = 0X00;
SCON = 0X50;
TMOD = 0X20;
TH1 = 0XFD;
TL1 = 0XFD;
TR1 = 1;
EA = 1;
ES = 1;
TI = 1;
while(1) {
if(i == 6) {
i = 0;
TI = 1;
}
}
}
void uart() interrupt 4
{
if(RI == 1) RI = 0;
if(TI == 1) {SBUF = txt[i++]; TI = 0;}
}

本程序,可以用串口助手接收。收到的是:hellohellohellohellohello....

閱讀全文

與單片機串口接收程序相關的資料

熱點內容
cat命令windows 瀏覽:904
python算術游戲 瀏覽:526
常微分方程第二版pdf 瀏覽:18
phpJava學多久 瀏覽:717
php博客畢業設計 瀏覽:792
資料庫編程pdf 瀏覽:904
靜態文件伺服器騰訊雲 瀏覽:847
怎麼讓安卓手機運行蘋果軟體 瀏覽:114
共同好友的演算法 瀏覽:573
中央新聞台加密節目 瀏覽:29
軟考初級程序員2021真題 瀏覽:359
小米電視如何開機自動進入app 瀏覽:281
為什麼dns伺服器ping不通 瀏覽:601
直播游戲簽名源碼 瀏覽:651
杭州雲伺服器搭建 瀏覽:634
mayapython中文 瀏覽:363
只狼加存檔應該是哪個文件夾 瀏覽:115
程序員禿頭圖片 瀏覽:925
思科路由器命令手冊 瀏覽:27
android獲得當前activity 瀏覽:835