大學畢業後從事了PLC電氣程式設計工作,但一直熱愛單片機,一直在自學,今天終于對序列槽通訊有了一個簡單的了解,寫篇文章紀念一下,同時也感謝CSDN一直這一來的幫助。
執行個體一,通過單片機A向單片機B發送0-3數字,雙機均循環顯示輸出到P2口的7段數位管上。
電路圖

A機程式
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
char code map[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
main()
{
uchar i;
uint j,k;
TMOD=0x20; //設定定時器1工作在模式2
TL1=0xfd;
TH1=0xfd; //根據傳輸的波特率設定定時器1初值9600
PCON=0x00; //不加倍
SCON=0x50; //選擇工作方式1,使能收發功能
TR1=1; //啟動定時器1
while(1)
{
for(i=0;i<4;i++)
{
SBUF=map[i]; //發送資料
while(TI==0);
TI=0; //将标志位TI清0
P2=map[i]; //将發送數取反
for(j=0;j<12500;j++)
{for(k=0;k<10;k++);
}
}
}
}
B機程式
#include<reg52.h>
unsigned char buf;
void main(void)
{
SCON=0x50; //SM0 SM1 SM2 REN TB8 RB8 TI RI 2#0101 0000 序列槽工作方式1(10位異步通訊);允許接收控制位1,允許接收。
PCON=0x00; //SMOD - - - GF1 GF0 PD TDL SMOD為波特率選擇位,=0,不加倍;=1,加倍;
TMOD=0x20; //定時器1 工作方式2:8位自動重裝
EA=1;
ES=1;
TL1=0xfd; //19200 0xfd*2 ;9600 0xfd;4800 0xfa; 2400 0xf4; 1200 0xe8;
TH1=0xfd;
TR1=1;
while(1);
}
//序列槽受收到資料,觸發中斷
void service() interrupt 4
{
ES=0; //關閉序列槽中斷
RI=0; //清零标志位,硬體置1;軟體清0
buf=SBUF;
P2=buf;
ES=1; //開序列槽中斷
}
測試結果