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

📄 test4_success.c

📁 摄象头驱动并同时提供ch372USB转接芯片的驱动及上传下载程序
💻 C
字号:
#include <C8051F020.h>	// Register definition file.
#include <absacc.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define CH375_CMD_PORT XBYTE[0x7fff]
#define CH375_DAT_PORT XBYTE[0x7ff0]
#define CAPSTAU XBYTE[0xbff0]
#define CAPDATA XBYTE[0xbff1]
#define CAPCTRL XBYTE[0xbff0]
#define CAPINC XBYTE[0xbff1]
#define CMD_RET_SUCCESS 0x51
#define USB_INT_EP2_OUT 0x02
#define USB_INT_EP2_IN 0x0A
sbit P1_0=P1^0;
uint aa,mm,bb,cc,dd;
uchar j,pix,flag1,test,qq=0;
uchar idata xx[128];
uchar dianliang;//电量寄存器
uchar receive_data;
uchar cishu=0,shuju=0;
bit receive_over,send_over,flag;
sbit cap_enable=ACC^0  ;
sbit cap_finish=ACC^1  ;

void config (void) {

	WDTCN = 0x07;	// Watchdog Timer Control Register
    WDTCN = 0xDE;   // Disable WDT    WDTCN = 0xAD;


	XBR0 = 0x00;	// XBAR0: Initial Reset Value
	XBR1 = 0x04;	// XBAR1: Initial Reset Value
	XBR2 = 0xc2;	// XBAR2: Initial Reset Value XBR2.7=1,弱上拉总体禁止
                     // Port configuration (1 = Push Pull Output)
    P0MDOUT = 0x00; // Output configuration for P0 
    P1MDOUT = 0x01; // Output configuration for P1 p10配置为输出
    P2MDOUT = 0x00; // Output configuration for P2 
    P3MDOUT = 0x00; // Output configuration for P3 
    P74OUT = 0xff;  // Output configuration for P4-7,00为漏极开路,FF为推挽输出
	OSCICN=0X17;
    P1MDIN = 0xFF;  // Input configuration for P1
	
    EMI0CF = 0x2C;    // External Memory Configuration Register//配置ALE时钟宽度
	//OSCXCN = 0x01;	// EXTERNAL Oscillator Control Register	
	REF0CN = 0x07;	// Reference Control Register
	AMX0CF = 0x60;	// AMUX Configuration Register
	AMX0SL = 0x00;	// AMUX Channel Select Register
	ADC0CF = 0xF8;	// ADC Configuration Register
	ADC0CN = 0x8C;	// ADC Control Register
	ADC0LTH = 0x00;	// ADC Less-Than High Byte Register
	ADC0LTL = 0x00;	// ADC Less-Than Low Byte Register
	ADC0GTH = 0xFF;	// ADC Greater-Than High Byte Register
	ADC0GTL = 0xFF;	// ADC Greater-Than Low Byte Register
	AD0LJST=1;		//对齐方式
    AMX1SL = 0x00;  // AMUX1 Channel Select Register
    ADC1CF = 0xF8;  // ADC1 Configuration Register
    ADC1CN = 0x00;  // ADC1 Control Register
	DAC0CN = 0x00;	// DAC0 Control Register
	DAC0L = 0x00;	// DAC0 Low Byte Register
	DAC0H = 0x00;	// DAC0 High Byte Register
	DAC1CN = 0x00;	// DAC1 Control Register
	DAC1L = 0x00;	// DAC1 Low Byte Register
	DAC1H = 0x00;	// DAC1 High Byte Register
	SPI0CN = 0x00;	// SPI Control Register
	SPI0CFG = 0x00;	// SPI Configuration Register
	SPI0CKR = 0x00;	// SPI Clock Rate Register
    SCON0 = 0x00;       // Serial Port Control Register
    SADEN0 = 0x00;      // Serial 0 Slave Address Enable
    SADDR0 = 0x00;      // Serial 0 Slave Address Register
    PCON = 0x00;        // Power Control Register
    SCON1 = 0x00;       // Serial Port 1 Control Register   
    SADEN1 = 0x00;      // Serial 1 Slave Address Enable
	SADDR1 = 0x00;      // Serial 1 Slave Address Register

	

//----------------------------------------------------------------
// Timer Configuration
//----------------------------------------------------------------

	CKCON = 0x00;	// Clock Control Register
	TH0 = 0x00;		// Timer 0 High Byte
	TL0 = 0x00;		// Timer 0 Low Byte
	TH1 = 0x00;		// Timer 1 High Byte
	TL1 = 0x00;		// Timer 1 Low Byte
	TMOD = 0x00;	// Timer Mode Register
	TCON = 0x00;	// Timer Control Register 

	RCAP2H = 0x00;	// Timer 2 Capture Register High Byte
	RCAP2L = 0x00;	// Timer 2 Capture Register Low Byte	
	TH2 = 0x00;		// Timer 2 High Byte	
	TL2 = 0x00;		// Timer 2 Low Byte	
    T2CON = 0x00;	// Timer 2 Control Register
		
	TMR3RLL = 0x00;	// Timer 3 Reload Register Low Byte
	TMR3RLH = 0x00;	// Timer 3 Reload Register High Byte
	TMR3H = 0x00;	// Timer 3 High Byte
	TMR3L = 0x00;	// Timer 3 Low Byte
    TMR3CN = 0x00;	// Timer 3 Control Register

    RCAP4H = 0x00;  // Timer 4 Capture Register High Byte
    RCAP4L = 0x00;  // Timer 4 Capture Register Low Byte
    TH4 = 0x00;     // Timer 4 High Byte
    TL4 = 0x00;     // Timer 4 Low Byte
    T4CON = 0x00;   // Timer 4 Control Register

	RSTSRC = 0x00;	// Reset Source Register


//----------------------------------------------------------------
// Interrupt Configuration
//----------------------------------------------------------------

	IE = 0x01;		    //Interrupt Enable
	IP = 0x00;		    //Interrupt Priority
	EIE1 = 0x00;		//Extended Interrupt Enable 1
	EIE2 = 0x00;		//Extended Interrupt Enable 2
	EIP1 = 0x00;		//Extended Interrupt Priority 1
	EIP2 = 0x00;		//Extended Interrupt Priority 2
    EA=0;               //Global interrupt enable
	//ET2=1;
	EX0=1;
//	TR2=1;
	T2CON=0X04;

}   //End of config
void SYSCLK_Init (void)
{
   int i;                              // delay counter
   OSCXCN = 0x67;                      // start external oscillator with
                                       // 18.432MHz 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
//	OSCICN = 0x07;   //interal 16MHZ
}
void	Delay1us( uchar DELAY_START_VALUE )
{uchar i;
if(DELAY_START_VALUE != 0)
	for ( i=DELAY_START_VALUE; i!=0; i-- );
        }
