1、在发送端proteus图纸中, 按下按键K1和K2,可以改变要发送的数据num(数值范围0~9),按下K3通过串口发送num数据到接收端。
接收端能够接受数据,并在数码管上显示接受的数字。
2、接收端也可以进行数据的发送,也可以发送数据到发送端,同时发送端也能显示接收到的数据。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
keil程序编写:
/*
串口发送与接受一体的控制代码
*/
#include <REGX51.H>
#include <intrins.h>
//共阳0-F dp-a
unsigned char code tab[16]=
{0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
#define uchar unsigned char
sbit K1=P1^0;//ADD 递增
sbit K2=P1^1;//DEC 递减
sbit K3=P1^2;//DEC 递减
void UartInit(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
TMOD = 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES=1;//开串口中断
EA=1;//开总中断
}
char putchar (uchar ch)//向串口发送数据
{
SBUF=ch;
while(!TI);//查询发生是否完毕
TI=0;//发送完毕,TI由软件清零
return ch;
}
/********************************************************
函数功能: 延时c ms
参 数: c
返回 值: 无
*********************************************************/
void delayms( unsigned int ms) //@11.0592MHz
{
unsigned char i, j;
for(;ms>0;ms--)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
uchar Receive_nums=0;//接收到的 字符
void Uart1() interrupt 4
{
if (RI)
{
RI=0; //清除RI位
Receive_nums=SBUF;
}
}
void main(void)
{
uchar Transmit_nums=0;//发送给乙机的数字
UartInit();
while(1)
{
P0=~tab[Receive_nums];//在数码管上显示数字
if(K1==0)//递增按键
{
delayms(10);//消抖
if(K1==0)
{
Transmit_nums++;
if(Transmit_nums>9)
Transmit_nums=9;
}
while(K1==0);//等待按键K1松开
}
if(K2==0)//递减按键
{
delayms(10);//消抖
if(K2==0)
{
Transmit_nums--;
if(Transmit_nums<1)
Transmit_nums=0;
}
while(K2==0);//等待按键K2松开
}
if(K3==0)//发送按键
{
delayms(10);//消抖
if(K3==0)
{
putchar(Transmit_nums);
}
while(K3==0);//等待按键K3松开
}
}
}
需要先从百度下载 VSPD虚拟串口调试软件
Keil代码与Proteus7.5仿真dsn文件下载:
双机通信dsn文件.7z
(32.58 KB, 下载次数: 19)
|