左边的单片机的程序是这样的:
#include<reg51.h>
#define uchar unsigned char
sbit key=P1^0; //定义按键所在端口
uchar a; //定义变量a 存放要发送的数据
void Init_UART() //串口初始化 12T/定时器1作波特率发生器
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1=TH1=xxxx; //设定定时初值 (你自己定义波特率)
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES=1; //开串口中断
}
void delay() //延时程序 自己写 20ms够了
{
//...............
}
void main()
{
Init_UART(); //初始化UART
a=0xfe; //赋值 要发送的数据
while(1) //主循环
{
if(key==0) //如果 按键按下
{
delay(); //防抖
if(key==0) //如果按键依旧按下
{
while(!TI); //等到按键释放才动作
SBUF=a; //给串口缓冲区传送数据
while(!TI); //等待发送标记
}
}
}
}
右边的单片机的程序是这样的:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
uchar b=0; //定义变量b 存放收到的数据
bit flag_uart=0; //定义标记 是否接收到数据
void Init_UART() //串口初始化 12T/定时器1作波特率发生器
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1=TH1=xxxx; //设定定时初值 (你自己定义波特率 和发送的一样)
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES=1; //开串口中断
}
void Server_UART() interrupt 4 //中断4 服务
{
TI=0; //发送标志位 TI置0
if(RI==1) //如果接收位1 有数据接收
{
RI=0; //清除接收标志 硬件可以接收数据
b=SBUF; //从接收缓冲区SBUF读取数据到数据缓冲区RX
flag_uart=1; //接收标记置1 收到数据
}
}
void main()
{
P1=0x00; //显示端口清零
Init_UART(); //串口初始化
while(1) //主循环
{
if(flag_uart==1) //如果 接收标记为1 收到数据
{
flag_uart=0; //接收标记清零 可以再次接收
P1=b; //赋值 P1端口值为收到的数据
}
}
} |