串口中断服务子程序——51系列


/******串口接收中断子程序**************/
void RS() interrupt 4


{

ES = 0;
Tempsd[Sendcount] = SBUF;//@一次串口中断传输一个字节而已
Sendcount++;

if(Sendcount==1)
if(Tempsd[0]=='C') //@Tempsd[0]是接受数据的单?
Select_flag=1;
if(Tempsd[1]=='S')
Sendcount = 0;
if(Sendcount==15) //表示已经接收完命令的前面15个字节//
{
Sendcount = 0;
//Check=(Tempsd[1]^Tempsd[6]^Tempsd[11]^Tempsd[12]);
if(Tempsd[1]!='G'||Tempsd[6]!='G'||Tempsd[11]!='G'||Tempsd[12]!='G')
Control_flag = 1;
}

RI = 0;
ES = 1;
}



相关设置:

RCAP2H=0xFF;
RCAP2L=0xD7; //设置波特率为9600(12.583mhz)
TH2=0xFF;
TL2=0xFB;
TL2=0xD7;
SCON=0x50; //串口工作于方式1,允许接收,并将RI、TI清0
T2CON=0x34; //允许定时器2外部中断,并使用定时器2作为串口的接收、发送时钟
#include
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit duanxuan1=P2^6;
sbit duanxuan2=P2^4;
sbit weixuan1=P2^7;
sbit weixuan2=P2^5;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar soi,adr,cmd,chk;

//#define Wait1us _nop_();_nop_();_nop_();_nop_();
//code unsigned char table[10] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar buffer[4],datain[];
volatile uint count;
uint m,r_e=0;
void delayms(unit);
void TX();
float trans();
float value;
uchar flag,a,b,c,dp,flag_time,t0_num;
void delayms(uint xms)
{ uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}

void init()
{ TMOD=0x21;//定时器1工作方式2
SCON=0x50;//串口工作方式选1,REN=1,允许对串行数据接收;01010000
TR1=1;//启动定时器1
TH1=0xfd;//实现数据传输速率9600bit/s
TL1=0xfd;
TH0=(65536-6000)/256;
TL0=(65536-6000)%256;//定时器0用于计时,每一秒数码管刷新一次
TR0=1;
ET0=1;
ET1=0;//定时器1中断禁止
EA=1;//单片机总中断允许
ES=0;
}
void TX()
{uchar soi,adr,cmd,chk;
ES=0;//串口中断禁止
soi=0xed;
adr=0x03;
cmd=0x03;
chk=0xf3;
SBUF=soi;
while(!TI);
TI=0;
SBUF=adr;
while(!TI);
TI=0;
SBUF=cmd;
while(!TI);
TI=0;
SBUF=chk;
while(!TI);
TI=0;
ES=1;
//REN=1;
//delayms(10000);
}




void main()
{uchar k,cb;
init();
count=0;
while(1)
{ ES=0;
if(flag==1)
{ flag=0;
if(datain[1]==0xed&&datain[2]==0x03)
{
for(k=5;k<9;k++)
buffer[k-5]=datain[k];
}
TX();
trans();
}

display(value);
ES=1;
}

}





void ser()interrupt 4//串口中断服务子程序
{

if(RI)
{

RI=0;
count++;
datain[count]=SBUF;

if(co

unt==10)
{count=0;
flag=1;
}
}



}

void time0() interrupt 1//定时器0的定时中断
{ TH0=(65536-6000)/256;
TL0=(65536-6000)%256;
t0_num++;
if(t0_num==200)
{t0_num=0;
flag_time=1;
}
}

float trans()
{
uchar i, *px;
void *pf;

px=buffer;
pf=&value;
for(i=0;i<4;i++)
{
*((char *)pf+i)=*(px+i);

}
//flag=1;
r_e=1;
return(value);

}

相关文档
最新文档