仿真原理图如下(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)
|