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

📄 c8051f340.c

📁 C8051F异步串口操作程序
💻 C
字号:
/*****************************************************************************/
//----------------------------------------------------------------------------
/////////////////////////// BEGAIN ////////////////////////////////////
//----------------------------------------------------------------------------
#include <c8051F340.h>
#include <INTRINS.H>
#include <STDIO.H>
//#define ResetWdg() PCA0CPH4 += 0xFF//向PCA0CPH4写入任意值将复位看门狗
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
#define uchar unsigned char
#define uint unsigned int
#define byte unsigned char
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
sbit SDA=P0^0;
sbit SCL=P0^1;
sbit TTQH6_RST0=P0^6;
sbit MCU_LED=P1^1;
//---------------------------------------------------------------------------
void Init_Device(void);
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
typedef struct
{
    uint  Parameter_ID;     //
    uint Min_Value;        //允许的最小值
    uint Max_Value;        //允许的最大值
    uint Init_Value;       //出厂默认值,当读用户设置值错误时应用该值
      signed char *s;				//字符串指针
} TTQH6_PARAMETER;
//----------------------------------------------------------------------------
//包含结构体的数组,存储可更改参数【参数id,最小值,最大值,初始值,注释字符串】
//----------------------------------------------------------------------------
TTQH6_PARAMETER code CmdListReg[] = 
{
    {0x00,0x00,0xFF,0x10,  "Chip ID &SW ID\n "}, //
    {0x01,0x00,0xFF,0xD4,  "General,D7-Xtal select1 : 16M  0 : 4M\n     D2:0-GPO select 000 :0001 : 1 "}, //
    {0x02,0x00,0xFF,0x00,  "Global Power Management (Vaild at Time Slicing Mode)\n "}, //
    {0x03,0x00,0xFF,0x80,  "General Purpose\n "}, //
    {0x04,0x00,0xFF,0x0D,  "Band Assignment\n "}, //
    {0x05,0x00,0xFF,0x7F,  "Local Power Management I\n "}, //
    {0x06,0x00,0xFF,0x00,  "Local Power Management II\n "}, // 
    {0x07,0x00,0xFF,0x00,  "Local Power Management III\n "}, // 
	{0x08,0x00,0xFF,0x02,  "Signal Chain Configure I\n "}, //
    {0x09,0x00,0xFF,0x4E,  "Signal Chain Configure II\n "}, // 
    {0x0A,0x00,0xFF,0x59,  "Signal Chain Configure III\n "}, // 
    {0x0B,0x00,0xFF,0x8D,  "Signal Chain Configure IV\n "}, //  
   // {0x0C,0x00,0xFF,?    "Signal Chain Configure V\n "}, //
   // {0x0D,0x00,0xFF, ?   ""}, //
   // {0x0E,0x00,0xFF, ?   ""}, //
    {0x0F,0x00,0xFF,0x01,  "PLL Frequency I\n "}, // 
    {0x10,0x00,0xFF,0x17,  "PLL Frequency II\n "}, // 
    {0x11,0x00,0xFF,0x04,  "PLL Frequency III\n "}, // 
    {0x12,0x00,0xFF,0x40,  "PLL Frequency IV\n "}, // 
    {0x13,0x00,0xFF,0x48,  "PLL Frequency V\n "}, // 
    {0x14,0x00,0xFF,0x00,  "PLL Frequency VI\n "}, // 
    {0x15,0x00,0xFF,0x2A,  "PLL Frequency VII\n "}, // 
    {0x16,0x00,0xFF,0xA0,  "PLL Test\n "}, //
    {0x17,0x00,0xFF,0x39,  "PLL & SAR Configuration II\n "}, //
    {0x18,0x00,0xFF,0x1F,  "PLL Configuration III\n    Atune code-00000000: min gain ;11111111: max gain\n "}, //

};
//----------------------------------------------------------------------------
//---------------------------------------------------------------------------

void Delay(unsigned int x)
{
    uint i, j;
    
    for (i=0; i<x; i++)
    {
        for (j=0; j<0xff; j++)
        {;}
    }
}
//----------------------------------------------------------------------------
//---------------------------------------------------------------------------

