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

📄 111.c

📁 125k t5557卡 读写
💻 C
字号:
/****************temic*********t5557***********************************/   
#include   "at892051.h"    
#include   "string.h"    
#include   "intrins.h"    
#include   "stdio.h"    
#define    uchar    unsigned char    
#define    uint     unsigned int    
#define    ulong    unsigned long    
//STC12C2051AD的SFR定义    
sfr  WDT_CONTR = 0xe1;//stc2051的看门狗??????    
/**********全局常量************/   
//写卡的命令    
#define    write_command0       0//写密码    
#define    write_command1       1//写配置字    
#define    write_command2       2//密码写数据    
#define    write_command3       3//唤醒    
#define    write_command4       4//停止命令    
#define    TRUE       1    
#define    FALSE      0    
#define    OK         0    
#define    ERROR      255    
//读卡的时间参数us    
#define ts_min          250//270*11.0592/12=249//取近似的整数    
#define ts_max          304//330*11.0592/12=304    
#define t1_min          73//90*11.0592/12=83:-10调整    
#define t1_max          156//180*11.0592/12=166    
#define t2_min          184//210*11.0592/12=194    
#define t2_max          267//300*11.0592/12=276    
   
///***********不采用中断处理:采用查询的方法读卡时关所有中断****************/    
sbit p_U2270B_Standby = P3^5;//p_U2270B_Standby BIT P3.5;AT89C2051:T1;    
sbit p_U2270B_CFE     = P3^3;//p_U2270B_CFE     BIT p3.3;AT89C2051:INT1    
sbit p_U2270B_OutPut  = P3^7;//p_U2270B_OutPut  BIT p3.7;AT89C2051:    
sbit wtd_sck      = P1^7;//SPI总线    
sbit wtd_si       = P1^3;   
sbit wtd_so       = P1^2;   
   
sbit   iic_data   = P1^2;//lcd IIC    
sbit   iic_clk    = P1^7;   
   
sbit   led_light  = P1^6;//测试绿灯    
sbit   led_light1 = P1^5;//测试红灯    
sbit   led_light_ok  = P1^1;//读卡成功标志    
sbit   fengmingqi = P1^5;   
/***********全局变量************************************/   
/////////////////////////////////////////////////////////    
        uchar data Nkey_a[4]    =  {0xA0, 0xA1, 0xA2, 0xA3};//初始密码            
        //uchar idata card_snr[4];   //配置字    
        uchar data bankdata[28]={1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7};     //存储卡上用户数据(1-7)7*4=28    
        uchar data cominceptbuff[6]={1,2,3,4,5,6};//串口接收数组ram    
uchar command; //第一个命令    
uchar command1;//    
//uint  temp;    
uchar j,i;   
uchar myaddr=8;   
//uchar ywqz_count,time_count;             //ywqz jishu:    
uchar bdata DATA;   
sbit BIT0=DATA^0;   
sbit BIT1=DATA^1;   
sbit BIT2=DATA^2;   
sbit BIT3=DATA^3;   
sbit BIT4=DATA^4;   
sbit BIT5=DATA^5;   
sbit BIT6=DATA^6;   
sbit BIT7=DATA^7;   
   
uchar bdata DATA1;   
sbit BIT10=DATA1^0;   
sbit BIT11=DATA1^1;   
sbit BIT12=DATA1^2;   
sbit BIT13=DATA1^3;   
sbit BIT14=DATA1^4;   
sbit BIT15=DATA1^5;   
sbit BIT16=DATA1^6;   
sbit BIT17=DATA1^7;   
   
bit i_CurrentLevel;//i_CurrentLevel  BIT 00H(Saves current level of OutPut pin of U2270B)    
bit timer1_end;   
bit read_ok=0;   
//缓存定时值,因用同一个定时器    
union HLint{uint W;   
            struct{uchar H;uchar L;}B;};//union HLint idata a    
union HLint data a;   
//缓存定时值,因用同一个定时器    
union HLint0{uint W;   
            struct{uchar H;uchar L;}B;};//union HLint idata a    
