導航:首頁 > 操作系統 > 單片機串口通信c程序

單片機串口通信c程序

發布時間:2022-08-08 03:21:42

單片機串口通信C語言編程問題

你看看接收並回傳給串口助手的數據是否正確
if(Rev_Data == "t")
{
Sector_erase(0x2000); //扇區擦除。。。。把這一句注釋掉,再看看結果
P1 = 0x55;
delay(5);
flag = 1;
i = 0;
}

㈡ C語言51單片機串口通信程序求教

串口通訊,首先設置波特率,再設置串口模式,之後就可以收發數據了。比如:

init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0x50;
}
send(unsignedchardat)
{
SBUF=dat;
while(TI==0);
TI==0;
}
unsignedcharrecive()
{
unsignedchardd;
if(RI)
{
dd=SBUF;
RI=0;
}
return(dd);
}

㈢ 單片機串口通信C程序

"TMOD = 0x2f;"改成"TMOD = 0x20;"試試,另外還有你要確保你的單片機的晶振是11.059MHz的,你的波特率設置是沒有問題的。

㈣ 單片機串列口通信程序C語言

/*
程序把接收的數據發送出去,波速率為2400。
打開串口調試軟體,把波速率設置為2400,
向板發送一個位元組數據,軟體應能接收到同樣的數據。

*/

#include<reg51.h>
void delayms(unsigned int i);
unsigned char b;
void rs_dmx() interrupt 4 using 2//串口中斷服務程序
{

b=SBUF;//接收數據

SBUF=b;//把接收的數據發送出去
while(TI==0);TI=0;
delayms(1);

RI=0;
}
main()
{
//write(1,60);
//b=read(1);
EA=1;
// TR0=1;
// ET0=1;
// TMOD=0X01;

TMOD=0x21;

TH1=0xF3;//波速率為2400
TL1=0xf3;
TR1=1;
EA=1;
SCON=0XD0;

ES=1;

while(1)
{

}

}

void delayms(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
for(j=100;j>0;j--);
}

自己改波特率,該程序通過單片機與串口助手相互通信

㈤ 要個計算機與單片機的串口通信上位機C語言程序

兄弟,下面是我自己寫的,希望給你幫助,把數據用Send_One_Uart()這個函數直接發送到串口就行了!最後求採納,哈哈!
//-----頭文件
#include
//-----定義全局變數
unsigned
char
Temp;
/***************************************************
**
函數名稱:
UART_Init
**
功能描述:
串口初始化函數
**

入:無
**

出:

**

明:

****************************************************/
void
UART_Init(void)
{
SCON
=
0x50;
//-----SCON:
模式
1,
8-bit
UART,
使能接收
TMOD
|=
0x20;
//-----TMOD:
timer
1,
mode
2,
8-bit
重裝
TH1
=
0xFD;
//-----TH1:
重裝值
9600
波特率
晶振
11.0592MHz
TR1
=
1;
//-----TR1:
timer
1
打開
ES
=
1;
//-----打開串口中斷
EA
=
1;
//-----打開總中斷
}
/***************************************************
**
函數名稱:
SendByte
**
功能描述:
發送位元組函數
**

入:無
**

出:

**

明:

****************************************************/
void
SendByte(unsigned
char
dat)
{
SBUF
=
dat;
while(!TI);
TI
=
0;
}
/***************************************************
**
函數名稱:
SendStr
**
功能描述:
發送字元串函數
**

入:無
**

出:

**

明:

****************************************************/
void
SendStr(unsigned
char
*s)
{
while(*s!='\0')
{
SendByte(*s);
s++;
}
}
/***************************************************
**
函數名稱:
main
**
功能描述:
主函數
**

入:無
**

出:

**

明:

****************************************************/
void
main
(void)
{
UART_Init();
//-----串口初始化
while(1)
{
if(Temp=='H'&&'i')
{
Temp=0;
SendStr("hello");
}
}
}
/***************************************************
**
函數名稱:
UART_SER
**
功能描述:
串口中斷服務子函數
**

入:無
**

出:

**

明:

****************************************************/
void
UART_SER
(void)
interrupt
4
//-----串列中斷服務程序
{
if(RI)
//-----判斷是接收中斷產生
{
RI=0;
//-----標志位清零
Temp=SBUF;
//-----讀入緩沖區的值
}
}

㈥ 求單片機串口通信C程序

我也來說兩有句。

