仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
設計要求:
①可實現兩個單片機之間的串行通訊。(表現形式自擬)
②通過按鍵來控制單片機的發送和接收。
操作步驟:
按下A機的發送鍵(一直按著),A機開始發送數據到B機,按下B機的接收鍵(一直按著),B機開始接收數據并顯示在數碼管。
按下B機的發送鍵(一直按著),B機開始發送數據到A機,按下A機的接收鍵(一直按著),A機開始接收數據并顯示在LED燈。
電路原理圖如下:
電路圖
程序如下:
A機程序:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0x88}; //設置發送的數字
uint a ;
uchar state;
sbit fasong=P2^0; //設置發送鍵
sbit jieshou=P2^1; //設置接收鍵
void delay () //延時程序
{
uint i,j;
for (i=0;i<300;i++)
for (j=0;j<200;j++);
}
void chushihua1(void ) //發送初始化程序
{
SCON=0x50; //串行控制寄存器01010000,工作方式1,允許接收
TMOD=0x20; //工作方式控制寄存器00100000,定時器1,工作方式2
TH1=0xfd;
TL1=0xfd; //設置波特率9600
TI=0; //發送中斷標識位,=1表示發送結束
TR1=1; //打開定時器T1
}
void chushihua2() //接收初始化程序
{
SCON=0x50; //串行控制寄存器01010000,工作方式1,允許接收
PCON=0x00;
TMOD=0x20; //工作方式控制寄存器00100000,定時器1,工作方式2
TH1=0xfd; //設置波特率9600
TCON=0x40; //定時控制寄存器
}
void main (void ) //主函數
{
while (1)
{
if (fasong==0) //發送鍵按下
{
chushihua1();
for (a=0;a<10;a++)
{
SBUF=table[a];
delay ();
}
}
if (jieshou==0) //接收鍵按下
{
chushihua2 ();
state=SBUF;
P0=state;
}
}
}
B機程序
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar state;
sbit jieshou=P2^0;
sbit fasong=P2^1;
void chushihua1() //接收初始化程序
{
SCON=0x50; //串行控制寄存器01010000,工作方式1,允許接收
PCON=0x00; //電源控制寄存器
TMOD=0x20; //工作方式控制寄存器00100000,定時器1,工作方式2
TH1=0xfd; //設置波特率9600
TCON=0x40;
}
void chushihua2(void ) //發送初始化程序
{
SCON=0x50; //串行控制寄存器01010000,工作方式1,允許接收
TMOD=0x20; //工作方式控制寄存器00100000,定時器1,工作方式2
TH1=0xfd;
TL1=0xfd; //設置波特率9600
更多程序下載附件。。
單片機串行通訊.rar
(71.65 KB, 下載次數: 24)
2019-3-14 16:18 上傳
點擊文件名下載附件
源程序
|