一、简介
点评:此文来源于网络,不过仔细研读后发现,这并不是真正意义上的用单片机直接读写优盘的例子,我刚开始看到这个标题也觉得纳闷,我们都知道要读写优盘,必须要单片机系统做成主机模式,由于主机端协议和代码远比设备端复杂,最好在嵌入式系统上跑OS来实现,51单片机由于资源和速度限制,可能做不了这样的事,果不其然,作者其实是用了一块嵌入式模块(基于ARM的嵌入式系统)实现主机功能,再用51与此系统通过串口来通信来实现读写优盘的目的。
文章原文:
目前,基于USB接口的移动存储设备已经被广泛使用,尤其是采用USB-FLASH技术的U盘产品几乎完全取代了软盘。
U盘的使用通常是作为计算机的外部存储设备,能否脱离计算机直接向U盘读写数据呢?答案是肯定的。嵌入式U盘读写模块提供了通过串口读写U盘的简单途径,由此结合单片机的串口就可以实现U盘的文件读写。
嵌入式U盘读写模块可以嵌入用户的数据采集系统中,从而实现数据的海量存储。在工控领域,军工产品、石油、交通、水文等野外数据采集系统中可以广泛使用。
二、源码
-
-
-
-
-
-
-
-
- #include <REG51RD2.h>
- #include <stdio.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- 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};
-
- 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};
-
- 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};
-
- 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);
- void main()
- {
- int i,j;
- SP = 0x60;
- P3 = 0xff;
- init_com();
- test();
-
- det:
- 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 wrt;
- }
-
- num++;
- }
-
- delay_xms(500);
- op:
- TXD_Int(Open);
- if(Receive_Data(0x0d,0)==0)
- {
- delay_xms(1000);
- goto op;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 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;
- }
-
- P0=0;
- while(1);
- }
-
-
-
-
-
-
-
- void init_com( )
- {
-
- TMOD = 0x20;
- TH1 = 0xfa;
- TH1 = 0xfa;
- PCON = 0x80;
- SCON = 0x40;
- TI=1;
- TR1 = 1;
-
-
- }
-
-
-
-
-
-
- void test( )
- {
- int a=0;
- P0 = 0xff;
- while(a<10)
- {
- P0 = ~P0;
- delay_xms(500);
- a++;
- }
- P3 = 0xff;
- }
-
-
-
-
-
-
-
- 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++)
- {
- 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++)
- {
- Receive_One();
- }
- P3_3 = 0;
- P3_5 = 0;
- if(num!=0)
- goto rev;
- else return(1);
- }
- else
- {
- for(i=0;i<62;i++)
- {
- Receive_One();
- }
- P3_3 = 1;
- P3_5 = 0;
- return(0);
- }
- }
- else
- {
- for(i=0;i<63;i++)
- {
- Receive_One();
- }
- P3_3 = 1;
- P3_5 = 0;
- return(0);
- }
-
- rev:
- if(num>0)
- {
- for(i=0;i<num;i++)
- Receive_One();
- }
- REN = 0;
- return(1);
- }
-
-
-
-
-
-
- uchar Receive_One(void)
- {
- while(!RI)
- {
- P0=0x00;
- }
- P0=0xff;
- RI = 0;
- return(SBUF);
- }
|