1.樓主首先要確定是硬體沒有問題,先用232直接與電腦通迅看能否正常工作,用單片機接232晶元再接電腦就可用串口調試助手來看了。
1>用示波器測232晶元的接收與發送/或測單片機的RX/TX引腳;
2>可直接用printf來輸出,包涵相應的頭文件#include <stdio.h>,設置好波特率即可,注意波特率一定要設置正確;如:printf (" This is a test! \n");

2.傳一個51串口中斷接收與發送的例子

/*-----------------------------------------------------*
*文件描述:本文件包含了串列通信的4子程序,分別為: *
*(1)SCISend1:串列發送1位元組 *
*(2)SCISendN:串列發送n位元組 *
*(3)SCIRe1:串列接收1位元組 *
*(4)SCIReN:串列接收n位元組 *
*-------------《嵌入式應用技術基礎教程》--------------*/
//[以下為子程序源代碼]
//[包含頭文件]
#include "SCI.h"
/*SCISend1:串列發送1個位元組-----------------------------*
*功 能:串列發送1個位元組 *
*參 數:要發送的數據 *
*返 回:無 *
*-----------------------------------------------------*/

void SCISend1(unsigned char o)
{
ReSendDataR=o;
while(1)
{
//判斷ReStatusR的SendIntBit位是否為1,是1就清0
if (SendIntBit!=0)
{
SendIntBit=0;
break;
}
}
}

/*SCISendN:串列發送N個位元組-----------------------------*
*功 能:發送數組中的N個位元組數據 *
*參 數:待發送的數據位元組數及其要存放的數組首地址 *
*返 回:無 *
*-----------------------------------------------------*/

void SCISendN(unsigned char n,unsigned char ch[])
{ int i;
for(i=0;i<n;i++)
{
SCISend1(ch[i]);

}
}

/*SCIRe1:串列收一個位元組數據----------------------------*
*功 能:從串列口接收1個位元組的數據 *
*參 數:標志指針p *
*返 回:接收到的數據(若接收失敗,返回0xff) *
*說 明:參數*p帶回接收標志=0收到數據,=1未收到數據 *
*-----------------------------------------------------*/

unsigned char SCIRe1(unsigned char *p)
{ unsigned int k;
unsigned char i;
//ReStatusR的ReIntBit位為1表示可接收數據
for(k=0;k<0xfbbb;k++)
{
if (ReIntBit!=0)
{i=ReSendDataR;
*p=0x00;
ReIntBit=0;
break;}
}
if(k>=0xfbbb)
{i=0xff;
*p=0x01;}
return i; //返回接收到的數據
}

/*SCIReN:HC08串列接收N個位元組---------------------------*
*功 能:接收N個位元組數據,並存放在ch數組中 *
*參 數:待接收的數據位元組數及其存放的數組首地址 *
*返 回:接收標志=0收到數據,=1未收到數據 *
*-----------------------------------------------------*/

unsigned char SCIReN(unsigned char n,unsigned char ch[])
{int m;
unsigned char fp;
m=0;
while (m<n)
{
ch[m]=SCIRe1(&fp);
if (fp==1) return 1;

m++;
}

return 0;
}

//**************************中斷方式*************************************

void main()
{
EA=0; // 開中斷
InitSerial(); //初始化
EA=1; // 關中斷

ES=1; //允許串口接收中斷

//主循環
while(1);

}

/*
**************************************************************************************
* uart初始化
*
**************************************************************************************
*/

void InitSerial(void)
{
TMOD=TMOD&0x0F;
TMOD=TMOD|0x20; //定時器1 定時方式2
TL1=0xFA;TH1=0xFA; //4800 11.0592MHz fosc

SCON=0x50; //串列方式1 允許接收
PCON=0x00; //波特率不增倍
TR1=1; //啟動定時器1
}

//增加個人說明:功能-->將從串口接收到的數據發送出去.注意波特率的設置.
//如果在PC終端一次性將"abcdefghi........"一連串的字元發送會出現什麼情況?會不會亂?
//答案是不會,因為當收到一位元組,如'a'時,立即將'a'發送出去了,此時SBUF就可以接收新的數據,所以不會亂.....

void Int1(void) interrupt 4 // interrupt 4 表示串口中斷
{

unsigned char SerialBuff[1]; //存放接收數據的數組
unsigned char i;
EA = 0; // 開中斷

//接收1個數據
i=SCIReN(1,SerialBuff);
//若收到數據,則發送接到的數據
if(i==0) SCISendN(1,SerialBuff);

EA = 1; // 關中斷

}

以上回答希望你滿意

㈦ 兩片單片機通過串口一發一收的C語言常式

/*甲機串口程序:甲機向乙機發送控制命令字元,甲機同時接收乙機發送的數字,並顯示在數碼管上。*/

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

