给你写个示例程序,是在你的程序基础上改的,你试试。
#include <STC12C5A60S2.H>
sbit jdq1=P0^0;
sbit jdq2=P0^1;
bit flag=0;
bit uart1_flag=0;
unsigned char rbuf[15];
unsigned char code rbuf1[]={0x7E,0x80,0x00,0x01,0x00,0x00,0x80,0xAA,0x00,0x01,0x01,0x00,0xDE,0x62,0x7E};
/*************初始化串口**************/
void InitUart() //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA=1; //开总中断
ES=1; //开串口中断
}
/**********串口发送函数*************/
void SendOneByte(unsigned char c)
{
SBUF = c; //发送数据
while(!TI); //等待发送完成
TI = 0; //发送中断请求标志位清0
}
/*-------------------------------
1ms延时子程序(11.0592MHz 1T)
-------------------------------*/
void mDelay(unsigned int k)
{
unsigned int i,j;
for(i=k;i>0;i--)
for(j=1150;j>0;j--);
}
void main()
{
unsigned char i;
jdq1=0;
jdq2=0;
InitUart(); //初始化串口
while(1)
{
if(uart1_flag==1)
{
uart1_flag=0;
ES=0; //关串口中断
for(i=0;i<15;i++)
{
if(rbuf[i]==rbuf1[i])
{
flag=1;
SendOneByte(rbuf[i]);
}
else
{
flag=0; break;
}
}
ES=1; //开串口中断
if(flag==1)
{
jdq1=1;
mDelay(100);
jdq2=1;
mDelay(800);
jdq1=0;
mDelay(100);
jdq2=0;
}
}
}
}
void uart_js() interrupt 4 //RI==1时执行串口中断
{
static unsigned char count=0;
unsigned char i;
RI=0;
rbuf[count]=SBUF; //保存数据
if(rbuf[0]==0x7E) //验证数据头(起始位)
{
count++;
if(count>=15)
{
count=0; //计数变量清0
if(rbuf[14]==0x7E)//验证数据尾
uart1_flag=1; //接收完成标志置1
else
{
for(i=0;i<15;i++)
rbuf[i]=0x00;//缓存全部清0
}
}
}
}
// 7E 80 00 01 00 00 80 AA 00 01 01 00 DE 62 7E
|