📄 usb118_c51.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 + -