⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 withpc.c

📁 为医疗仪器用的RS232通讯实用程序。经过调试源程序完全正确。
💻 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 <stdio.h>

//#include <REG54.H>
#include <reg52.h>

#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<i)j++;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -