?? 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 + -