📄 test4_success.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 + -