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

📄 main.#3

📁 实现U盘功能的单片机程序,单片机为C8051F340
💻 #3
字号:

//头文件
/////////////////////////////
#include "c8051F340.h"
#include "stdio.h"
#include "intrins.h"
#include "Usb_FunDec.h"
#include "Usb_Parameter.h"
#include "Usb_Register.h"
#include "Usb_Request.h"
///////////////////////////////////////////////////////////////////////////////////////
// 16-bit SFR declarations
sfr16 DP       = 0x82;                 	// data pointer
sfr16 TMR2RL   = 0xca;                 	// Timer2 reload
sfr16 TMR2     = 0xcc;                 	// Timer2 counter
sfr16 TMR3     = 0x94;                 	// Timer3 counter
sfr16 TMR3RL   = 0x92;                 	// Timer3 reload
sfr16 PCA0CP1  = 0xe9;                 	// PCA0 Module 1 Capture/Compare
sfr16 PCA0CP2  = 0xeb;                 	// PCA0 Module 2 Capture/Compare
sfr16 PCA0CP3  = 0xed;                 	// PCA0 Module 3 Capture/Compare
sfr16 PCA0CP4  = 0xfd;                 	// PCA0 Module 4 Capture/Compare
sfr16 PCA0CP0  = 0xfb;                 	// PCA0 Module 0 Capture/Compare
sfr16 PCA0     = 0xf9;                 	// PCA0 counter
////////////////////////////////////////////////////////////////////////////////////////
//宏定义
#define System_Clock 48000000		   	//系统时钟
#define Baud_Rate    9600			   	//串口波特率
////////////////////////////////////////////////////////////////////////////////////////
//位定义
sbit    LED_g			= P2^4;				//LED控制脚
////////////////////////////////////////////////////////////////////////////////////////
//函数申明
void	Init_Device(void);				//单片机初始化
void    Reset_Sources_Init(void);		//单片机复位源初始化
void    Timer_Init(void);				//定时器初始化
void    UART_Init(void);				//串口初始化
void    ADC_Init(void);					//AD转换器初始化
void    Voltage_Reference_Init(void);	//电压基准愿初始化
void    Port_IO_Init(void);				//IO口初始化
void    Oscillator_Init(void);			//系统时钟初始化
void    Interrupts_Init(void);			//中断源初始化
void 	Time_Delay(unsigned int time);	//延时函数定义,时间为time毫秒
//////////////////////////////////////////////////////////////////////
//外部函数调用
extern 	void Flash_Init(void);
extern	void Flash_Format16(void);
extern	void Test_Flash(void);
extern  void Flash_Verify(void);
///////////////////////////////////////////////////////////////////////////////////////////////////
extern unsigned char Flash_Erase_Block(unsigned int BlockNum);
//主函数
void main ()
{
	unsigned int i;
   	PCA0MD &= ~0x40;            // 关看门狗
	Init_Device();				// 单片机初始化
	Flash_Init();				// FLASH初始化
	Usb_Init();					// USB初始化
	//EA = 1;  					// 开中断中断
	for(i=0;i<0xffff;i++) Flash_Erase_Block(i);
	while (1)
   	{
		Time_Delay(1);
		LED_g=1;
   	}
}



////////////////////////////////////////////////////////////////////////////////////////////////////
//单片机初始化
void Init_Device(void)
{
    Reset_Sources_Init();
    Timer_Init();
    UART_Init();
    ADC_Init();
    Voltage_Reference_Init();
    Port_IO_Init();
    Oscillator_Init();
    Interrupts_Init();
}

void Reset_Sources_Init()
{
}

//定时器0使用系统时钟,为16位定时器方式;定时器1使用系统时钟的12分频,8位重装载方式,波特率发生器
void Timer_Init()
{
    TCON      = 0x40;
    TMOD      = 0x20;
	TL1		= -System_Clock/12/2/Baud_Rate;
    TH1     = -System_Clock/12/2/Baud_Rate;
	TR0=0;
	TR1=1;
}

//8位方式,1起始位+8数据位+1停止位,接收容许,并且只有停止位为1时才触发接收中断
void UART_Init()
{
    SCON0     = 0x30;
	TI0=1;				//为printf函数做准备
}

void ADC_Init()
{
}

void Voltage_Reference_Init()
{
}

void Port_IO_Init()
{
    P0MDOUT   = 0x10;
    XBR0      = 0x01;
    XBR1      = 0x40;
	P4MDOUT   = 0x00;
	P3MDOUT   = 0xDF;
	P3=0xff;
	P4=0xff;
	VDM0CN	  = 0x80;	// Enabal VDD monitor
	FLSCL	  = 0x88;	// 一次读两个字节
	PFE0CN    = 0x20;	// 指令预取使能
}

//系统使用内部时钟,频率为48MHz,USB工作在全速,时钟为48MHz
void Oscillator_Init()
{
    int i = 0;
    OSCICN    = 0x83;
    CLKMUL    = 0x80;
    for (i = 0; i < 20; i++);    // Wait 5us for initialization
    CLKMUL    |= 0xC0;
    while ((CLKMUL & 0x20) == 0);
    CLKSEL    = 0x03;
}

void Interrupts_Init()
{
	EIE1 |= 0x02;                   // 允许USB中断
}
//////////////////////////////////////////////////////////////////////////////////////////////////
void Time_Delay(unsigned int time)	
{
	unsigned int i=0,j=0;
	for(i=0;i<time;i++)
	{
		for(j=0;j<1200;j++)
		{_nop_();}	
	}
}

⌨️ 快捷键说明

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