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

📄 main.c

📁 银行磁卡系统的ABA2通信协议的C51实现代码
💻 C
字号:
#include <C8051F120.H>
#define SYSCLK       49000000         

#define BAUDRATE  115200 // Baud rate of UART in bps
#define uchar unsigned char
#define uint unsigned int
#define SAMPLE_RATE  50000             // Sample frequency in Hz

sfr16 RCAP3    = 0xCA;                 // Timer3 reload value
sfr16 TMR3     = 0xCC;                 // Timer3 counter
sfr16 RCAP2    = 0xca;  
sfr16 TMR2     = 0xcc;                 // Timer2

sbit  CLK_PIN = P1^4;
sbit  DataOut= P1^5;

void UART0_Init (void);
void SYSCLK_Init (void);
void PORT_Init (void);
void Timer3_Init (int counts);
void RevCardNoBin(void);
void LRC(void) ;
unsigned long  Conect_digit(void);
void BCD_BIN(void);
void hextobcd(unsigned long hexs,unsigned char j);
void SendData(void);
void wait_ms(uchar ms);
void delay(void);

uchar Len;
uchar RevCardFlag;
uchar Start_Flag;
uchar CardNoBCD[10];
uchar CardNoBin[80];
uchar Data_Addr;
uchar Original_CardNo[5]={0x62,0xE3,0x08,0x6C,0x0ED};
//------------------------------------------------------------------------------------
// MAIN Routine
//------------------------------------------------------------------------------------
void main (void) {

   unsigned long   s=0;
   uchar i;
   // disable watchdog timer
   WDTCN = 0xde;
   WDTCN = 0xad;

   SFRPAGE = CONFIG_PAGE; 
   SYSCLK_Init();               
   PORT_Init ();
   UART0_Init();

                 
   Timer3_Init (SYSCLK/SAMPLE_RATE);   // initialize Timer3 to overflow at
                                       // sample rate

   EA = 1;											// enable global interrupts
   Len=0;
   Start_Flag=0;
   Data_Addr=0;
   RevCardFlag=0;
   CLK_PIN=1;

   
    		 
             s=Conect_digit();    
			 hextobcd(s,10) ;
			 RevCardNoBin();
			 RevCardFlag=1;
   while(1)
   {
			 i=80;
			 while(i--)
			 {
			 	wait_ms(10);
				SendData();
			 }
	delay();
	}
			 while(1);
			  
}


void SYSCLK_Init (void)
{
int i; // delay counter
char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = CONFIG_PAGE; // set SFR page
OSCXCN = 0x67; // Start_Flag external oscillator with
// 22.1184MHz crystal
for (i=0; i < 100; i++) ; // Wait for osc. to Start_Flag up
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
CLKSEL = 0x01; // Select the external osc. as
// the SYSCLK_PIN source
OSCICN= 0x00; // Disable the internal osc.
//Turn on the PLL and increase the system clock by a factor of M/N = 9/4
SFRPAGE = CONFIG_PAGE;
PLL0CN = 0x04; // Set PLL source as external osc.

PLL0CN |= 0x01; // Enable Power to PLL
PLL0DIV = 0x04; // Set Pre-divide value to N (N = 4)
PLL0FLT = 0x01; // Set the PLL filter register for
// a reference clock from 19 - 30 MHz
// and an output clock from 45 - 80 MHz
PLL0MUL = 0x09; // Multiply SYSCLK_PIN by M (M = 9)
for (i=0; i < 100; i++) ; // Wait at least 5us
PLL0CN |= 0x02; // Enable the PLL
while(!(PLL0CN & 0x10)); // Wait until PLL frequency is locked
CLKSEL = 0x02; // Select PLL as SYSCLK_PIN source
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}

void PORT_Init (void)
{
char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = CONFIG_PAGE; // set SFR page
//XBR0 = 0x04; // Enable UART0
//XBR1 = 0x00;
XBR2 = 0x40; // Enable crossbar and weak pull-up
//P0MDOUT |= 0x01; // Set TX0 pin to push-pull
P1MDOUT |= 0xFF; // Set P1.6(LED) to push-pull
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}

void UART0_Init (void)
{
char SFRPAGE_SAVE = SFRPAGE; 
SFRPAGE =0x00;												  					
SCON0 = 0x50; 
SSTA0 = 0x10; 

SFRPAGE = TIMER01_PAGE;
TMOD &= ~0xF0;
TMOD |= 0x20; 
TH1 = -(SYSCLK/BAUDRATE/16);

CKCON |= 0x10; 
TL1 = TH1; 
TR1 = 1; 
SFRPAGE = UART0_PAGE;
TI0 = 1; 
SFRPAGE = SFRPAGE_SAVE;

}


