用MCS51单片机串口读写U盘的C语言编程实例一、概述目前,基于USB接口的移动存储设备已经被广泛使用,尤其是采用USB-FLASH技术的U盘产品几乎完全取代了软盘 U盘的使用通常是作为计算机的外部存储设备,能否脱离计算机直接向U盘读写数据呢?答案是肯定的嵌入式U盘读写模块提供了通过串口读写U盘的简单途径,由此结合单片机的串口就可以实现U盘的文件读写 嵌入式U盘读写模块可以嵌入用户的数据采集系统中,从而实现数据的海量存储在工控领域,军工产品、石油、交通、水文等野外数据采集系统中可以广泛使用二、* USB118 C51测试程序* * 网址: * : 029- , /************************************************************************************************** U盘文件读写模块 以字节为单位进行U盘文件读写。
10条精简命令完成所有读写过程* MCS-51单片机C语言示例程序 * 硬件连接方式: 4线制串口(电源,地,输入,输出) #include #include #define uchar unsigned char#define uint unsigned int//检测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,0x20,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 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};//数据1uchar 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};//数据2uchar 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); //接收一个字节函数 void main(){ int i,j; SP = 0x60; //设置堆栈指针 P3 = 0xff; 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<20;j++){ delay_xms(50);crt: //建立文件 TXD_Int(Create); if(Receive_Data(0x0a,0)==0) //命令是否成功执行,是则继续执行 { //否则重新执行 delay_xms(1000); goto crt; } delay_xms(100);wrt: //写文件 TXD_Int(Write); for(i=0;i<5;i++) TXD_Int(Date1); if(Receive_Data(0x0c,0)==0) //命令是否成功执行,是则继续执行 { //否则重新执行 delay_xms(1000); goto w。