//例子
#include "reg51.h"
#include "intrins.h"
#define u8 unsigned int
#define u16 unsigned char
#define FOSC 11059200L //系统频率
#define BAUD 2400 //串口波特率 2400
#define RATE 9600 //串口波特率 9600
unsigned char SenData,Flag=0;
sfr AUXR = 0x8e; //辅助寄存器
sfr T2H = 0xd6; //定时器2高8位
sfr T2L = 0xd7; //定时器2低8位
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit LED1=P1^4;
sbit LED2=P1^5;
bit flag1=0,flag2=0;
unsigned char a=0,b,dat0,dat1,dat7,dat8,tab[2]={0,0},i=0,j;
unsigned char number=0; //定义一个数组
void Delay3ms();
//void baudrate();
void main()
{
SCON = 0x50; //8位可变波特率
// SCON = 0xda; //9位可变波特率,校验位初始为1 ///两个都注释掉为什么就接收不到了??
// SCON = 0xd2; //9位可变波特率,校验位初始为0 ///两个都注释掉为什么就接受不到了??
// TMOD|= 0x20; //定时器工作方式2
PCON|= 0x00;
T2L = (65536 - (FOSC/4/BAUD)); //设置波特率重装值
T2H = (65536 - (FOSC/4/BAUD))>>8;
AUXR = 0x14; //T2为1T模式, 并启动定时器2
AUXR |= 0x01; //选择定时器2为串口1的波特率发生器
ES = 1; //使能串口1中断
EA = 1;
Flag=0;
while(1)
{
LED1=LED2=0;
if (Flag==1)//接收到一帧数据
{
EA=0;
i=0;
if((tab[1]==0xFC)&&(tab[0]!=0)) //判断接收数据的第一个值。
{
dat0=tab[0]; //把接收的第一个数付给一个变量进行判断,tab[0]的0表示的是一个数组中的第一个值,也可对第一个数直接进行判断
dat1=tab[1]; //串口115200发送的一个变量
}
else
{
ES=1; //记得开串口中断,
Flag=0;
tab[0]=0;
tab[1]=0;
}
if(dat1==0xFC)
{
Delay3ms();
k1=k2=k3=k4=1;
}
}
EA=1;
Flag=0;
if(k1==0)
{
Delay3ms();
if(k1==0)
{
SBUF=0x14;
while(TI==0);
TI=0;
SBUF=1;
while(TI==0);
TI=0;
}
}
if(k2==0)
{
Delay3ms();
if(k2==0)
{
SBUF=0x14;
while(TI==0);
TI=0;
SBUF=3;
while(TI==0);
TI=0;
}
}
if(k3==0)
{
LED1=1;
Delay3ms();
if(k3==0)
{
SBUF=0x14;
while(TI==0);
TI=0;
SBUF=2;
while(TI==0);
TI=0;
}
}
}
}
void Delay3ms(void) //误差 0us
{
unsigned char a,b;
for(b=111;b>0;b--)
for(a=12;a>0;a--);
}
/*----------------------------
UART 中断服务程序
-----------------------------*/
void Uart() interrupt 4 using 1
{
//unsigned char ReData;
if(RI) //RI接受中断标志
{
RI = 0; //清除RI接受中断标志
// dat1=SBUF;
if(Flag!=1)
{
tab[i] = SBUF; //SUBF接受/发送缓冲器
i++;
if(i>=2)
{
i=0;
Flag=1;
}
}
}
}
|