/*
void Timer3_ISR (void) interrupt 14
{
   
   CLK_PIN=~CLK_PIN;
   TF3 = 0;                               // clear TF3
}

*/
void LRC(void)
{
uchar frist=11;
uchar end=15;
uchar str=0;
uchar i;
str=frist; 
for(i=0;i<10;i++)
str=str^CardNoBCD[i];
str=str^end;

CardNoBin[70]=str&0x01;
CardNoBin[71]=(str&0x02)>>1;
CardNoBin[72]=(str&0x04)>>2;
CardNoBin[73]=(str&0x08)>>3;  
CardNoBin[74]=1;

}

unsigned long  Conect_digit(void)
{
unsigned long hexs	;
hexs=Original_CardNo[1]*16777216+Original_CardNo[2]*65536+ Original_CardNo[3]*256+Original_CardNo[4];	//去掉卡号前面的第一个字节
return   hexs;
}

void hextobcd(unsigned long hexs,unsigned char j) {

unsigned long va;
uchar i;
    va = 1000000000;                             
    for     (i=j-1;i;i--) {
        CardNoBCD[i] = 0;                 //目标数组清零
        while ((hexs>=va)&&(va>9)) {
            hexs -= va;                     //减除数
            CardNoBCD[i]=CardNoBCD[i]+1;               //商位加1
        }
        va /= 10;                           //除数除10,指向低一位
    }
    CardNoBCD[0]=hexs;                    //最后个位数
}

void BCD_BIN(void)
{
uchar i,j,m,l,count,s;
j=15; 
	for(m=0;m<10;m++)
		{
		s=CardNoBCD[9-m];
		count=0;
		for(l=0;l<4;l++)
			{
			i=s&0x01;
			CardNoBin[j]=i;
			j++;
			if(i)
			count=count+1;
			s=s>>1;
			}
		if(count%2==0)
		CardNoBin[j]=1;
		else
		CardNoBin[j]=0;
		j++;
		
			
		
		}
}



void RevCardNoBin(void)
{
uchar i;
for (i=0;i<10;i++)
CardNoBin[i]=0;
CardNoBin[10]=1;
CardNoBin[11]=1;
CardNoBin[12]=0;
CardNoBin[13]=1;
CardNoBin[14]=0;
BCD_BIN();
for (i=65;i<70;i++)
CardNoBin[i]=1;
LRC();
for (i=75;i<80;i++)
CardNoBin[i]=0;
}

void SendData(void)
{
   if(Start_Flag==1)
	{
	 CLK_PIN=~CLK_PIN;		
	 	if(CLK_PIN==1)
		{
			if(CardNoBin[Data_Addr]==1)
			DataOut=0;
			if(CardNoBin[Data_Addr]==0)
			DataOut=1;
		//	DataOut=CardNoBin[Data_Addr];
			Data_Addr++;
			if(Data_Addr==80)
			{
				Start_Flag=0;
				Data_Addr=0;
				RevCardFlag=1;
			}
		}

	
	}

	if(RevCardFlag==1)
   	{
	
		if(CLK_PIN==1)
		{
		 Start_Flag=1;
		 DataOut=1;
		 RevCardFlag=0;
		}

   	}


}


void wait_ms(uchar ms)
{
   char SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page

   SFRPAGE = TMR2_PAGE;

   TMR2CN = 0x00;                      // Stop Timer3; Clear TF3;
   TMR2CF = 0x00;                      // use SYSCLK_PIN/12 as timebase

   RCAP2 = -(SYSCLK/1000/12);          // Timer 2 overflows at 1 kHz
   TMR2 = RCAP2;

   ET2 = 0;                            // Disable Timer 2 interrupts

   TR2 = 1;                            // Start_Flag Timer 2

   while(ms){
      TF2 = 0;
      while(!TF2);                     // wait until timer overflows
      ms--;                            // decrement ms
   }

   TR2 = 0;                            // Stop Timer 2

   SFRPAGE = SFRPAGE_SAVE;             // Restore SFRPAGE
}


void Timer3_Init (int counts)
{
   char SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page

   SFRPAGE = TMR3_PAGE;

   TMR3CN = 0x00;                      // Stop Timer3; Clear TF3;
   TMR3CF = 0x08;                      // use SYSCLK_PIN as timebase

   RCAP3   = -counts;                  // Init reload values
   TMR3    = RCAP3;                    // set to reload immediately
   EIE2   &= ~0x01;                    // disable Timer3 interrupts
   TR3 = 1;                            // Start_Flag Timer3

   SFRPAGE = SFRPAGE_SAVE;             // Restore SFR page
}

void delay(void)
{
uchar i,j,k;
for(i=0;i<255;i++)
for(j=0;j<255;j++)
for(k=0;k<255;k++);
}

⌨️ 快捷键说明

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