1. 如何進行單片機與PC機的串口數據讀取通信
首先硬體要有MAX232晶元做電平轉換 或者直接用pl2303做usb轉串口.
軟體要有一個串口調試工具.
至於程序就是 (1):設置串口相關寄存器 注意波特率設置
(2):把數據放在sbuf裡面
(3):檢查是否發送完畢沒完等待 發完了就繼續放
各種單片機設置方法不一樣就給你一個51 的程序你參考一下:
//wx原創 串口調試程序 向pc發送數據 用於調試觀察數據
#include<reg52.h>
#include<hdy.h>
sbit k1=p10;
void ckfszf(char zf);
void ckfszfc(char fsgs,char zfc[]);
bit cksnbzw=0;
char fsb[]={"abcdef"};
main()
{
PCON=0x80; //串口設置
TMOD=0x20; // 以T1定時器為波特發生器 波特率:19200
TH1=0xfD;
TL1=0xfD;
TR1=1;
SCON=0X50; //串口設置模式一完畢
while(1)
{
TI=1;
ckfszfc(6,fsb);
ckfszf(' ');
ckfszfc(9,"1234567890");
ckfszf(' ');
ckfszf(' ');
ckfszf(' ');
ckfszfc(12,"AABBCCDDEEFFGG");
ckfszf(' ');
while(1);
}
}
//字元 串口發送函數 由串口向外發送一個字元
//參數1:要發送字元
//返回值:無
//備注: 本函數內部檢查上次發送是否結束
// 全局初始化要求:TI=1 保證第一次進入此函數之前TI=1
void ckfszf(char zf)
{
while(TI==0); //等待發送完畢
TI=0;
SBUF=zf;
}
//字元串 串口發送函數 由串口向外發送一個字元串
//參數1:要發送字元串個數 取值:0~255
//參數2:要發送字元串數組名 或字元串本身
//返回值:無
//備注: 本函數內部檢查上次發送是否結束
// 全局初始化要求:TI=1 保證第一次進入此函數之前TI=1
void ckfszfc(uchar fsgs,char zfc[])
{
uchar i;
cksnbzw=1;
for(i=0;i<fsgs;i++)
{
ckfszf(zfc[i]);
}
}
純手打 原創程序 給分!
2. 單片機的串口,怎樣與電腦串口連接
一般單片機由於供電的原因,通常都是TTL的UART電平訊號,需要經過轉換IC來提升電平(RS-232),電腦通常都是RS-232的訊號,因此直接把轉換後的RS-232跟電腦的RS-232來對接就可以了,對接的意思是說電腦的TX(發射)要接到單片機的RX(接收),電腦的RX(接收)要接到單片機的TX(發射),然後把兩個GND(地)接一起就可以了
3. PC與單片機通過串口通訊,其中SBUF是串口的緩存區么,怎麼實現
/*打開串口調試程序,將波特率設置為9600,無奇偶校驗
晶振11.0592MHz,發送和接收使用的格式相同,如都使用
字元型格式,在發送框輸入
hello,I
Love
MCU
,在接
收框中同樣可以看到相同字元,說明設置和通信正確
*/
#include
<REG52.H>
/*主程序*/
void
main
(void)
{
SCON
=
0x50;
/*
SCON:
模式
1,
8-bit
UART,
使能接收
*/
TMOD
|=
0x20;
/*
TMOD:
timer
1,
mode
2,
8-bit
reload
*/
TH1
=
0xFD;
/*
TH1:
reload
value
for
9600
baud
@
11.0592MHz
*/
TR1
=
1;
/*
TR1:
timer
1
run
*/
EA
=
1;
/*打開總中斷*/
ES
=
1;
/*打開串口中斷*/
while
(1)
/*主循環不做任何動作*/
{
}
}
void
UART_SER
(void)
interrupt
4
//串列中斷服務程序
{
unsigned
char
Temp;
//定義臨時變數
if(RI)
//判斷是接收中斷產生
{
RI=0;
//標志位清零
Temp=SBUF;
//讀入緩沖區的值
P1=Temp;
//把值輸出到P1口,用於觀察
SBUF=Temp;
//把接收到的值再發回電腦端
}
if(TI)
//如果是發送標志位,清零
TI=0;
}
這是我用的程序,自己可以看看,網上這方面資料很多,自己試試就會了!
4. 單片機與pc機串口通信完整代碼
#include"reg51.h"
unsigned int rt=0,tt=0,dema,temp;
unsigned int re_buf[3]={0};初值
unsigned char send_buf[4]={'O','K','O','K'};//返回
unsigned char code leds_a[]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9共陽極
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3; //數碼管選位
bit L11;
void rs232_S(void);//串口初始化
void disp(void);//數碼管顯示
void main(void)
{
rs232_S();
while(1)
{
disp();
if(L11)
{
tt=0;
TI=1;//直接觸發中斷
L11=0;
}
}
}
void rs232_S(void)
{
TMOD=0X21;//T0用於定時作延時用 方式1
TH1=0XE6;
TL1=0XE6;//波特率2400
TH0=0Xf8;
TL0=0X30; //晶振12M初值2mS
TR0=1;
ET0=1;
SCON=0X50;
PCON=0X80;//smod加倍
TI=0;
RI=0;
L11=0;
ET1=1;
TR1=1;
ES=1;
EA=1;
}
void RS232(void) interrupt 4
{
if(RI)
{
RI=0;
rt++;
if(rt<5)
{
re_buf[rt-1]=SBUF;
if(rt>=4)
{
L11=1;
rt=0;
}
}
}
else if(TI)
{
TI=0;
if(tt<4)
{
SBUF=send_buf[tt];
tt++;
}
}
}
void timer0(void) interrupt 1 //中斷進程
{
TR0=0;
TH0=0Xf8;
TL0=0X30; //重裝初值
TR0=1;
if(dema)
{
dema--; //2mS延時,延時採用定時中斷初值2mS
}
}
void disp(void)
{
P23=0;
temp=re_buf[3];
temp=temp&0x0f;
P0=leds_a[temp];
dema=3; //延時6mS
while(dema!=0);
P23=1;
P22=0;
temp=re_buf[2];
temp=temp&0x0f;
P0=leds_a[temp];
dema=3;
while(dema!=0);
P22=1;
P21=0;
temp=re_buf[1];
temp=temp&0x0f;
P0=leds_a[temp]; //串口發送10進制數 通過轉換二進制 保留低4位形成10進制數 選擇0-9
dema=3;
while(dema!=0);
P21=1;
P20=0;
temp=re_buf[0];
temp=temp&0x0f;
P0=leds_a[temp];
dema=3;
while(dema!=0);
P20=1;
}
用串口調試助手發送0000-9999四位數(十進制),單片機接收顯示在4位數碼管上並返回OKOK
這是我剛調試完成的,希望對你有幫助。
5. 51單片機與PC機之間的硬體如何串口連接
單片機和微機通信的電氣標准要一致,微機串口一般是RS232電氣標准,所以要加電平轉換晶元,大多用MAX232,一般單片機實驗板上都提供這樣的標准串口。
要分別編寫上位機和下位機軟體程序,單片機程序參照常式、教科書進行編寫;上位機微機可採用VB,組態軟體,Labview等軟體編寫,一般若是簡單的通信,上位機程序編寫很簡單,例如VB中學會使用mscomm控制項,有VB最基礎知識的一天就能學會。
大可以沒有單片機,沒有MAX232,沒有串列介面這些硬體就可以實現學習並掌握單片機與微機之間的串口通信。proteus可以模擬單片機,也是主流軟體。
如今的筆記本電腦幾乎都沒有保留串口,而用USB介面取而代之,不過沒關系,有了虛擬串口和串口調試助手,這些都解決了。你可以搜索一下虛擬串口,真的很不錯的。
6. 單片機之間使用串口通信是,SBUF內的值無法改變
我覺得是你串口初始化比特率設置沒成功,這是我找的一段串口初始化的程序,希望幫到你!
//12MHZ 9600波特率,定時器1T方式,串口1,波特率倍數開啟
void UART_Init(void)
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位數據,可變波特率
AUXR |= 0x40; //定時器1時鍾為Fosc,即1T
AUXR &= 0xfe; //串口1選擇定時器1為波特率發生器
TMOD &= 0x0f; //清除定時器1模式位
TMOD |= 0x20; //設定定時器1為8位自動重裝方式
TL1 = 0xB2; //設定定時初值
TH1 = 0xB2; //設定定時器重裝值
ET1 = 0; //禁止定時器1中斷
TR1 = 1; //啟動定時器1
}