兩個51單片機,兩機的串口交叉連線,雙機互發(fā)數(shù)據(jù)串口通信是單片機和其它系統(tǒng)交換數(shù)據(jù)的主要形式。
上周有幾位網(wǎng)友問到單片機雙機通信的問題,做而論道為此特意設(shè)計了軟件、硬件,進行了測試。
下列程序,經(jīng)過編譯、硬件仿真調(diào)試成功。
要點如下:
兩個51單片機,兩機的串口交叉連線,雙機互發(fā)數(shù)據(jù);
發(fā)送方大約每隔 1s 發(fā)送一個字節(jié),內(nèi)容遞增(或遞減);
接收方采用兩位數(shù)據(jù)顯示器顯示收到的數(shù)據(jù)。
網(wǎng)友實驗時,顯示函數(shù)應(yīng)該根據(jù)自己的設(shè)備進行改寫。
下面的程序,既包括了發(fā)送功能,也包括了接收功能,也就是說:進行雙機通信實驗時,兩個單片機使用同一個程序就可以。
//=========================================
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar Rbuf = 0;
uchar code dis_7[] = {
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, //共陰段碼
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00};
//段碼表 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, off
//-------------------------------
void delay(uint k)
{
uint i, j;
for(i = 0; i < k; i++) for(j = 0; j < 200; j++);
}
//-------------------------------
void Display(uchar x)
{
P2 = 0xFF;
P0 = dis_7[x / 16]; //輸出高四位
P2 = 0xFE; delay(2);
P2 = 0xFF;
P0 = dis_7[x % 16]; //輸出低四位
P2 = 0xFD; delay(2);
}
//-------------------------------
void UART()interrupt 4
{
if(RI) {
RI = 0; //清除中斷標志
Rbuf = SBUF;
}
if(TI) {
TI = 0; //清除中斷標志
}
}
//-------------------------------
void main()
{
uchar t1, i;
SCON = 0x50; //串口工作在方式1
PCON &= 0x7F; //SMOD=0
TMOD = 0x20; //定時器1當做波特率發(fā)生器
TH1 = 0xFD; //初值, 9600 @ 11.0592MHz
TL1 = 0xFD;
TR1 = 1;
ES = 1;
EA = 1;
while (1) {
for (i = 0; i < 100; i++)//多次循環(huán),便于觀察與發(fā)送
Display(Rbuf); //顯示收到的數(shù)據(jù)
SBUF = t1; //發(fā)送數(shù)據(jù)
P1 = ~t1; //本機顯示
t1++;
// t1--;
}
}
//=========================================
|