|
給你寫個(gè)示例程序,是在你的程序基礎(chǔ)上改的,你試試。
#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位數(shù)據(jù),可變波特率
AUXR &= 0xBF; //定時(shí)器1時(shí)鐘為Fosc/12,即12T
AUXR &= 0xFE; //串口1選擇定時(shí)器1為波特率發(fā)生器
TMOD &= 0x0F; //清除定時(shí)器1模式位
TMOD |= 0x20; //設(shè)定定時(shí)器1為8位自動重裝方式
TL1 = 0xFD; //設(shè)定定時(shí)初值
TH1 = 0xFD; //設(shè)定定時(shí)器重裝值
ET1 = 0; //禁止定時(shí)器1中斷
TR1 = 1; //啟動定時(shí)器1
EA=1; //開總中斷
ES=1; //開串口中斷
}
/**********串口發(fā)送函數(shù)*************/
void SendOneByte(unsigned char c)
{
SBUF = c; //發(fā)送數(shù)據(jù)
while(!TI); //等待發(fā)送完成
TI = 0; //發(fā)送中斷請求標(biāo)志位清0
}
/*-------------------------------
1ms延時(shí)子程序(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; //關(guān)串口中斷
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時(shí)執(zhí)行串口中斷
{
static unsigned char count=0;
unsigned char i;
RI=0;
rbuf[count]=SBUF; //保存數(shù)據(jù)
if(rbuf[0]==0x7E) //驗(yàn)證數(shù)據(jù)頭(起始位)
{
count++;
if(count>=15)
{
count=0; //計(jì)數(shù)變量清0
if(rbuf[14]==0x7E)//驗(yàn)證數(shù)據(jù)尾
uart1_flag=1; //接收完成標(biāo)志置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
|
|