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

📄 uart0.c

📁 自己写的单片机串并口通讯程序
💻 C
字号:
#include "..\inc\44b.h"
#include "..\inc\function.h"
#include "..\inc\Globalv.h"
#include "..\inc\extvar.h"
#include "..\inc\macrofun.h"
#include "..\inc\quanju.h"



//**********UART0初始化*******************///
void uart_init(void)
{  
    rULCON0 = 0x03;   // 8位数据位,一位停止位,无奇偶校验
    rUCON0 = 0x385;    // 中断模式接受、发送,缓冲区空时立即引发中断
    rUFCON0 = 0x47;  //FIFO 模式,触发水平为4字节
    rUMCON0 = 0x00;   //禁止AFC模式
    rUBRDIV0 = 0x185; //波特率9600,MCLK=60M赫兹
}


//**************串口接收数据中断************************//
__irq void uart_recvdata(void)
{   

    int i,fifo_count;
    outl(BIT_URXD0,rI_ISPC); 
    fifo_count = (rUFSTAT0 & 0x0f);   
    for(i=0;i<fifo_count;i++)
    {
      *inbuff_write = rURXH0;
      inbuff_write++;
    }
     
	 if(inbuff_write == inbuff_fulladdress)
	 {
		 inbuff_full = TRUE;
	     rPDATG |= 0x02;        //禁止串口接收
	 }
	 if(inbuff_write == inbuff_end+1) inbuff_write = inbuff_start;
	 if(inbuff_write == inbuff_fulladdress)
	 {
		 inbuff_full = TRUE;
		 rPDATG |= 0x02;        //禁止串口接收
	 }
}



 //**************并口接收数据中断**************************//
 __irq void parallel(void)
 {  
    outl(BIT_EINT0,rI_ISPC);
	if(!inbuff_full)
	{
      *inbuff_write = *PIOData_addr;
	  inbuff_write++;
	  if(inbuff_write == inbuff_fulladdress)
	  {
		inbuff_full = TRUE;
	  }
	  if(inbuff_write == inbuff_end+1) inbuff_write = inbuff_start;
  	  if(inbuff_write == inbuff_fulladdress)
	  {
		inbuff_full = TRUE;
	  }
	  HVPI0DATA = FALSE;
	}
     HVPI0DATA = TRUE;
 }

//**************获取接口类型******************// 
 BOOL Getintface_type(void)
 {
    BOOL intface;
    if((rPDATG & 0xe0) == 0x80)
    {
       intface=FALSE;
    }
    else{intface=TRUE;}
    return intface;
 }
 
 
 //***************从接收缓冲区读数据*************//
 BYTE receive(void)
 {
    BYTE temp;
    while(inbuff_write == inbuff_read);
    temp = *inbuff_read++;
    inbuff_fulladdress++;
	if(Getintface_type())
	{
       if(inbuff_read == (inbuff_end+1)) inbuff_read = inbuff_start;
	   if(inbuff_fulladdress == inbuff_end+1) inbuff_fulladdress = inbuff_start;
	   if(HVPI0DATA) Enablepportint();
	}
	else
	{
	   if(inbuff_read == (inbuff_end+1)) inbuff_read = inbuff_start;
	   if(inbuff_fulladdress == inbuff_end+1) inbuff_fulladdress = inbuff_start;
	   if(!inbuff_full)
	   {
		    rPDATG &= ~(0x02);        //RTS 置高,通知PC停止传送

	   }
       
	}
	return temp;
 }
 //*************************************************************************//
 void Command0a(void)
{
    
	//	 MOTORDRIVE();
	Checkpaperstate();
}
//**************************************************************************//
 void MOTORDRIVE(void)
{ 
    int i, str;  
    int string[8]={0x24,0x16,0x04,0x09,0x00,0x12,0x20,0x29};
    //int string[8]={0x24, 0x1c, 0x04, 0x03, 0x00, 0x18, 0x20, 0x23};
    for(i=0;i<8;i++)
    {
       i=phase;
       str=string[phase];
      rPDATD=0x3f&str;
      phase++;
      if(phase == 7)
      {
         phase=0;
      }
 }
}
//**************************************************************************//
 void ESCcommand(void)
 {    
	  BYTE sendbackstring[8] = {'s','u','c','c','e','s','s','!'};
	  BYTE temp;
	  temp=receive();
	  if(temp==0x4c)
	  {
		  temp=receive();
		  if(temp==0x0c)
		  {
               rPDATG |=0x100;
			   for(temp=0;temp<8;temp++)
			   {
				   *outbuff_write++=sendbackstring[temp];
				   if(outbuff_write==outbuff_end+1) outbuff_write = outbuff_start;
			   }
			   sendbytestopc();
		  }
	  }
	  else
	  {
		  return;
	  }
 }
 //******************************************************************************//
void sendbytestopc(void)
{
      if(!Getintface_type())
	  {  
	  	do
	     {
		   rUTXH0 = *outbuff_read++;
		   if(outbuff_read==outbuff_end+1) outbuff_read = outbuff_start;
		 }
		  while(outbuff_write != outbuff_read);
	  }
}
//********************AD检测**************************//
BYTE GetADValue(void)
{
   BYTE temp_ad;
   SelectAdChanelAndStart(AD_PAPER);
   temp_ad = (BYTE)(rADCDAT >>2);
   return temp_ad; 
}
//*******************************************//
void Checkpaperstate(void)
{
    BYTE paper_ad,i;
    paper_ad=GetADValue();
    paper_ad=255-paper_ad;
    if(paper_ad>=Paperend_AD)
   {
       for(i=0;i<12;i++)
       {
          *outbuff_write++=sendpaperstate[i];
          if(outbuff_write==outbuff_end+1) outbuff_write = outbuff_start;
       }
       sendbytestopc();
   }
   else
   {
       for(i=0;i<10;i++)
       {
          *outbuff_write++=sendpaperend[i];
          if(outbuff_write==outbuff_end+1) outbuff_write = outbuff_start;
       }
       sendbytestopc();
   }
}

void SelectAdChanelAndStart(BYTE AdNo)
{   
    int j;
	if(AdNo>7) return;
    rADCCON=0x0|(AdNo<<2);
	for(j=0;j<1000;j++);
	rADCCON=0x1|(AdNo<<2); 
}

  

⌨️ 快捷键说明

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