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

📄 uart.c

📁 可以实现多路数据采集和传输系统
💻 C
字号:
    #include <reg51.h>
	#include "MAX485.h"
     uchar temp[8];
    data uchar Tbuffer[TCOUNT];  //定义发送缓冲区
    data uchar Rbuffer[RCOUNT];//定义接受缓冲器
    data unsigned char  Tpointer;          //定义当前位子指针
    data unsigned char  Rpointer;
    data uchar count_10ms; 
    uchar time_over_flag;
	void serial_init(void);
    uchar RS485(){
     
			   receive();
			 	if(Rbuffer[0] == 'A'){
			 	temp[2] = Rbuffer[2];
                return(0);
			   }
			    else {
			    return(-1);}
 		   }

void command(void){
			  Tpointer = 0x00;
               while(Tpointer<TCOUNT) {				/* 发送缓冲区初始化 */
 					Tbuffer[Tpointer] = 'T';
	 				Tpointer++;
     				 }    
 				send();
   }

void send(void){
		RE = 1;
	    Tpointer=0x00;
		EA = 1;
		TI = 1;
        while(Tpointer <= TCOUNT);            /* 等待全部数据帧发送完毕 */  
		RE = 0;
	}

    void receive(void){
		RE = 0;
        Rpointer = 0 ;
		time_over_flag = 0;
		EA = 0;
        ET0=1; //关闭定时器T0中断
        TR0=1; //停止定时器T0
		ES = 1;
		PS = 1;
		EA = 1;
	    while((Rpointer+1 <= RCOUNT)&&!time_over_flag);
	    ET0 = 0;
		TR0 = 0;
		
	}

    /* 发送中断服务函数 */
    void serial (void) interrupt 4 using 3 {
       if (RI){   
	       RI=0;                                     /* 清接收中断标志 */
          Rbuffer[Rpointer++]=SBUF;	               	                       
          if((Rpointer+1 == RCOUNT)&&!time_over_flag)  return;			 /* 如果已接收完全部数据帧, 则此次通信结束, 置SM2=1准备下一次通信 */      
       	}
	  

	   if (TI){
 	      TI=0;						                 /* 清发送中断标志并修改发送缓冲区当前位置指针 */
    	   if(Tpointer == TCOUNT+1) return;	   	      /* 如果全部数据发送完毕则返回, 否则发送一帧数据 */
       		else {
      	   SBUF=Tbuffer[Tpointer++];                 /* 启动发送 */
          }	
       }
	}
timer0_interrupt(void) interrupt 1 using 2
{  
  count_10ms++;
  if(count_10ms==0x30)
  {
  ET0=0; //关闭定时器T0中断
  TR0=0; //停止定时器T0
  time_over_flag=1;//设置接收超时标志
  count_10ms=0x00; //10ms计数器复位
  }
  else
  {
  TL0=0x4C;  //重装定时器初始值
  TH0=0x00;  
  }
}

void serial_init(void){
   /* 初始化串行口和波特率发生器 */
       SCON=0x50;
       TMOD=0x21;
       TH1=0xfd;
       TR1=1;
       ET1=0;
       ES=1;
       PS=1;
 
    /* 发送地址帧 */

}
void timer0_init()
{
time_over_flag=0;
count_10ms=0;
TL0=0x4C;      //T0用于产生10ms的中断
TH0=0x00;     //50次T0中断产生1次超时溢出
ET0=1;        //允许定时器0中断
}

void system_init(void)
{
serial_init();
timer0_init();
EA =1;
} 

⌨️ 快捷键说明

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