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

📄 main.#3

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

#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 UsbEvent;
//-----------------------------------------------------------------------------
// 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 Reset_Sources_Init(void);
void EMIF_Init (void);
void Deivce_Init(void);
void delay(unsigned int t);
void Deivce_Init(void);
void UART0_Tnit(void);	 
char getchar (void);
char putchar (char a);
void Init_Interrupt(void);

  void     main()
{ 	
BYTE i;
Deivce_Init();
DelayMs(6);
nRest=1;
Init_Interrupt();
ENABLE_INTERRUPTS;
sl811h_init();
i=SL811Read(IntStatus);

 USBReset();
	while(TRUE)
	{
UsbEvent=TRUE;	
i=SL811Read(IntStatus);                               
		if(UsbEvent)
		{
			UsbEvent=FALSE;
			SL811Write(IntStatus,0XFF);
			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;	
				ENABLE_INTERRUPTS;
			}		
			if(USB_Control.SLAVE_REMOVED)

			{
				DISABLE_INTERRUPTS;
				USB_Control.SLAVE_REMOVED=FALSE;
				USB_Control.SLAVE_ENUMERATED = 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;//外部中断0;
}
/*
***********************************************************
*程序名	WDT_Init
*作用	:看门狗初始化
*参数   :无
*返回值 :无
*作者	:李本斋
*日期	: 2008.12.20
*版权声明: 
***********************************************************
*/
void WDT_Init(void)
{
    WDTCN     = 0xDE;
    WDTCN     = 0xAD;
}
/*
***********************************************************
*程序名	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      = 0x14;
    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)
{
   EMI0CF = 0x38;                      // upper ports; non-muxed mode;                                       // split mode w/o bank select
   EMI0TC = 0x20;                      // fastest timing (4-cycle MOVX)
}

void Deivce_Init(void)
{	  		
    WDT_Init();								//看门狗初始化
	EMIF_Init();							//外部存储器访问初始化
	PORT_Init();							//端口配置
	SYSCLK_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
{
    EA = 0;
	SL811Write(IntStatus,INT_CLEAR);
	UsbEvent=TRUE;
	EA = 1;
}*/

 

⌨️ 快捷键说明

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