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