union HLint0 data b;   
/**********************函数原型*****************/   
//读写操作    
void f_readcard(void);//全部读出1~7 AOR唤醒    
void f_writecard(uchar x);//根据命令写不同的内容和操作    
void f_clearpassword(void);//清除密码    
void f_changepassword(void);//修改密码    
//功能子函数    
void write_password(uchar data *data p);//写初始密码或数据    
void write_block(uchar x,uchar data *data p);//不能用通用指针    
void write_bit(bit x);//写位    

/*子函数区*****************************************************/   
void delay_2(uint x)    //延时,时间x*10us@12MHz,最小20us@12MHz    
{   
    x--;x--;   
    while(x)   
    {   
        _nop_();   
        _nop_();   
        x--;   
    }   
    _nop_();//WDT_CONTR=0X3C;不能频繁的复位    
    _nop_();   
}   
/////////////////////////////////////////////////////////////////////    
void initial(void)   
{   
       
    SCON = 0x50; //串口方式1,允许接收    
    //SCON  =0x50;    
    //01010000B:10位异步收发,波特率可变,SM2=0不用接收到有效停止位才RI=1,    
    //REN=1允许接收    
    TMOD = 0x21; //定时器1 定时方式2(8位),定时器0 定时方式1(16位)    
   
    TCON = 0x40; //设定时器1 允许开始计时(IT1=1)    
   
    TH1 = 0xfD;  //FB 18.432MHz 9600 波特率    
   
    TL1 = 0xfD;  //fd 11.0592 9600    
   
    IE=0X90;     //EA=ES=1    
       
    TR1 = 1;     //启动定时器    
          
    WDT_CONTR=0x3c;//使能看门狗    
   
    p_U2270B_Standby=0;//单电源    
       
    PCON  =0x00;   
   
    IP    =0x10;//uart you xian XXXPS PT1 PX1 PT0 PX0    
       
    led_light1 =1;   
    led_light =0;   
    p_U2270B_OutPut=1;   
}   
/************************************************/   
void f_readcard()//读卡    
{   
    EA=0;//全关,防止影响跳变的定时器计时    
    WDT_CONTR=0X3C;//喂狗    
    p_U2270B_CFE=1;//     
    delay_2(232);  //>2.5ms           
    /*  
    //   aor    用唤醒功能来防碰撞  
    p_U2270B_CFE=0;delay_2(18);//start gap>150us  
    write_bit(1);//10=操作码读0页  
    write_bit(0);      
    write_password(&bankdata[24]);//密码block7  
    p_U2270B_CFE=1;//   
    delay_2(516);//编程及确认时间5.6ms  
    */   
    WDT_CONTR=0X3C;//喂狗    
    led_light=0;   
    b.W=0;   
    while(!(read_ok==1))   
    {          
        //while(p_U2270B_OutPut);//等一个稳定的低电平?超时判断?           
        while(!p_U2270B_OutPut);//等待上升沿的到来同步信号检测1    
        TR0=1;   
        //deng xia jiang    
        while(p_U2270B_OutPut);//等待下降沿    
        TR0=0;a.B.H=TH0;a.B.L=TL0;TH0=TL0=0;TR0=1;//定时器晚启动10个周期    
            //同步头    
        if((324 < a.W)&&(a.W < 353)) ;//检测同步信号1               
        else {TR0=0;TH0=TL0=0;goto read_error;}   
        //等待上升沿     
        while(!p_U2270B_OutPut);TR0=0;a.B.H=TH0;a.B.L=TL0;TH0=TL0=0;TR0=1;//b.N1<<=8;         
        if(a.B.L < 195);//0.5p    
        else {TR0=0;TH0=TL0=0;goto read_error;}   
           
        //读0~7块的数据    
        for(j=0;j<28;j++)   
        {   
            //uchar i;              
            for(i=0;i<16;i++)//8个位    
            {   
                //等待下降沿的到来    
                while(p_U2270B_OutPut);           
                TR0=0;a.B.H=TH0;a.B.L=TL0;TH0=TL0=0;TR0=1;         
                   
                if(t2_max < a.W/*)&&(a.W < t2_max)*/)//1P     
                {   
                    b.W>>=2;//先左移再赋值    
                    b.B.L+=0xc0;                       
                    i++;   
                }   
                else if(t1_min < a.B.L/*)&&(a.B.L < t1_max)*/)//0.5p    
                {   
                    b.W>>=1;   
                    b.B.L+=0x80;                      
                }   
                else {TR0=0;TH0=TL0=0;goto read_error;}   
                i++;   
                while(!p_U2270B_OutPut);//上升              
                TR0=0;a.B.H=TH0;a.B.L=TL0;TH0=TL0=0;TR0=1;                 
                if(t2_min < a.W/*)&&(a.W < t2_max)*/)//1P     
                {   
                    b.W>>=2;   
                       
                    i++;   
                }   
                else if(t1_min < a.B.L/*a.W)&&(a.B.L < t1_max)*/)//0.5P    
                //else if(!(a.W==0))    
                {   
                    b.W>>=1;   
                    //temp+=0x00;    
                    //led_light1=0;led_light=1;delay_2(40000);    
                }   
                else {TR0=0;TH0=TL0=0;goto read_error;}   
                i++;   
            }   
        //取出奇位    
        DATA=b.B.L;   
        BIT13=BIT7;BIT12=BIT5;BIT11=BIT3;BIT10=BIT1;   
        DATA=b.B.H;   
        BIT17=BIT7;BIT16=BIT5;BIT15=BIT3;BIT14=BIT1;   
        bankdata[j]=DATA1;   
        }           
    read_ok=1;//读卡完成了    
    read_error:_nop_();   
    }      
}   
/***************************************************/   
   
