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

📄 duoubleserial

📁 atmel公司AT89S52模拟双串口在数据采集上的应用
💻
字号:
#include <reg52.h>
#include <string.h>
#define TIMEzq 28
unsigned char inbuf1[12];
unsigned char count1=0;
bit           read_flag=0;

sfr WDT=0xA6;
sbit CMP_DATA=P1^7;
bdata char DATA;
sbit mb0=DATA^0;
sbit mb1=DATA^1;
sbit mb2=DATA^2;
sbit mb3=DATA^3;
sbit mb4=DATA^4;
sbit mb5=DATA^5;
sbit mb6=DATA^6;
sbit mb7=DATA^7;
 
void init_wdt(void)
{
  WDT=0x1E;
  WDT=0xE1;
}

void reset_wdt(void)
{
   
  WDT=0x1E;
  WDT=0xE1;
} 
void init_serialcomm(void)
{
    SCON  = 0x50;       //SCON: serail mode 1, 8-bit UART, enable ucvr 
    TMOD |= 0x20;       //TMOD: timer 1, mode 2, 8-bit reload 
    PCON |= 0x80;       //SMOD=1; 
    TH1   = 0xfa;       //Baud:9600  fosc=11.0592MHz 
    IE   |= 0x90;       //Enable Serial Interrupt 
    TR1   = 1;          // timer 1 run 
   // TI=1; 
}

//向串口发送一个字符 
void send_char_com(unsigned char ch)  
{
    SBUF=ch;
    while(TI==0);
    TI=0;
}

/*
//向串口发送一个字符串,strlen为该字符串
void send_string_com(unsigned char *str,unsigned char *nLen)
{
    unsigned char k=0;
    while(k < *nLen) 
    {
	    reset_wdt();//WDT
        send_char_com(*(str+k));
		k++;
    }
}
*/

//串口接收中断函数 
void serial () interrupt 4 using 3 
{
    if(RI)
    {
        unsigned char ch;
        RI = 0;
        ch=SBUF;
        
        
        inbuf1[count1]=ch;
        count1++;
        if((ch=='\n') || (count1 > 8))
		{
             read_flag=1;  //if recieve data is CR, set the flag;
             count1 = 0;              
        }
		if(ch=='$')
		{
			count1 = 0; 
		}
     }
}

void TIME(void)
{
 unsigned char i;
 for(i=0;i<TIMEzq;i++);
}

void TMElB()
{
 unsigned char i;
 for(i=0;i<(TIMEzq/2);i++);
}

unsigned char RByte(void)
{
  while(1)
 {
  reset_wdt();//WDT
  if(CMP_DATA==0) break;
 }
 TMElB();
 TIME();
 mb0=CMP_DATA;
 TIME();
 mb1=CMP_DATA;
 TIME();
 mb2=CMP_DATA;
 TIME();
 mb3=CMP_DATA;
 TIME();
 mb4=CMP_DATA;
 TIME();
 mb5=CMP_DATA;
 TIME();
 mb6=CMP_DATA;
 TIME();
 mb7=CMP_DATA;
 TIME();
 return DATA;
}

main()
{
   //unsigned char gch0=15, gch1=15, gch2=15, gch3=15, gch4=15, gch5=15, gch6=15, gch7=15, gch8=15, gch9=15;
   unsigned char count=0;
   unsigned char nuLen=0;
   unsigned char strTemp;
   unsigned char inbuf[8];
   unsigned char strInfo[80];
   init_serialcomm();
   CMP_DATA=1;
   init_wdt();
   while(1)
    {  
	  reset_wdt();//WDT
	  //strcpy(&strInfo[0], "$TNCA,1,8:0:0,0:0:0,0:0:0,1,0,");
	  strcpy(&strInfo[0], "$TTCA,1,212737,1,0,");
	  reset_wdt();//WDT
	  nuLen = strlen(strInfo) + 3;
	  count=0;   
	  reset_wdt();//WDT
	  while(1)
	  {
	    reset_wdt();//WDT
	    if(RByte() == '$') break;
	  }
	  while(count < 40)
	  {
	   	reset_wdt();//WDT
	    strInfo[nuLen+count]=RByte();
		reset_wdt();
		if(strInfo[nuLen+count] == 0X0D) break;
		count++;			
	  }
	  nuLen=nuLen-3;
	  if(count > 9)
	  { 
	    reset_wdt();//WDT
	    strTemp = ((count/10) % 10) + 0X30;
		strInfo[nuLen] = strTemp;
		nuLen++;
	  }
	  reset_wdt();//WDT
	  strTemp = (count % 10) + 0X30;
	  strInfo[nuLen] = strTemp;
	  nuLen++;
	  reset_wdt();//WDT
	  strInfo[nuLen] = ',';
	  nuLen++;
	  reset_wdt();//WDT
	  if(count < 10)
	  { 
	    reset_wdt();//WDT
	  	memcpy(&strInfo[nuLen], &strInfo[nuLen+1], count * sizeof(unsigned char));
	  }
	  nuLen += count;
	  strInfo[nuLen] = ',';
	  nuLen++;
	  strTemp = 0;
	  reset_wdt();//WDT
	  for(count=0;count<nuLen;count++)
	  {
	    reset_wdt();//WDT
	    strTemp ^= strInfo[count];
	  }
	  reset_wdt();//WDT
	  strInfo[nuLen] = strTemp;
	  nuLen++;
	  strInfo[nuLen] = 0X0D;
	  nuLen++;
	  strInfo[nuLen] = 0X0A;
	  nuLen++;
	  count=0;
	  reset_wdt();//WDT
	  while(count<nuLen)
	  {
	    reset_wdt();//WDT
	    send_char_com(strInfo[count++]);
	  }
	  //send_string_com(strInfo, &nuLen);
	  count=0;
	  strTemp = 0;
	  reset_wdt();//WDT
	  while(1)
 	  {
	    reset_wdt();//WDT
		if(read_flag)
		{
		  memcpy(inbuf, inbuf1, 6);
		  reset_wdt();//WDT
		  if(strcmp(inbuf, "CASS,1") == 0)
		  {
		    reset_wdt();//WDT
			break;
		  }
		  else if(strcmp(inbuf, "CASS,0") == 0)
		  { 
		    reset_wdt();//WDT
			for(count=0;count<nuLen;count++)
			{ 
			  reset_wdt();//WDT
			  send_char_com(strInfo[count]);
			}
			//send_string_com(strInfo, &nuLen);
			break;
		  }
		  read_flag = 0;
		  reset_wdt();//WDT
		}
		strTemp++;
		reset_wdt();//WDT
		if(strTemp > 0xFA)
		{
		  reset_wdt();//WDT
		  strTemp=0;
		  count++;
		  if(count > 0xFA)
		  {
		    reset_wdt();//WDT
			for(count=0;count<nuLen;count++)
			{ 
			  reset_wdt();//WDT
			  send_char_com(strInfo[count]);
			}	
		    break;
		  }
		}
       
	  }
	   //Data_Process(outbuf0,inbuf0,nuLen);
	   //count0 = strlen(outbuf0);
	   //send_string_com(strInfo,nuLen);
    }	

⌨️ 快捷键说明

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