void CH375_WR_CMD_PORT ( uchar cmd )
{
 	Delay1us(8);
	CH375_CMD_PORT=cmd;
	Delay1us(8);
}
void CH375_WR_DAT_PORT( uchar dat )
{  /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */
	CH375_DAT_PORT=dat;
	Delay1us(8);  /* 如果是MCS51单片机,因其较慢,所以实际上无需延时 */
}
 uchar CH375_RD_DAT_PORT( void )
  { uchar i;
   /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */
	Delay1us(1);  /* 如果是MCS51单片机,因其较慢,所以实际上无需延时 */
        i=CH375_DAT_PORT;
	return( i);
}
void reset_all(void)
{ CH375_WR_CMD_PORT ( 0x05) ;
  Delay1us(40);
}
void check_exist(void)
{
 uchar i,j,k;
 CH375_WR_CMD_PORT ( 0x06) ;
 CH375_WR_DAT_PORT( 0xff );  /* 写入测试数据,任意数据 */
 i=~0xff;
 k= CH375_RD_DAT_PORT( ) ;
  CH375_WR_CMD_PORT ( 0x06) ;
 CH375_WR_DAT_PORT( 0x55 );  /* 写入测试数据,任意数据 */
 i=~0x55;
 k= CH375_RD_DAT_PORT( ) ;
	      while(k!=i)
        {
		for ( j=80; j!=0; j-- )
                {
		        reset_all();  /* 多次重复发命令,执行硬件复位 */
			k=CH375_RD_DAT_PORT( );
		}

         }

 }
 void set_usb_mode(void)
 {     uchar i,j;
       CH375_WR_CMD_PORT ( 0x15) ;
       CH375_WR_DAT_PORT( 0x02);  /* 设置为使用内置固件的USB设备方式 */
 	Delay1us(50);
        for ( i=100; i!=0; i-- )
        { j=CH375_RD_DAT_PORT( );
        if ( j == CMD_RET_SUCCESS)
        break;  /* 等待操作成功,通常需要等待10uS-20uS */
        }
 }
 uchar get_ic_ver(void)
 {
 CH375_WR_CMD_PORT ( 0x01) ;
  return( CH375_DAT_PORT );
 }
 void unlock_usb(void)
 {
CH375_WR_CMD_PORT( 0x23 ) ;
 }
 void get_status(void)
 {
 CH375_WR_CMD_PORT( 0x22 ) ;
 }