void f_writecard(uchar x)//写卡    
{   
    p_U2270B_CFE=1;   
    delay_2(232);  //>2.5ms           
    //psw=0 standard write    
    if (x==write_command0)//写密码:初始化密码    
    {   
        uchar i;   
        uchar data *data p;   
        p=cominceptbuff;   
        p_U2270B_CFE=0;delay_2(31);//start gap>330us    
        write_bit(1);//写操作码1:10    
        write_bit(0);//写操作码0    
        write_bit(0);//写锁定位0    
        for(i=0;i<35;i++)   
        {   
        write_bit(1);//写数据位1    
        }   
        p_U2270B_CFE=1;   
        led_light1=0;led_light=1;delay_2(40000);//测试使用    
   
   
   
        //write_block(cominceptbuff[4],p);    
        p_U2270B_CFE=1;   
        bankdata[20]=cominceptbuff[0];//密码存入    
        bankdata[21]=cominceptbuff[1];   
        bankdata[22]=cominceptbuff[2];   
        bankdata[23]=cominceptbuff[3];   
    }   
    else if (x==write_command1)//配置卡参数:初始化    
    {   
        uchar data *data p;   
        p=cominceptbuff;   
        write_bit(1);//写操作码1:10    
        write_bit(0);//写操作码0    
        write_bit(0);//写锁定位0            
        write_block(cominceptbuff[4],p);   
        p_U2270B_CFE=1;   
    }   
    //psw=1  pssword mode    
    else if(x==write_command2)//    
    {   
        uchar data*data p;   
        p=&bankdata[24];   
        write_bit(1);//写操作码1:10    
        write_bit(0);//写操作码0    
        write_password(p);//发口令    
        write_bit(0);//写锁定位0    
        p=cominceptbuff;   
        write_block(cominceptbuff[4],p);//写数据           
    }   
    else if(x==write_command3)//aor    
    {   
        //cominceptbuff[1]操作码10 X xxxxxB    
        uchar data *data p;   
        p=cominceptbuff;   
        write_bit(1);//10    
        write_bit(0);          
        write_password(p);//密码    
        p_U2270B_CFE=1;//此时数据不停的循环传出    
    }   
    else //停止操作码    
    {   
        write_bit(1);//11    
        write_bit(1);          
        p_U2270B_CFE=1;        
    }   
    p_U2270B_CFE=1;   
    delay_2(560);//5.6ms    
}   
   
