左邊的單片機的程序是這樣的:
#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端口值為收到的數據
}
}
} |