void I2C_Delay(void)
{
    uchar i;
    
    for (i=0; i<10; i++)
    {;}
}
//---------------------------------------------------------------------------
/*
**start
**    ________      
**SCL         \______
**    ____         
**SDA     \__________
**
*/
void I2C_Start(void)
{
    SCL = 0;
    I2C_Delay();
    I2C_Delay();
    SDA = 1;
    I2C_Delay();
    SCL = 1;
    I2C_Delay();
    SDA = 0;
    I2C_Delay();
    SCL = 0;
}
//----------------------------------------------------------------------------
/*
**stop
**          _______
**SCL  ____/       -------
**             ____
**SDA  _______/    ----
**
*/
void I2C_Stop(void)
{
    SCL = 0;
    I2C_Delay();
    SDA = 0;
    I2C_Delay();
    SCL = 1;
    I2C_Delay();
    while(SCL != 1) SCL = 1;
    SDA = 1;
    I2C_Delay();
}
//----------------------------------------------------------------------------
void I2C_Write_Byte(uchar dat)
{
    uchar i;
    
    for (i=0; i<8; i++)
    {
        SDA = (bit)(dat & 0x80);
        I2C_Delay();										                              
        SCL = 1;
        dat <<= 1;
        I2C_Delay();
        SCL = 0;
    }
    SDA = 1;
    I2C_Delay();
}
//----------------------------------------------------------------------------
uchar I2C_Read_Ack(void)
{
    SCL = 1;
    do
    {
        SDA = 1;
    }while (SDA != 0);
    SCL = 0;
    
    return(0);
}
//----------------------------------------------------------------------------
uchar I2C_Read_Byte(void)
{
    uchar i, dat;
    
    SDA = 1;
    SCL = 1;
    while(SCL != 1)
    {
        SCL = 1;
    }

    for (i=0; i<8; i++)
    {
        SCL = 1;
        I2C_Delay();
        dat <<= 1;
        dat |= (char)SDA;
        SCL = 0;
    }
    SDA = 1;
    I2C_Delay();
    SCL = 1;
    I2C_Delay();
    SCL = 0;
    return(dat);
}
//----------------------------------------------------------------------------
//---------------------------------------------------------------------------

uchar Read_TTQH6(uchar register_address)
{
    uchar dat;
    
    //I2C_Stop();				   //jm delete
    I2C_Start();
    I2C_Write_Byte(0xC4);             // 器件写地址
    I2C_Read_Ack();
    I2C_Write_Byte(register_address); // 寄存器地址
    I2C_Read_Ack();
    I2C_Stop();

    I2C_Start();
    I2C_Write_Byte(0xC5);             //器件读地址
    I2C_Read_Ack();
    dat = I2C_Read_Byte();
    //I2C_Write_Ack();                //数据已从TTQH6中读出不用再理会回传应答
    I2C_Stop();

    return(dat);
}
//----------------------------------------------------------------------------
void Write_TTQH6(uchar register_address,uchar value)
{
  
    I2C_Stop();
    I2C_Start();
    I2C_Write_Byte(0xC4);              // 器件写地址
    I2C_Read_Ack();
    I2C_Write_Byte(register_address);  // 寄存器地址
    I2C_Read_Ack();
    I2C_Write_Byte(value);             // 写数据
    I2C_Stop();

}
//----------------------------------------------------------------------------
void Init_TTQH6(void)	  //初始化器件TTQH6
{
    TTQH6_RST0 = 0;
    Delay(1);
    TTQH6_RST0 = 1;
    Delay(20);
}
//----------------------------------------------------------------------------

byte Receive_RX0(void)	 //串口接收数据
{
    byte RX_data;
      while(RI0==0);
      RI0=0;
      RX_data=SBUF0;
      return (RX_data);	
}

//----------------------------------------------------------------------------  

/*void Tranfer_TX0(byte TX_data) //串口发送数据
{
 
     while(TI0==0);
     TI0=0;
     SBUF0=TX_data;
     }

} */
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------

