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

📄 main.c

📁 sl811 c8051F驱动程序 保证绝对可以使用 USB通信协议USB1.1
💻 C
字号:

#include <c8051F020.h>
#include "MAIN.H"
#include "host_811.H"
#include <stdio.h>
#include "ufi.h"
#include "file.h"
#include "api.h"

#define Clr_WDT() WDTCN=0xa5
#define SYSCLK       12000000          // SYSCLK frequency in Hz
#define BAUDRATE     9600            // Baud rate of UART in bps
extern Control bdata USB_Control;
BYTE temp;
BYTE temp1;
extern  struct _FILE  ApiFileControl;
extern  USBDEV idata uDev;
//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F02x
//-----------------------------------------------------------------------------
sfr16 DP       = 0x82;              // data pointer
sfr16 TMR3RL   = 0x92;              // Timer3 reload value
sfr16 TMR3     = 0x94;              // Timer3 counter
sfr16 ADC0     = 0xbe;              // ADC0 data
sfr16 ADC0GT   = 0xc4;              // ADC0 greater than window
sfr16 ADC0LT   = 0xc6;              // ADC0 less than window
sfr16 RCAP2    = 0xca;              // Timer2 capture/reload
sfr16 T2       = 0xcc;              // Timer2
sfr16 RCAP4    = 0xe4;              // Timer4 capture/reload
sfr16 T4       = 0xf4;              // Timer4
sfr16 DAC0     = 0xd2;              // DAC0 data
sfr16 DAC1     = 0xd5;              // DAC1 data
sfr16 T0	   = 0x8a;				// Timer0 counter
sbit WR=P0^6;						//写信号
sbit RD=P0^7;
sbit nRest=P3^1;						//读信号
//	函数声明
//----------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void SYS_Init (void);
void WDT_Init(void);
void EMIF_Init (void);
void Deivce_Init(void);
void delay(unsigned int t);
void UART0_Tnit(void);	 
char getchar (void);
char putchar (char a);
void Init_Interrupt(void);
xdata    BYTE buf1[5120] _at_ 0x8000;
xdata    BYTE buf2[500] _at_ 0xd400;			
  void     main()
{ 	  
      	

 BYTE i;
unsigned int temp;
while(1);
Deivce_Init();
DelayMs(6);
nRest=1;
Init_Interrupt();
sl811h_init();
ENABLE_INTERRUPTS;
 for(temp=0;temp<5120;temp++)
{buf1[temp]='A';}
while(TRUE)
{                     
		if(1)
		{
		  Clr_WDT();

			   i=SL811Read(IntStatus);
		
			if((USB_RESET&i))	//没有接入设备;
			{	
				if(USB_Control.SLAVE_ONLINE ==TRUE)
				{
					USB_Control.SLAVE_REMOVED=TRUE;
					USB_Control.SLAVE_ONLINE =FALSE; //显而易见;
					
				}
			}
			else	
			{  
				if(USB_Control.SLAVE_ONLINE == FALSE&&(i|0x7F))
				{	 
					USB_Control.SLAVE_FOUND=TRUE;
	   				USB_Control.SLAVE_ONLINE =TRUE;	//显而易见;
				}
			}
			if(USB_Control.SLAVE_FOUND)
			{	
				DISABLE_INTERRUPTS;
				USB_Control.SLAVE_FOUND=FALSE;
	
				if(EnumUsbDev(1))							
					USB_Control.SLAVE_ENUMERATED = TRUE;
PollDisk();
InitFsys(); 	
CreateFile("demo.txt",0x20);
WriteFile(buf1,1000);
CloseFile();
OpenFile("demo.txt");
ApiFileControl.CurrentSectorNum=ApiFileControl.StartSectorNum;
ApiFileControl.SectorOffset=0;
ReadFile(buf2,500);
CreateDir("www\\demo.txt");		
	 //DelFile("demo.txt");
				ENABLE_INTERRUPTS;
			}		
			if(USB_Control.bMassDevice)
			{
				DISABLE_INTERRUPTS;
				USB_Control.bMassDevice=FALSE;
				ENABLE_INTERRUPTS;
			}
		}
	  
	}

	
	 

}  