/************************************/   
void f_clearpassword()//清除密码    
{   
        uchar data *data p;   
        uchar i,x;         
        p=&bankdata[24];//原密码    
        p_U2270B_CFE=0;delay_2(18);//start gap>150us    
        //操作码10:10xxxxxxB    
        write_bit(1);   
        write_bit(0);             
        for(x=0;x<4;x++)//发原密码    
        {          
            DATA=*(p++);   
            for(i=0;i<8;i++)   
            {   
                write_bit(BIT0);   
                DATA>>=1;   
            }   
        }   
        write_bit(0);//锁定位0:0    
        p=&cominceptbuff[0];   
        write_block(0x00,p);//写新配置参数:pwd=0            
        //密码无效:即清除密码    
        DATA=0x00;//停止操作码00000000B    
        for(i=0;i<2;i++)   
        {   
            write_bit(BIT7);   
            DATA<<=1;   
        }   
        p_U2270B_CFE=1;      
        delay_2(560);//5.6ms    
}   
/********************************  
*/   
void f_changepassword()//修改密码           
{      
        uchar data *data p;   
        uchar i,x,addr;   
        addr=0x07;//block7    
        p=&Nkey_a[0];//原密码    
        DATA=0x80;//操作码10:10xxxxxxB    
        for(i=0;i<2;i++)   
        {   
            write_bit(BIT7);   
            DATA<<=1;   
        }   
        for(x=0;x<4;x++)//发原密码    
        {          
            DATA=*(p++);   
            for(i=0;i<8;i++)   
            {   
                write_bit(BIT7);   
                DATA>>=1;   
            }   
        }   
        write_bit(0);//锁定位0:0    
        p=&cominceptbuff[0];   
        write_block(0x07,p);//写新密码    
        p_U2270B_CFE=1;   
        bankdata[24]=cominceptbuff[0];//密码存入    
        bankdata[25]=cominceptbuff[1];   
        bankdata[26]=cominceptbuff[2];   
        bankdata[27]=cominceptbuff[3];   
        //    
        DATA=0x00;//停止操作码00000000B    
        for(i=0;i<2;i++)   
        {   
            write_bit(BIT7);   
            DATA<<=1;   
        }   
        p_U2270B_CFE=1;      
        delay_2(560);//5.6ms    
}   
/************T0***************/   
   
/***************************子函数**********************************  
*/   
void write_bit(bit x)//写一位    
{   
    if(x)   
    {   
        p_U2270B_CFE=1;delay_2(32);//448*11.0592/120=42延时448us    
        p_U2270B_CFE=0;delay_2(28);//280*11.0592/120=26写1    
    }   
    else   
    {   
        p_U2270B_CFE=1;delay_2(92);//192*11.0592/120=18    
        p_U2270B_CFE=0;delay_2(28);//280*11.0592/120=26写0    
    }   
}   
/*******************写一个block*******************/   
void write_block(uchar addr,uchar data *data p)   
{   
    uchar i,j;       
    for(i=0;i<4;i++)//block0数据    
    {          
        DATA=*(p++);   
        for(j=0;j<8;j++)   
        {   
            write_bit(BIT0);   
            DATA>>=1;   
        }   
    }   
    DATA=addr<<=5;//0地址    
    for(i=0;i<3;i++)   
    {   
        write_bit(BIT7);   
        DATA<<=1;   
    }                  
}   
/************************************************  
*/   
void write_password(uchar data *data p)   
{   
    uchar i,j;       
    for(i=0;i<4;i++)//    
    {          
        DATA=*(p++);   
        for(j=0;j<8;j++)   
        {   
            write_bit(BIT0);   
            DATA>>=1;   
        }   
    }       
}   
void main()   
{   
    initial();   
    TI=RI=0;   
    ES=1;   
    EA=1; 
	delay_2(28);  
    //f_readcard();    
    while(1){
	    f_readcard();  
		f_writecard(command1);
		f_clearpassword();
		f_changepassword();  
	    
    }
}

⌨️ 快捷键说明

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