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

📄 uart.c

📁 本人用AVR mega32写的一个关于输出32路PWM的程序
💻 C
字号:
#define   EXT_UART_GLOBALS
#include "includes.h" 
/************************************************************
 Function Name:  T2Init
 Function:       Timer0 initial
 Paramenter:     None               
 Return value:   None                     
 Author:         Chen yuan zhen May.30.2008 
*************************************************************/
void UARTClose(void)
{
	UCSRB = 0x00;		/*允许接收和发送*/
}

/************************************************************
 Function Name:  T2Init
 Function:       Timer0 initial
 Paramenter:     None               
 Return value:   None                     
 Author:         Chen yuan zhen May.30.2008 
*************************************************************/
void UARTInitial(void)
{

	UCSRA = 0x02;		/*倍速*/
	UCSRB = 0x98;		/*允许接收和发送*/
	UCSRC = 0x06;		/*8位数据,1位停止位*/
	UBRR  =  103;	    /*9600*/
}


/************************************************************
 Function Name:  SIGNAL(USART_RX_vect)
 Function:       在中断中接收host传来的数据
 Paramenter:     None               
 Return value:   None                     
 Author:         Chen yuan zhen Mar.04.2008 
*************************************************************/
SIGNAL(USART0_RX_vect)
{
    static unsigned char RxCounter=0;
	unsigned char RxStatus , data ,checksum=0;
    RxStatus = UCSRA; 
    data =UDR;
   	if(IS_UART_REC_READY)             
	{
        if(  ( RxStatus & ERROR_UART  )==0)         //如果没有帧错误和溢出错误
	    { 
		 		   
		    if(IS_DOWN_LOAD_ENABLE)                  //下载  ^^%^
		    {                                        //可以从这里区分最后的信息
                SET_DL_CONTINUE_FLAG;
				    switch(RxCounter)
                    {
	                    case 0:
		                {
						    if(data==0xFF)
							{
                      		    RxCounter++;
						        break;
							}
							else if(data==0x11)
							{
								DL_OVER_FLAG=1;
                      		    RxCounter++;
							    break;
							}
							else                                   //出错
							{
							    RxCounter=0;
								UART_ERROR_FLAG=1;
							    break;
                            }

	                    }
						case 1:
						{
						    /***************1111****************/
							if(DL_OVER_FLAG)
							{
							    Interval=data;
							    RxCounter++;
							    break;
							}
							/***************2222****************/
							else
							{
							    LStartTime=data;
							    RxCounter++;
							    break;
							}
						}
						case 2:
						{
						    /***************1111****************/
						    if(DL_OVER_FLAG)
							{
							     if((Interval+data)==255)
								 {
								     RxCounter++;
							         break;
								 }
								 else                                //出错
							     {
                      		         RxCounter=0;
								     UART_ERROR_FLAG=1;
							     	 break;
							     }

							}
							/***************2222****************/
							else
							{
							    HStartTime=data;
							    RxCounter++;
							    break;
							}
						}
	                    case 3:
		                {
						   
                            /***************1111****************/
						    if(DL_OVER_FLAG)
							{
							    if(data==0x02)
								{ 
								    DL_REALY_OVER=1;
									SET_UART_DADA_DISPOSE;
									BigStepNum[ModeBuffer] = ((unsigned int)(BigStepBuffer0))*256 +BigStepBuffer1;//记录步长
							        RxCounter=0;
							        break;
								 }
						    	else
								{
							        RxCounter=0;
							    	UART_ERROR_FLAG=1;
							        break;
                                 }
							}   
							/***************2222****************/                                 
						    else if((data==0)||(data>10))       //出错
							{
                      		    RxCounter=0;
								UART_ERROR_FLAG=1;
								break;
							}
							else
							{
                                ModeBuffer=data-1;          //从0开始计数
							    RxCounter++;
							    break;
							}

	                    }
						case 4:
						{

							    RxCounter++;
						        BigStepBuffer1=data;
							    break;

						}
						case 5:
						{
	
							     RxCounter++;
						         BigStepBuffer0=data;
							     break;
						 }
	                     case 6:case 7:case 8:case 9:case 10:case 11:
	                     case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:
	                     case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 31:
	                     case 32:case 33:case 34:case 35:case 36:case 37:
		                 {
						     StepData[RxCounter-6]=data;
							 RxCounter++;
							 break;
	                     }
						 case 38:
						 {
							 RxCounter=0;
						     checksum=ModeBuffer+BigStepBuffer0+BigStepBuffer1+ LStartTime+ HStartTime+1;
							 for(unsigned char LcvCounter=0;LcvCounter<32;LcvCounter++)
							 {
							     checksum+=StepData[LcvCounter];
							 }
							 if(checksum!=data)
							 {
								 UART_ERROR_FLAG=1;
							 }
							 else
							 {
							     //AckToPc();
							     SET_UART_DADA_DISPOSE;
							 }
							 break;
						}
		            }

			}


			//实时处理
			if(IS_DOWN_LOAD_DISABLE)
			{
                REAL_TIME_FLAG=1;
				switch(RxCounter)
				{
				    case 0:
                    {
					    RUN_FLAG=0;                   //不知有无必要?
						if(data==0xFF)
				        {
						    RUN_FLAG=0;               //实时控制时关闭跑
                      	    RxCounter++;
						    break;
						}
						else
				        {
                      	    RxCounter=0;
							NackToPc( );
						    break;
						}
					}
                    case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:
					case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:
					case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:
					case 31:case 32:
					{
						StepData[RxCounter-1]=data;
					    RxCounter++;
						break;
					}
					case 33:
					{
						for(unsigned char LcvCounter=0;LcvCounter<32;LcvCounter++)
						{
							checksum+=StepData[LcvCounter];
					    }
						if(checksum==data)
						{
						    AckToPc();
                      	    RxCounter=0;
                            FinalDispose();

						}
						else
				        {
                      	    RxCounter=0;
							NackToPc( );
						    break;
						}
					}
				}

			}

		}
		else
		{
		    RxCounter=0;
			UART_ERROR_FLAG=1;
		}
	}


}


⌨️ 快捷键说明

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