void delay(unsigned int t)
{
	unsigned int i;
	for(i=0;i<1000;i++)
	{
	    while(t--)
	    {
	        t++;
	    	t--;
    	}
	    Clr_WDT();
	}
}
void SYS_Init()
{
	EA =0;								//关中断	
}

void Init_Interrupt(void)//
{
	IT0 = 0;	//低电平触发中断;
	EX0 = 1;
}
/*
***********************************************************
*程序名	WDT_Init
*作用	:看门狗初始化
*参数   :无
*返回值 :无
*作者	:李本斋
*日期	: 2008.12.20
*版权声明: 
***********************************************************
*/
void WDT_Init(void)
{
   WDTCN     = 0xFF;
   WDTCN      =0x06;//10ms             //b2b1b0为周期设置位
}
/*
***********************************************************
*程序名	SYSCLK_Init
*作用	:时钟初始化
*参数   :无
*返回值 :无
*作者	:李本斋
*日期	: 2008.12.20
*版权声明: 
***********************************************************
*/
void SYSCLK_Init (void)
{
   int i;                           // delay counter// start external oscillator with
   OSCXCN = 0x67;                   // 22.1184MHz crystal
   for (i=0; i < 256; i++) ;        // Wait for osc. to start up
   while (!(OSCXCN & 0x80)) ;       // Wait for crystal osc. to settle
   OSCICN = 0x88;                   // select external oscillator as SYSCLK
                                    // source and enable missing clock  // detector
}
// Configure the Crossbar and GPIO ports
/*
***********************************************************
*程序名	PORT_Init
*作用	:端口初始化
*参数   :无
*返回值 :无
*作者	:李本斋
*日期	: 2008.12.20
*版权声明: 
***********************************************************
*/
void PORT_Init (void)
{
  XBR0      = 0x05;
  XBR1     = 0x00;
  XBR2      = 0x40;
                  // Enable crossbar and weak pull-ups
                 
   P3MDOUT   = 0xFF;
   P2MDOUT   = 0xFF;
   P1MDOUT 	 = 0xFF;
   P0MDOUT   = 0xFF;
   P74OUT	 = 0xFF;
}

//-----------------------------------------------------------------------------
// EMIF_Init
//-----------------------------------------------------------------------------
//
// Configure the external memory interface to use upper port pins in 
// non-multiplexed mode to a mixed on-chip/off-chip configuration without 
// Bank Select.
//
void EMIF_Init (void)
{
   EMI0TC = 0x20;// upper ports; non-muxed mode;   // fastest timing (4-cycle MOVX)  // split mode w/o bank select
   EMI0CF = 0x38;    
 //    EMI0CF = 0x2f;                    
}

void Deivce_Init(void)
{	  		
    SYSCLK_Init();							//系统时钟配置 
	WDT_Init();								//看门狗初始化
	EMIF_Init();							//外部存储器访问初始化
	PORT_Init();							//端口配置 	
	SYS_Init();
	UART0_Tnit();									//系统数据初始化
}
void UART0_Tnit(void)
{
	SCON0  = 0x50;                      // SCON0: mode 1, 8-bit UART, enable RX
   	TMOD   = 0x21;                      // TMOD: timer 1, mode 2, 8-bit reload
   	TH1    = -(SYSCLK/BAUDRATE/16);     // set Timer1 reload value for baudrate9600
   	TR1    = 1;                         // start Timer1
   	CKCON |= 0x10;                      // Timer1 uses SYSCLK as time base
   	PCON  |= 0x80;                      // SMOD00 = 1
   	ES0    = 0;                         // disable UART0 interrupts

	TI0    = 0;                         // Indicate TX0 ready
}  
   
char getchar (void)
{
    char a;
	while(!RI0)
    Clr_WDT();
	RI0 =0;
	a = SBUF0; 
	return a;
}

char putchar (char a)
{
    SBUF0 = a;
	while(!TI0);
	Clr_WDT();
	TI0 =0;
	return 0;
}
 void ISR_INT0(void) interrupt 0
{
	DISABLE_INTERRUPTS;
	SL811Write(IntStatus,INT_CLEAR);
//	UsbEvent=TRUE;
	ENABLE_INTERRUPTS;
}

 

⌨️ 快捷键说明

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