⑴ 兩個51單片機之間串口通訊程序
參考一下:
http://hi..com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/725053edc5cec62d27979143.html
⑵ 簡單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....
⑶ 關於51單片機的串口方式
SCON位符號從高到低(7~0) SM0 SM1 SM2 REN TB8 RB8 TI RI
0x40 對應二進制為: 0100 0000 對應上面的八位,即SM1為高電平,故為串口1工作。
SM0、SM1:串列口工作方式選擇位
SM2:多機通信控制位
REN:允許/禁止串列口接收的控制位
TB8:在方式2和方式3中,是被發送的第9位數據,可根據需要由軟體置1或清零,也可以作為奇偶校驗位,在方式1中是停止位。
RB8:在方式2和方式3中,是被接收的第9位數據(來自第TB8位);在方式1中,RB8收到的是停止位,在方式0中不用。
TI——串列口發送中斷請求標志位
當發送完一幀串列數據後,由硬體置1;在轉向中斷服務程序後,用軟體清0。
RI——串列口接收中斷請求標志位
當接收完一幀串列數據後,由硬體置1;在轉向中斷服務程序後,用軟體清0。
⑷ 請問51單片機與51單片機之間的串口通信程序怎麼寫
1、查詢方式:
#include<reg51.h>
main()
{
unsigned char dat;
TMOD=0x20;
TH1=TL1=0xfd;
SCON=0x50;
TR1=1;
while(1)
{
if(RI)//接收
{
RI=0;
dat=SBUF;
}
SBUF=dat;//發送
while(!TI);
TI=0;
}
}
2、中斷方式:
#include<reg51.h>
unsigned char dat;
bit flag;
void uart_isr() interrupt 4
{
if(RI)//接收
{
RI=0;
dat=SBUF;
flag=1;
}
if(TI)TI=0;
}
main()
{
TMOD=0x20;
TH1=TL1=0xfd;
SCON=0x50;
TR1=1;
EA=1;
ES=1;
flag=0;
while(1)
{
if(flag)
{
SBUF=dat;
flag=0;
}
}
}
⑸ 51單片機串口通信c語言編程
#include <REG52.H>
#define uchar unsigned char
#define uint unsigned int
sbit ring=P3^7;
sbit CASE1=P2^0;
sbit CASE2=P2^1;
sbit CASE3=P2^2;
sbit CASE4=P2^3;
uchar se=0,re=0;
uchar temp=0;
void wait(uint cnt)
{
while(--cnt);
}
//串口發送程序
void send(uchar se)
{
SBUF=se; //發送數據
while(TI == 0);
TI = 0;
}
//串口接收程序
uchar receive(void)
{
re=SBUF; //接收數據
while(RI==0);
RI=0;
return re;
}
//串口初始化
void sinti(void)
{
SCON = 0x50;
TMOD |= 0x20;
TH1 = 0xFD;
TR1 = 1;
EA = 1;
ES = 1;
}
void delay(int cnt)
{
while(--cnt);
}
//主程序
int main (void)
{
int i;
sinti(); //串口初始化程序
ring=1;
while(1)
{
while (1)
{
if(CASE1==0)
{
send('a');
ring=0;
break;
}
if(CASE2==0)
{
send('b');
ring=0;
break;
}
if(CASE3==0)
{
send('c');
ring=0;
break;
}
if(CASE4==0)
{
send('d');
ring=0;
break;
}
}
if(ring==0)
{
wait(60000);
ring=1;
}
for(i=0;i<10000;i++);
}
}
//串口中斷程序
void UART_SER (void) interrupt 4 //串列中斷服務程序
{
if(RI) //判斷是接收中斷產生
{
RI=0; //標志位清零
temp=SBUF;
}
if(TI) //如果是發送標志位,清零
TI=0;
}
⑹ 51單片機,如何從串口1轉換到串口4
可以通過編程 設置,當然先要 硬體連接 正確,串口1 ~ 串口4 使用的IO口是不同的,
這可以查看相關單片機的數據手冊,裡面有 怎樣設置,使用的 IO ,中斷 號,等等信息。
如STC的一款有
( 串口1 P3.0 P3.1 和 P3.6 P3.7 & P1.6 P1.7 可選擇)
( 串口2 P1.0 P1.1 和 P4.6 P4.7 可選擇)
( 串口3 P0.0 P0.1 )
( 串口4 P0.2 P0.3 )
⑺ 51單片機串口通信的問題
比如發送abcdefghi,就回送I get aI get bI get cI get dI get eI get fI get gI get hI get i;
但是結果總是有一部分數據被忽略掉,....
----
每當收到一位元組,就回送七位元組。
時間上,明顯不同。
樓主發送數據,採用了查詢方法。
那麼,在等待發送七位元組結束的期間,顯然會丟失收到的位元組。
採用查詢的方法進行發送,肯定會有遺漏。
發送,也應該用中斷的方法,這才不會影響接收。
⑻ 51單片機 串口程序
void
main()
{
scon
=
0x50;
tmod
=
0x20;
//設置定時器1為工作方式2
th1
=
0xf4;
tl1
=
0xf4;
tr1
=
1;
ea
=
1;
es
=
1;
while(1)
{
if(flag)
{
flag
=
0;
//不關閉串口中斷,要讓它繼續接收
num1++;
//超過255,自動就是0
sbuf
=
num1;
while(!ti);
ti
=
0;
sbuf
=
a;
while(!ti);
ti
=
0;
}
}
}
void
ser()
interrupt
4
{
if
(ri)
{
ri
=
0;
a
=
sbuf;
flag
=
1;
}
}
⑼ 請教51單片機串口使用:
8位你會吧,那時是一位停止位對吧,你現在用普通IO口模擬一個串口,做成一個起始,7個數據,2個停止不就行了嘛。
如果你模擬串口程序不會編,到我的網路間里有常式,是我調試通過的。簡單的改下就可以了。
重點是:如何處理串口參數為7位數據!!!
那麼你的外部設備和單片機通信一定得有個通信協議吧,所以說接收過來的7位數據你知道是什麼吧。因為你是模擬個串口,多少位數據都可以模擬出來啊,波特率不用去管它,波特率你想是多少就可以做到多少。只要人單片機速度夠快。
這次明白了吧?
⑽ 51單片機串口通信
開發板的短路帽,電源帽,換著試一下,也有可能是排線插反了。