void WR_USB_DATA64(void)
 {
CH375_WR_CMD_PORT( 0x2b ) ;
 }
 void RD_USB_DATA(void)
 {CH375_WR_CMD_PORT(0X27);
 }
void INI_DB200(void)
{uchar i;
for (i=0;i<10;i++)
{
do
{ACC=0;
ACC=CAPSTAU;

flag=ACC^0;}
while(!flag);
}
}
void START_DB200(void)
{

   CAPCTRL=0XFF;

do
{ACC=0;
ACC=CAPSTAU;
flag=cap_finish;
}
while(! flag);
}

void end_ad(void) interrupt 15
{AD0INT=0;//清中断标志
dianliang=ADC0H;

}
void start_ad(void) interrupt 5
{TF2=0;
}
void	mCH375Interrupt( void ) interrupt 0 using 1
{	uchar intsta,receive_length;
	CH375_CMD_PORT=0x22;     //get status
	intsta=CH375_DAT_PORT; //* 获取中断状态 *

if(intsta==USB_INT_EP2_IN)
{

			   
        CH375_CMD_PORT = 0x23 ;
 	 	CH375_CMD_PORT =0x2b;
 	 	CH375_DAT_PORT=64;
	 	 for(mm=0;mm<64;mm++)
  
	   		{		
		CH375_DAT_PORT=CAPDATA;
		CAPINC=0xff;
  			}
              
}
 if(intsta==USB_INT_EP2_OUT)
{
	CH375_CMD_PORT=0x28;
	receive_length=CH375_DAT_PORT;
	receive_data= CH375_DAT_PORT;

	if(receive_data==0x20)
    {
	receive_data=0x10; 
	START_DB200();
 	 CH375_CMD_PORT =0x2b;
 	 CH375_DAT_PORT=64;
	  for(mm=0;mm<64;mm++)
  
	   		{
				
	  		CH375_DAT_PORT=CAPDATA;
			CAPINC=0xff;
  	
	 	}

}
}

}

 void main(void)
 {
  P1_0=0;
  receive_over=0;
  send_over=0;
  config();
 //SYSCLK_Init(); 
  reset_all();
  check_exist()  ;
  set_usb_mode();
  ACC= get_ic_ver() ;

	INI_DB200();
 	EA=1;
 do{
 
 }
  while(1);

 }


⌨️ 快捷键说明

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