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