#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit F1 = 0xD1;
uchar *p;
uchar length;
uchar a[10]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x00,0xff};
/************延时 ms 级*************/
void DelayMs(uint ms)
{
unsigned int i,j;
for( i = 0; i < ms; i ++ )
for( j = 120; j > 0; j --);
}
void ComOutChar (unsigned char UART_data) //定义串口发送数据变量
{
SBUF = UART_data; //将接收的数据发送回去
while(!TI); //检查发送中断标志位
TI = 0; //令发送中断标志位为0(软件清零)
}
//从串口接收一个字符(非中断方式)
unsigned char ComInChar()
{
unsigned char InData;
while(!RI); //空语句判断字符是否收完
InData = SBUF; //保存COM缓冲字符
RI = 0; //清RI
return (InData); //返回收到的字符
}
void main()
{
SCON = 0xD0; //串口方式3,允许接收
TMOD = 0x20; //定时器1定时方式2
TH1 = 0xFD; //波特率9600(11.0592MHz)
TL1 = 0xFD;
PCON = 0x00; //波特率加倍控制,SMOD位置零,不加倍
RI = 0; //清收发标志
TI = 0;
EA = 1; //允许总中断
ES = 1; //允许UART串口的中断
TR1 = 1; //启动定时器
// F0=1;
// F1=1;
// length=1;
// p=a; //测试程序代码
while(1)
{
}
}
void UARTInterrupt(void) interrupt 4
{
uchar UartData;
uchar temp,i=0;
if(RI) //是否是串口接收中断
{
RI = 0;
UartData=SBUF;
if(UartData==0x01) //是否本机地址
{
ES = 0; //是本机地址 禁止串口中断
SM2 = 0; //清SM2 准备接收命令/数据
ComOutChar(0x01); //发送本机地址,供主机核对
UartData = ComInChar(); //接收主机命令
if(!RB8) //是命令/数据
{
if(UartData==0x00) //命令从机发送
{
if(F0) //发送准备就绪
// if(1)
{
ComOutChar(0x02); //发送TRDY=1
while(length--) //数据是否发送完毕
{
ComOutChar(*p); //发送数据
p++; //修改指针地址
}
}
else //发送未准备就绪
{
ComOutChar(0x00); //发送TRDY=0应答信息
SM2=1; //复位信号,返回
}
}
else if(UartData==0x01) //命令从机接收
{
if(F1) //接收准备就绪
// if(1)
{
ComOutChar(0x01); //发送RRDY=1
while(length--) //数据是否接收完毕
{
*p = ComInChar(); //将收到数据放入指定地址
p++; //修改地址指针
// P1=ComInChar(); //测试程序代码
}
}
else //接收未准备就绪
{
ComOutChar(0x00); //发回RRDY=0应答信息
SM2=1; //复位信号,返回
}
}
else //命令不合法
{
ComOutChar(0x80); //非法命令,发回ERR=1应答信息
SM2=1; //复位信号,返回
}
}
else
SM2=1; //复位信号,返回
ES=1; //允许串口中断
}
}
// else
// TI = 0;
}
评论0