|
#include <reg52.h>
#define uchar unsigned char //用uchar代替unsigned char
#define uint unsigned int //用unitdaiti unsigned int
sbit P20=P2^0; //LED输出管脚
uchar Receive_Data[6],cNumber=0,cFlag=0; //串口接收数据存放
uchar zhentouxulie;
uchar send0;
uchar send1;
uchar position;
uchar yiwei;
uchar biaozhi;
bit zhentou;
bit shuchu;
uchar PPM[41]; //存放一帧的高低电平信息 6个时隙的帧头+32个时隙的信息
uchar wz;
uint bit1;
uint bit0; //位置控制位
void DelayMs(unsigned int Delay_MS)
{
uint iNumber,iValue;
for(iNumber=0;iNumber<Delay_MS;iNumber++)
{
iValue=107;
while(iValue--);
}
}
void Init_UART() //串口初始化
{
SCON=0x50; //SCON:串行口工作方式1, 8-bit UART,允许串行接收位(REN=1)
TMOD=0x21; //TMOD:定时器1,方式2,8位自动重装方式
PCON=0x80; //SMOD=1;(将串口传送的波特率加倍)
TH1=0xfA; //Baud:9600 fosc=11.0592MHz
TL1=0xfA;
TH0=(65536-500)/256;//赋初值定时
TL0=(65536-500)%256;//定时500us
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
TR1=1; //启动定时器/计数器1运行
ES=1; //开串口中断
EA=1; //开总中断
P20=0;
send0=0;
send1=0;
}
void tiaozhi()
{
if((send0==1)&&(send1==1))
{
if(wz<40)
{
if((wz==0)||(wz==7))
{
PPM[wz]=0;
wz++;
}
else if((wz>0)&&(wz<7))
{
PPM[wz]=1;
wz++;
}
else if((wz>7)&&(wz<24)) //开始跳入数据发送
{
if(Receive_Data[0]&0x01) //1发送
{
PPM[wz]=1;
PPM[wz+1]=0;
}
else //0发送
{
PPM[wz]=0;
PPM[wz+1]=1;
}
wz=wz+2;
Receive_Data[0]=Receive_Data[1]>>1;
}
else if((wz>23)&&(wz<40)) //开始跳入数据发送
{
if(Receive_Data[1]&0x01) //1发送
{
PPM[wz]=1;
PPM[wz+1]=0;
}
else //0发送
{
PPM[wz]=0;
PPM[wz+1]=1;
}
wz=wz+2;
Receive_Data[1]=Receive_Data[1]>>1;
}
}
else if(wz==40)
{
PPM[40]=0;//输出一个保护电平时隙
wz=0;
send0=0;
send1=1;
position=0;
}
}
}
void main()
{
DelayMs(50); //稳定系统
Init_UART(); //初始化串口
while(1)
{
tiaozhi();
if((send0==0)&&(send1==0))
{
send0=1;
send1=1;
Receive_Data[1]=0xff;
Receive_Data[0]=0x00;
wz=0;//编码位置
DelayMs(1000);
}
}
}
void timer0() interrupt 1
{
TR0=0;//赋初值时,关闭定时器
TH0=(65536-500)/256;//赋初值定时 高八位
TL0=(65536-500)%256;//定时500us 低八位
TR0=1;//打开定时器
if((send1==1)&&(send0==0)) //编码完成
{
if(position<41)
{
if(PPM[position]==1)
{
P20=0;
}
else
{
P20=1;
}
}
else
{
send1=0;//发送完成
send0=0;
}
position++;
}
else
P20=0;//其余点亮灯
}
void UART_Routine() interrupt 4
{
if(RI==1)//RI为接受中断标志,可能是发送产生的中断
{
ES=0; //关串口中断
Receive_Data[cNumber++]=SBUF;//将接受数据放入预置数组
if(cNumber==2)
{
send0=1;
send1=1;
cNumber=0;
wz=0;//编码位置
}
RI=0;//接受中断标志软件清零
ES=1; //开串口中断
}
} |
|