sbit LED1=P1^0;

sbit LED2=P1^3;

sbit K1=P1^7;

uchar Operation_No=0; //操作代碼

//數碼管代碼

uchar codeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//延時

void DelayMS(uint ms)

{

uchari;

while(ms--)for(i=0;i<120;i++);

}

//向串口發送字元

void Putc_to_SerialPort(uchar c)

{

SBUF=c;

while(TI==0);

TI=0;

}

//主程序

void main()

{

LED1=LED2=1;

P0=0x00;

SCON=0x50; //串口模式1,允許接收

TMOD=0x20; //T1工作模式2

PCON=0x00; //波特率不倍增

TH1=0xfd;

TL1=0xfd;

TI=RI=0;

TR1=1;

IE=0x90; //允許串口中斷

while(1)

{

DelayMS(100);

if(K1==0) //按下K1時選擇操作代碼0,1,2,3

{

while(K1==0);

Operation_No=(Operation_No+1)%4;

switch(Operation_No) //根據操作代碼發送A/B/C或停止發送

{

case0: Putc_to_SerialPort('X');

LED1=LED2=1;

break;

case1: Putc_to_SerialPort('A');

LED1=~LED1;LED2=1;

break;

case2: Putc_to_SerialPort('B');

LED2=~LED2;LED1=1;

break;

case3: Putc_to_SerialPort('C');

LED1=~LED1;LED2=LED1;

break;

}

}

}

}

//甲機串口接收中斷函數

void Serial_INT() interrupt 4

{

if(RI)

{

RI=0;

if(SBUF>=0&&SBUF<=9)P0=DSY_CODE[SBUF];

elseP0=0x00;

}

}

/*乙機程序接收甲機發送字元並完成相應動作:乙機接收到甲機發送的信號後,根據相應信號控制LED完成不同閃爍動作。*/

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

sbit LED1=P1^0;

sbit LED2=P1^3;

sbit K2=P1^7;

uchar NumX=-1;

//延時

void DelayMS(uint ms)

{

uchari;

while(ms--)for(i=0;i<120;i++);

}

//主程序

void main()

{

LED1=LED2=1;

SCON=0x50; //串口模式1,允許接收

TMOD=0x20; //T1工作模式2

TH1=0xfd; //波特率9600

TL1=0xfd;

PCON=0x00; //波特率不倍增

RI=TI=0;

TR1=1;

IE=0x90;

while(1)

{

DelayMS(100);

if(K2==0)

{

while(K2==0);

NumX=++NumX%11; //產生0~10范圍內的數字,其中10表示關閉

SBUF=NumX;

while(TI==0);

TI=0;

}

}

}

void Serial_INT() interrupt 4

{

if(RI) //如收到則LED則動作

{

RI=0;

switch(SBUF)//根據所收到的不同命令字元完成不同動作

{

case'X': LED1=LED2=1;break; //全滅

case'A': LED1=0;LED2=1;break; //LED1亮

case'B': LED2=0;LED1=1;break; //LED2亮

case'C': LED1=LED2=0; //全亮

}

}

}

㈧ 怎樣編寫單片機的串口通信的程序,一般的步驟是怎麼樣

編寫串口通訊程序步驟為:

1、設置波特率

2、設置串口工作方式

3、收發數據。

比如:

main()
{
unsignedchardat;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0x50;
while(1)
{
while(RI==0);
RI=0;
dat=SBUF;
SBUF=~dat;
while(TI==0)
TI=0;
}
}

㈨ 急!!!單片機C語言實現串口通信編程

以下是我剛改的程序編譯成功了
請參考

