终于完成了韦根26查询法的程序了,IIC和串口通询昨天改好,因为现在没做到联网部分,所以没做联网方面的通讯协议和程序。
串口通讯程序
void Init(void) { TMOD|=0x21;//定时器1为方式2,定时器0方式1 TL1=0xfd; //初始值设置波特率为9600 // TH1=0xfd; ET0=1; TR1=1; //开定时器1 REN=1; //允许接收数据// SM0=0; SM1=1; EA=1; //开所有中断 ES=1; } void SEND(unsigned char *a) { uchar b; for(b=0;b<8;b++) { SBUF=*a; while(TI==0); TI=0; a=a+1; } } IIC总线24cxx读写通用程序 #include//#include #ifndef MCU_MODEL #define MCU_MODEL 51 // //在此设定51类MCU的头文件 // #include //_nop_()函数需要 // #include"xd.h" // #include"xdprj.h" //---------定义I2总线端口, 可根据实际使用改变----------- sbit SCL=P2^0; //I2总线时钟线 sbit SDA=P2^1; //I2总线数据线 #define SCL_L SCL=0 #define SCL_H SCL=1 #define SDA_L SDA=0 #define SDA_H SDA=1 #define SDA_TO_IN //为配合avr共用次程序而空定义的宏 #define SDA_TO_OUT //为配合avr共用次程序而空定义的宏 #define SDA_IF_L SDA==0 //如果sda为低 #define SDA_IF_H SDA==1 //如果sda为高 //------------------------------------------------------ #define DELAY_us _nop_(); _nop_(); _nop_(); _nop_(); _nop_()
//延时用,如果要加长延时,可增加或减少 _nop_(); //------------------------avr类MCU------------------------------- #elif MCU_MODEL==avr #include//在此设定avr类MCU的头文件 #include // #include"xd.h" // #include"xdprj.h" //-----定义I2总线端口, 可根据实际使用改变---- #define SCL_L PORTC&=~BIT(0) //I2总线时钟线 #define SCL_H PORTC|=BIT(0) #define SDA_L PORTC&=~BIT(1) //I2总线数据线 #define SDA_H PORTC|=BIT(1) #define SDA_TO_IN DDRC&=~BIT(1); _NOP() //设数据线位输入 #define SDA_TO_OUT DDRC|=BIT(1); _NOP() //设数据线位输出 #define SDA_IF_L (PINC&BIT(1))==0 //如果sda为低 #define SDA_IF_H (PINC&BIT(1))==BIT(1) //如果sda为高 //------------------------------------------- #define DELAY_us tus(7)
//avr单片机在晶振为8MHz时,延时5us, 可根据实际情况改变 #endif //--------------------------------------------------------------- //------在此设定芯片型号------ #define e2prom 2
//WGDATA[26]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//接收韦根数据26位 idata unsigned char WG[8]={0xaa,0xbb,0,0,0,0,0xcc,0xdd};//存韦根ID卡卡号的HID和PID码,其中HID码为8位即一字节,PID码16位两字节 uchar a,x,j,LL,II,YY; void ys100us(uint u) { uint y; uchar x; for(y=u;y>0;y--) { for(x=20;x>0;x--) _nop_(); } } void DATA(void) { if(DATA0!=DATA1) { if(DATA0==0) { WGDATA[Cnt]=0; if(Cnt==25) a=1; Cnt++; ys100us(15); } if(DATA1==0) { WGDATA[Cnt]=1; if(Cnt==25) a=1; Cnt++; ys100us(15); } } } bit re(void) { if(Read_Card()) { WG[3]=WGDATA[1]; WG[4]=WGDATA[2]; WG[5]=WGDATA[3]; return 1; // SEND(&WG[0]); } DATA(); if(a==1) { EA=0; //关中断以免外部中断的干扰 a=0; Cnt=0; // rd24c(ptr,0,10); // WG[0]=*ptr; for(x=1;x<9;x++) LL=(LL<<1)|WGDATA[x]; for(x=9;x<17;x++) II=(II<<1)|WGDATA[x]; for(x=17;x<25;x++) YY=(YY<<1)|WGDATA[x]; //WG[0]=rd24c(0); //ysms(100); WG[3]=LL; WG[4]=II; WG[5]=YY; EA=1; // SEND(&WG[0]); return 1; } return 0; }
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』