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

📄 usb118_c51.c

📁 51单片机USB通信模块
💻 C
字号:
/************************************************************************************************
*                           
*                                 USB118 C51测试程序
*                                                               Version 1.0
*                西安达泰电子有限责任公司(Xi'an DATA Electronic Co,Ltd)      
*   网址: http://www.dataie.com 
*   电话: 029-85272421 , 88022900
*  
*                                             西安达泰电子有限责任公司        2005.08.06
*************************************************************************************************/


/************************************************************************************************
*
*  U盘文件读写模块 以字节为单位进行U盘文件读写。10条精简命令完成所有读写过程
*  MCS-51单片机C语言示例程序 
*  硬件连接方式: 4线制串口(电源,地,输入,输出) 
*
*************************************************************************************************/

#include <REG52.h>
#include <stdio.h>


#define uchar unsigned char
#define uint unsigned int

sbit P3_3=P3^3;
sbit P3_5=P3^5;
/************************************************************************************************
*
*  										USB118命令  
*
*************************************************************************************************/
					 //检测u盘命令
uchar code Detect[66]={0xaa,0xbb,
					   0x01,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
	 				   0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
	 				   0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
	 				   0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};  
					//建立TEST.TXT文件命令
uchar code Create[66]={0xaa,0xbb,
					   0x07,0x54,0x45,0x53,0x54,0x39,0x20,0x20,0x20,0x54,0x58,0x54,0x20,0x00,0x00,0x00,
					   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x4F,0xFD,0x32,0x00,0x00,0x00,0x00,0x00,
					   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
					   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
					//打开文件命令
uchar code  Open[66] ={0xaa,0xbb,
					   0x06,0x54,0x45,0x53,0x54,0x20,0x20,0x20,0x20,0x54,0x58,0x54,0x00,0x00,0x00,0x00,
					   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
					   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
					   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
					//写文件命令	
uchar code  Write[66]={0xaa,0xbb,
					   0x09,0x00,74,0x01,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
			  		   0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
					   0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
					   0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
					//读文件命令
uchar code  Read[66]={0xaa,0xbb,
					  0x08,0x08,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
				      0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
					  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
					  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
					//删除文件命令
uchar code Remove[66]={0xaa,0xbb,
					   0x11,0x00,0x54,0x45,0x53,0x54,0x20,0x20,0x20,0x20,0x54,0x58,0x54,0x00,0x00,0x00,
					   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
					   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
					   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
					//设置文件指针命令
uchar code SetFilePointer[66]=			
					  {0xaa,0xbb,
					   0x15,0x00,74,0x01,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
					   0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
					   0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
					   0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
					//获得软件版本
uchar code GetVersion[66]=
					 {0xaa,0xbb,
					  0x30,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
				      0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
					  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
					  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
					//获得磁盘空间
uchar code GetCapacity[66]=
					 {0xaa,0xbb,
					  0x12,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
				      0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
					  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
					  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
					//获得文件列表
uchar code  List[66]= {0xaa,0xbb,
					  0x10,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
				      0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
					  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
					  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
					//数据1
uchar code  Date1[66]={0x30,0x31,
					   0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x61,0x62,0x63,0x64,0x65,0x30,0x31,0x32,
					   0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x61,0x62,0x63,0x64,0x65,0x30,0x31,0x32,0x33,
					   0x34,0x35,0x36,0x37,0x38,0x39,0x61,0x62,0x63,0x64,0x65,0x30,0x31,0x32,0x33,0x34,
					   0x35,0x36,0x37,0x38,0x39,0x61,0x62,0x63,0x64,0x65,0x30,0x31,0x32,0x33,0x0d,0x0a};
					//数据2
uchar code  Date2[66]={0x30,0x31,
					   0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x61,0x62,0x63,0x64,0x65,0x30,0x31,0x32,
					   0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x61,0x62,0x63,0x64,0x65,0x30,0x31,0x32,0x33,
					   0x34,0x35,0x36,0x37,0x38,0x39,0x61,0x62,0x63,0x64,0x65,0x30,0x31,0x32,0x33,0x34,
					   0x35,0x36,0x37,0x38,0x39,0x61,0x62,0x63,0x64,0x65,0x30,0x31,0x32,0x33,0x34,0x35};


uchar data num;

void delay_xms(unsigned int);				//延时函数
void init_com(void);						//初始化串口函数
void test(void);							//系统测试函数
void Send_Data(uchar Serial_data);			//发送一个字节函数
void TXD_Int(uchar *s);						//发送数据函数
bit Receive_Data(uchar,uint );				//接收数据函数
uchar Receive_One(void);					//接收一个字节函数			

/************************************************************************************************
								主程序
include E:\SoftICE_564\Convert_to_BSLx564.txt
*************************************************************************************************/
void main()
{
	int i;
	SP = 0x60;								//设置堆栈指针
	init_com();								//初始化串口
	test();									//系统测试并延时

det:										//检测U盘
	TXD_Int(Detect);

	if(Receive_Data(0x04,0)==0)				//命令是否成功执行,是则继续执行
	{										//否则重新执行
		delay_xms(1000);
		goto det;
	}

//	num=0x41;
//for(j=0;j<10;j++)
//{	
		delay_xms(1000);
crt:										//建立文件
	TXD_Int(Create);
	if(Receive_Data(0x0a,0)==0)				//命令是否成功执行,是则继续执行
	{										//否则重新执行
		delay_xms(1000);
		goto crt;
	}
	
//	num++;
//}



	delay_xms(500);
wrt:										//写文件
	TXD_Int(Write);
	for(i=0;i<5;i++)
		TXD_Int(Date1);
	
	if(Receive_Data(0x0c,0)==0)				//命令是否成功执行,是则继续执行
	{										//否则重新执行
		delay_xms(1000);
		goto wrt;
	}


	delay_xms(500);
op:											//打开文件
	TXD_Int(Open);
	if(Receive_Data(0x0d,0)==0)				//命令是否成功执行,是则继续执行
	{										//否则重新执行
		delay_xms(1000);
		goto op;
	}
/*
	delay_xms(500);
											//读文件
	TXD_Int(Read);

	if(Receive_Data(0x0b,8)==0)				//命令是否成功执行,是则继续执行
	{										//否则重新执行
		delay_xms(1000);
		goto op;
	}
*/
/*
	delay_xms(500);
											//删除文件
del:TXD_Int(Remove);

	if(Receive_Data(0x21,0)==0)				//命令是否成功执行,是则继续执行
	{										//否则重新执行
		delay_xms(1000);
		goto del;
	}
*/

sfp:
	TXD_Int(SetFilePointer);				//移动文件指针

	if(Receive_Data(0x25,0)==0)				//命令是否成功执行,是则继续执行
	{										//否则重新执行
		delay_xms(1000);
		goto sfp;
	}
	delay_xms(500);

wrt2:										//二次写文件
	TXD_Int(Write);
	for(i=0;i<5;i++)
		TXD_Int(Date2);
	
	if(Receive_Data(0x0c,0)==0)				//命令是否成功执行,是则继续执行
	{										//否则重新执行
		delay_xms(1000);
		goto wrt2;
	}


	while(1);  								//循环等待
}
/********************************************************************
				CoM口波特率初始化函数 
原型:init_com(); 
功能:初始化com口
入口参数:无 
出口参数:无 
********************************************************************/ 
void init_com( )
{

//	SCON = 0x50; //串口方式1,允许接收
//	TMOD = 0x20; //定时器1 定时方式2
//	TCON = 0x40; //设定时器1 开始计数
//	PCON = 0x80;
//	TH1 = 0xf3; //24MHz 9600 波特率
//	TL1 = 0xf3;


	SCON = 0x53;
	PCON = 0x80 | PCON;
	T2CON = 0x30;

//	RCAP2H = 0xFF;	// 9600 @ 24MHz: 24000000/(32*(65536-(RCAP2H,RCAP2L)))		
//	RCAP2L = 0xB2;

//	RCAP2H = 0xFF;	// 19200 @ 24MHz: 24000000/(32*(65536-(RCAP2H,RCAP2L)))	
//	RCAP2L = 0xD9;

	RCAP2H = 0xFF;	// 57600 @ 24MHz: 24000000/(32*(65536-(RCAP2H,RCAP2L)))	
	RCAP2L = 0xF3;
	TI = 1;
	TR2 = 1;

}
/********************************************************************
                         测试系统
功能:使发光二极管闪烁
入口参数:无
出口参数: 无
********************************************************************/
void test( )
{
	int a=0;
	P3 = 0xff;							//P3口初始化,使发光二极管熄灭	
	while(a<10)
	{	
		P3_3 = ~P3_3;					//P3.3取反
		P3_5 = ~P3_5;
		delay_xms(500);					//延时0.5秒
		a++;
	}
	P3 = 0xff;
}

/********************************************************************
						延时函数
功能:共延时1ms乘以delay_time
入口参数:延时delay_time ms
出口参数:无
********************************************************************/
void delay_xms(unsigned int delay_time)
{
	unsigned int i,j;

	for(i = 0; i < delay_time; i++)
	{
		for(j = 0; j < 250; j++); 
	}
}
/********************************************************************
                       发送一帧数据函数
功能:发送一帧数据
入口参数:命令帧首地址,数据个数
出口参数:无
********************************************************************/
void TXD_Int(uchar *s)
{
         char i;		 
		 TI = 0;		 
		 for(i=0; i<66; i++)           //发送64个参数  
  //   	 {
//		 	if(i==7)
//				Send_Data(num); 
//			else
               Send_Data(*(s+i)); 
  //    	 }
		 RI = 0;
		 TI = 0;                      //一帧发送完毕

}
/********************************************************************
                      串口发送一个字节
功能:发送一个字节数据
入口参数:发送数据
出口参数:无
********************************************************************/
void Send_Data(uchar Serial_data)
{
	SBUF = Serial_data;				//发送一个字节
	while(!TI);						//等待发送
	TI = 0;                   		
}
/********************************************************************
                         接收应答信号和数据函数
功能:接收一个字节通讯
入口参数:无
出口参数:返回接收值
********************************************************************/
bit Receive_Data(uchar	rxd,uint num)
{
	int i;
	REN = 1;						//接收位打开
	P3_3 = 1;
	P3_5 = 1;
	if(Receive_One()== rxd)			//接收的是否是应答码
	{
		if(Receive_One() == 0x01)	//是应答码,是否是成功执行
		{
		
			for(i=0;i<62;i++)		//成功执行,接收62个保留位
			{
				Receive_One();
			}
			P3_3 = 0;				//指示灯亮
			P3_5 = 0;
			if(num!=0)				//是否有数据,有则跳接收部分
				goto rev;
			else return(1);			//无,返回1
		 }
		 else						//未成功执行
		 {
			for(i=0;i<62;i++)		//接收62个保留位
			{
				Receive_One();
			}
			P3_3 = 1;
			P3_5 = 0;
			return(0);				//返回0
		  }
	}
	else							//收到的不是应答码
	{
		for(i=0;i<63;i++)			//接收剩下的63个字节
		{
			Receive_One();
		}
		P3_3 = 1;
		P3_5 = 0;
		return(0);					//返回0
	 }

rev:
	if(num>0)						//应答信号后有数据
	{
		for(i=0;i<num;i++)			//接收数据
			Receive_One();
	}
	REN = 0;						//关闭接收位
	return(1);						//返回1
}
/********************************************************************
                         接收一个字节通讯函数
功能:接收一个字节通讯
入口参数:无
出口参数:返回接收值
********************************************************************/
uchar Receive_One(void)
{
	while(!RI);					//等待接收
	RI = 0;
	return(SBUF);				//将接收数据返回
}

⌨️ 快捷键说明

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