#include"reg51.h"
//定義全局變數
unsigned char data_10[10]={0,0,0,0,0,0,0,0,0,0};
unsigned char Time_50ms,count;
bit flag=0;
bit data_flag=0;
/*********************************************************************************************
函數名:UART串口初始化函數
調 用:UART_init();
參 數:無
返回值:無
結 果:啟動UART串口接收中斷,允許串口接收,啟動T/C1產生波特率(佔用)
備 註:振盪晶體為12MHz,PC串口端設置 [ 4800,8,無,1,無 ]
/**********************************************************************************************/
void UART_init (void){
EA = 1; //允許總中斷(如不使用中斷,可用//屏蔽)
ES = 1; //允許UART串口的中斷
TMOD |= 0x20;//定時器T/C1工作方式2
SCON = 0x50;//串口工作方式1,允許串口接收(SCON = 0x40 時禁止串口接收)
TH1 = 0xF3;//定時器初值高8位設置
TL1 = 0xF3;//定時器初值低8位設置
PCON = 0x80;//波特率倍頻(屏蔽本句波特率為2400)
TR1 = 1;//定時器啟動
}
/**********************************************************************************************/
/*********************************************************************************************
函數名:UART串口接收中斷處理函數
調 用:[SBUF收到數據後中斷處理]
參 數:無
返回值:無
結 果:UART串口接收到數據時產生中斷,用戶對數據進行處理(並發送回去)
備 註:過長的處理程序會影響後面數據的接收
/**********************************************************************************************/
void UART_R (void) interrupt 4 using 1{ //切換寄存器組到1
TR0=1; //打開定時器開始計時
RI = 0;//令接收中斷標志位為0(軟體清零)
data_10[count] = SBUF;//將接收到的數據送入變數 UART_data
count++;//接收到一個位元組數據計數+1
if(count>=10) //如果接收到10個數據
{
TR0=0; //停止定時器
TH0 = 0x3C; //給定時器賦初值
TL0 = 0xB0; //給定時器賦初值
count=0;//清零數據計數
//data_flag=1; //數據有效標志位
SBUF = 0x55;//返回數據 55H
while(TI == 0);//檢查發送中斷標志位
TI = 0;//令發送中斷標志位為0(軟體清零)
}
if(flag)
{
TR0=0; //停止定時器
TH0 = 0x3C; //給定時器賦初值
TL0 = 0xB0; //給定時器賦初值
count=0;//清零數據計數
SBUF = 0xff;//返回數據 ffH
while(TI == 0);//檢查發送中斷標志位
TI = 0;//令發送中斷標志位為0(軟體清零)
}
}
/**********************************************************************************************/
/*********************************************************************************************
函數名:定時/計數器初始化函數
調 用:T_C_init();
參 數:無
返回值:無
結 果:設置SFR中T/C1和(或)T/C0相關參數
備 註:本函數控制T/C1和T/C0,不需要使用的部分可用//屏蔽
/**********************************************************************************************/
void T_C_init (void){
TMOD |= 0x01; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]
EA = 1;//中斷總開關
TH0 = 0x3C; //16位計數寄存器T0高8位
TL0 = 0xB0; //16位計數寄存器T0低8位(0x3CB0 = 50mS延時)
ET0 = 1; //T/C0中斷開關
TR0 = 0; //T/C0開關
}
/**********************************************************************************************/
/*********************************************************************************************
函數名:定時/計數器0中斷處理函數
調 用:[T/C0溢出後中斷處理]
參 數:無
返回值:無
結 果:重新寫入16位計數寄存器初始值,處理用戶程序
備 註:必須允許中斷並啟動T/C本函數方可有效,重新寫入初值需和T_C_init函數一致
/**********************************************************************************************/
void T_C0 (void) interrupt 1 using 1{ //切換寄存器組到1
TH0 = 0x3C; //16位計數寄存器T0高8位(重新寫入初值)
TL0 = 0xB0; //16位計數寄存器T0低8位(0x3CB0 = 50mS延時)
Time_50ms++; //50ms到 計數+1
if(Time_50ms>=100)
{
Time_50ms=0;// 清零50ms計數
flag=1; //5s時間 標志置位
TR0=0;//關閉計時器
}
}
/**********************************************************************************************/
main()
{
IP = 0x10; //中斷優先順序設置(串口中斷最高優先順序)
UART_init();//初始化串口
T_C_init(); // 初始化計數器
while(1);// 空循環
}

閱讀全文

與單片機串口通信c程序相關的資料

熱點內容
地球怎麼壓縮直徑 瀏覽:778
金鏟鏟之戰伺服器爆滿怎麼進 瀏覽:156
同仁堂pdf 瀏覽:935
如何編譯原理課程教材 瀏覽:730
單片機控制顯示器 瀏覽:776
頂好花app下載怎麼找不到 瀏覽:989
手機命令大全 瀏覽:808
怎麼下郵政銀行app 瀏覽:250
不背單詞app單詞怎麼學習 瀏覽:481
程序員日常操作搞笑 瀏覽:382
android檢查是否安裝 瀏覽:375
蘋果手機編輯pdf文件 瀏覽:460
android系統名字 瀏覽:971
安卓手機如何進去有求必應屋 瀏覽:434
指數除法運演算法則底數不同 瀏覽:896
90壓縮干糧09壓縮干糧 瀏覽:516
android線程池框架 瀏覽:481
手機自帶解壓能解壓哪些文件 瀏覽:804
linux安裝hba驅動 瀏覽:119
java構造函數new 瀏覽:668