www.pudn.com > PC-COM.rar > withPC.c


 
//   AJ5800通讯程序,请陈峰改造后切入原AJ5808调试 
//单片机采用的主频为12MHz,BAUDRATE发生器采用T2的重装方式 
//串口中断采用方式1工作,即:一位START,8位数据位DATA,TB8、RB8都不用,一位STOP 
//Initial_UART:                       ;初始化串口 
//;       Bit:   7       6     5     4     3     2     1    0  
//; SCON       SM0/FE   SM1   SM2   REN   TB8   RB8    Tl   Rl  
//#pragma SRC 
//#include  
 
//#include  
#include  
 
#define		TRUE			1 
#define		FALSE			0 
#define 	MACHINECOMM_OK 	 0x11   
//以上语句定义主机通讯传送握手信号 
#define 	MACHINECOMM_RET 0x87     
//以上语句定义从机回复通讯握手信号 
#define MACHINECOMM_DATAHEAD    0xaa  
//以上语句定义数据包的头 
#define MACHINECOMM_SENDRECORD  0xb1 
//定义发送数据的命令 
#define MACHINECOMM_DATAEND 	0xab  
//以上语句定义数据包的尾 
 
#define		DELAY_VALUE	3 
#define     length 3        //数据长度,根据传送的记录修改 
 
bit EvRcv=FALSE;			//是否收到串行数据的标志位 
bit flag = 0;               // 
unsigned char rcvdata=0;		//从串口存储接收的变量 
void send_char(unsigned char word);  //发送单字节子程序 
void send(char *temp,int j);		//发送子程序 
void initial(void);     		//初始化子程序 
void delay(short i);			//延时子程序 
//unsigned char checksum; 
unsigned char xdata count=0,datahand; 
unsigned char xdata datacomm[3],datarecv[3]; 
 
 
 
void main(void) 
{   //datahand=MACHINECOMM_SENDRECORD; 
	datacomm[0]=MACHINECOMM_DATAHEAD; 
	datacomm[1]=MACHINECOMM_SENDRECORD; 
	datacomm[2]=MACHINECOMM_DATAEND; 
	initial(); 
    count=0; 
    flag=0; 
	while(1) 
	{    
	      if (flag!=0)                 							//如果取数标志已置位,就将读到的数从串口发出 
            { 
            flag= 0;                      						//取数标志清0 
            if(datarecv[0]==MACHINECOMM_DATAHEAD&&datarecv[length-1]==MACHINECOMM_DATAEND) 
				{		 
				 		send_char(datarecv[1]);		//如果数据包正确,则返回一个数据包 
    	      		    count=0; 
			 								//如果已经收到六个数据,则认为是收到一个数据包 
						send_char(datarecv[0]);     //此处插入实际发送程序即可,循环发送即可 
						send_char(datarecv[2]);	 
	 	     	}		  	 
            } 
 
		  if(EvRcv)             								//如果接收到主机端发送过来的握手信号 
				{ 
					if(rcvdata==MACHINECOMM_OK) 
					{  delay(DELAY_VALUE); 
					   EvRcv=FALSE; 
					  // send_char(rcvdata);						//返回一个握手信号	 
					}  
	            }  		      
	}					 
} 
 
 
void initial()		//初始化子程序 
{ 
	IP=0x10;              //定义串口为高优先级中断,依次为T0、T1,这里将PS作为高优先级IP:- - PT2 PS PT1 PX1 PT0 PX0 
	IE=0x9A;              //允许串口、中断T0、T1,作为BAUDRATE发生器应用时,定时器中断应该被禁止IE:EA - ET2 ES ET1 EX1 ET0 EX0 
	TCON=0x05;            //开启T0、T1     
//	TMOD=0x10;            //运用原来的程序设置:GATE C/T M1 M0 GATE C/T M1 M0 
//  T2MOD=0x;             // T2MOD  - - - - - - T2OE DCEN 
	PCON=0;               //SMOD(PCON.7)=1时,波特率翻倍.现在不翻 
						//电源控制寄存器不可位寻址 
                         //SMOD - - - GF1 GF0 PDWN IDLE 
	SCON=0x50;            //串行口工作方式1 : 8位UART, 波特率可变,N0-P 
	RCAP2H=0xff;          //RCAP2H=(65536-CPU_XTAL/32/baudrate) /256; 
    TH2=0xff; 
	RCAP2L=0xd9;             //RCAP2L=(65536-CPU_XTAL/32/baudrate) %256; 
    TL2=0xd9; 
    T2CON=0x34;              //使用 T2 作波特率发生器 T2CON:TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 CP/RL2 
    ES=1;                     //   ;允许串口中断 
    EA=1;                     //   ;开总中断 
} 
 
 
void send_char(unsigned char  word)   //送单个字符的程序 
{  
TI=0; 
SBUF=word; 
while(TI==0); 
TI=0; 
} 
 
 
/*void send(unsigned char  *temp, int j)    //查询发送 
{ 
	int i=0; 
	EA=0; 
	for(i=0;i<=j-1;i++)	//按发送数据的长度来发送数据 
	{ 
		ACC=*(temp+i); 
                                  	//	TB8=P; 
		SBUF=ACC;	//发送数据 
		while(TI==0);	//发送数据完毕时,TI会自动置高 
		TI=0;		//发送数据完毕,将TI清零,准备下一次发送 
	} 
	EA=1; 
} 
*/ 
 
 
 
void Rcv_INT(void) interrupt 4  using 3    //中断接受,串口中断优先级为1 
{ 
	if(RI)		//如果收到数据则进行下面的操作 
	     { 
		   	ACC=SBUF;;				//将串行通信的缓存中的数据存入寄存器A 
   			rcvdata=ACC;    		//将寄存器A中的数据存入变量rcvdata 
			EvRcv=TRUE;				//将已经接收到数据的标志位置高 
			datarecv[count]=rcvdata; 
			count++; 
          if (count ==length)   
		        { 
		          count= 0; 
                  flag= 1;           //如果串口接收的数据达到length个,就置位取数标志 
                }    
  		  } 
	 RI=0; 
} 
 
//延时子程序 
void delay(int i) 
{ 
	int j=0; 
	i=i*DELAY_VALUE; 
	while (j