uchar ASC_0(uchar x)
{
    return(x == '0' ? 1 : 0);
}
//----------------------------------------------------------------------------
uchar ASC_0to9(uchar x)
{
    return(((x < '0') || ('9' < x)) ? 0 : 1);
}
//----------------------------------------------------------------------------
uchar ASC_a_to_f(uchar x)
{
    return(((x < 'a') || ('f' < x)) ? 0 : 1);
}
//----------------------------------------------------------------------------
uchar ASC_AtoF(uchar x)
{
    return(((x < 'A') || ('F' < x)) ? 0 : 1);
}
//----------------------------------------------------------------------------
uchar ASC_0to9_A_a_to_F_f(uchar x)
{
    return((ASC_0to9(x) || ASC_a_to_f(x) || ASC_AtoF(x)) ? 1 : 0);
}
//----------------------------------------------------------------------------
uchar EqualSign(uchar x)
{
    return(x == '=' ? 1 : 0);
}
//----------------------------------------------------------------------------
uchar Semicolon(uchar x)
{
    return(x == ';' ? 1 : 0);
}
//----------------------------------------------------------------------------
uchar ASC_R_r(uchar x)
{
    return(((x == 'R') || (x == 'r')) ? 1 : 0);
}
//----------------------------------------------------------------------------
uchar ASC_L_l(uchar x)
{
    return(((x == 'L') || (x == 'l')) ? 1 : 0);
}
//----------------------------------------------------------------------------
uchar ASC_E_e(uchar x)
{
    return(((x == 'E') || (x == 'e')) ? 1 : 0);
}
//----------------------------------------------------------------------------
uchar ASC_H_h(uchar x)
{
    return(((x == 'H') || (x == 'h')) ? 1 : 0);
}
//----------------------------------------------------------------------------
uchar ASC_X_x(uchar x)
{
    return(((x == 'X') || (x == 'x')) ? 1 : 0);
}
//----------------------------------------------------------------------------
uchar Question_mark(uchar x)
{
    return((x == '?') ? 1 : 0);
}
//----------------------------------------------------------------------------
uchar ASC_P_p(uchar x)
{
    return(((x == 'P') || (x == 'p')) ? 1 : 0);
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
void main(void)
{      
   uchar i;
   uchar new_value;
   uchar temp_addr;
   uchar temp;
   byte  r_data;
   bit   flag=0;  

	Init_Device();
	Init_TTQH6(); 
	TI0=1;            // TI:   set TI to send first char of UART !!!!!!!!!!!
	printf("发送help,获得帮助\n");
    while(1)
	{
/*	 MCU_LED=1;	 //工作指示灯
	 Delay(100);
	 MCU_LED=0;
	 */
//---------------------------------------------------------------------------

	  
      r_data=Receive_RX0();

	  if( ASC_H_h(r_data) )		//输入HELP,输出寄存器默认详单
	     { 
		   r_data=Receive_RX0();
		   if(ASC_E_e(r_data))
		    { 

			   if (ASC_L_l(r_data))
				 {
					 r_data=Receive_RX0();
				   if (ASC_P_p(r_data)) 
				     
					 {
					    for (i=0; i<(sizeof(CmdListReg)/sizeof(TTQH6_PARAMETER)); i++)
                             {
                                    printf("R%03X,初始值%03X\n", CmdListReg[i].Parameter_ID,CmdListReg[i].Init_Value);
                                    printf(CmdListReg[i].s);
                                    printf("\n");
                                    printf("\n");
                              }
    
                          printf("\n");
                          printf("更改:R___=0x______; 注意命令串后以分号结束\n");
                          printf("读出:R___=? \n");
                          printf("发送help,获得帮助\n");
                         
                      }
				else flag=1;

				 }
			  else flag=1;

       		 }

		  else flag=1;
		 }
      //---------------------------------------------------------------------
	  else if (ASC_R_r(r_data))	 
		  			  
			     {
				     temp_addr=Receive_RX0();
			  		 if (ASC_0to9_A_a_to_F_f(temp_addr))
			           	{
							if (EqualSign(Receive_RX0()))
							   {
							      temp=Receive_RX0();
                                  if (Question_mark(temp))	 //寄存器查询,输入R___=?输出寄存器的值
								     {
									   printf("R%03X=%05X\n", temp_addr, Read_TTQH6(temp_addr));//读寄存器

									  }
								//-------------------------------------------
								  else 	 if  (ASC_0(temp))			   //更改寄存器的值
									     {
											if (ASC_X_x(Receive_RX0()))
											   {
												 new_value=Receive_RX0();

												  if (ASC_0to9_A_a_to_F_f(new_value))
												      {
													    if (Semicolon(Receive_RX0()))
														  {
															 Write_TTQH6(temp_addr,new_value);//写寄存器
									                         printf("修改成功");
													       }
													    else flag=1;
													  }
												  else flag=1;
											   }
										    else flag=1;
										  }
								 else flag=1;
									 
							//------------------------------------------
							    }
					    else flag=1;
			           	}
			    	else flag=1;
		         }

      //---------------------------------------------------------------------
     else flag=1;	      	
			 
	 if (flag==1)       
        { 
			flag=0;
	    	printf("输入格式错误,请重新输入,发送help,获得帮助\n");
			
		 }


			
	 }
//----------------------------------------------------------------------------
}

//----------------------------------------------------------------------------
///////////////////////////////// OVER ///////////////////////////////////////
//----------------------------------------------------------------------------
/*****************************************************************************/

⌨️ 快捷键说明

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