我做的125KHZ的RFID读头,在晶振为11.0592MHz下,读一切正常,但是我把晶振频率提高到18.432MHz时就不能读了,真心求教!!!!!
#include<STC15F2K60S2.h>
#include <stdio.h>
sbit LED=P0^0; //指示灯
sbit INPORT=P1^0; //解码输入
//用来区分脉冲宽度的参数
#define TIME00 50
#define TIME05 260
#define TIME10 550
bit bitin; //上一次的状态位
unsigned char Buff[30]; //解码缓冲区
unsigned char buff0[6];
void delay_ms(unsigned int ms) //延时函数
{
unsigned char i;
while(ms--)
{
i=112;
while(i--);
}
}
void printchar(unsigned char ch) //显示16进制数
{
if(ch>=0&&ch<=9) ch=ch+'0';
else if(ch>=10&&ch<=15) ch=ch+'A'-10;
putchar(ch);
}
void printhex(unsigned char hex) //以16进制格式输出一个字节
{
unsigned char c;
c=hex;
c=c>>4;
printchar(c);
c=hex;
c=c&0x0F;
printchar(c);
}
//监测数据位
unsigned char readbit()
{
unsigned int mk=TIME10; //装入超时值
TL0=TH0=0; //初始化计数器
TR0=1; //开始计时
while(--mk) //超时机制,防止等死
if(bitin!=INPORT) //有跳变
{
break;
}
TR0=0; //停止计时
if(mk==0) //超时退出
return 0;
bitin=INPORT; //保存状态
mk=TH0*256+TL0; //计算跳变的脉冲宽度
if((mk>TIME05)&&(mk<=TIME10)) //一个周期
return 1;
if((mk>=TIME00)&&(mk<=TIME05)) //半个周期
return 2;
return 0; //出错
}
//读一个完整地数据位
unsigned char readdata()
{
switch(readbit())
{
case 1:
return !bitin;
case 2:
if(readbit()!=2) return 2;
return !bitin;
default:
return 2;
}
}
//接收并解码
bit CheckData()
{
unsigned char i,j;
bitin=INPORT; //保存状态位
for(i=0;i<9;i++) //检测9个数据位1
{
LED=1;
if(readdata()!=1)
{
return 0;
}
}
//读取数据
for(i=0;i<11;i++) //5个字节写数据
{
Buff[i]=0x00;
for(j=0;j<5;j++) //往一个字节写数据
{
Buff[i]<<=1;
switch(readdata())
{
case 0: //0
break;
case 1: //1
Buff[i]|=0x08;
break;
case 2: //err
return 0;
}
}
}
//结束位
if(Buff[10]&0x08!=0x00)
{
return 0;
}
//行奇校验
for(i=0;i<10;i++)
if((((Buff[i]>>4) ^
(Buff[i]>>3) ^
(Buff[i]>>2) ^
(Buff[i]>>1) ^
Buff[i])&0x08)!=0)
return 0;
//列奇校验
j=0;
for(i=0;i<11;i++)
j=j ^ (Buff[i]&0x80);
if(j!=0)
return 0;
for(i=0;i<11;i++)
j=j ^ (Buff[i]&0x40);
if(j!=0)
return 0;
for(i=0;i<11;i++)
j=j ^ (Buff[i]&0x20);
if(j!=0)
return 0;
for(i=0;i<11;i++)
j=j ^ (Buff[i]&0x10);
if(j!=0)
return 0;
//完成
return 1;
}
bit ReadCardNo()
{
if(CheckData()) //检测卡
{
unsigned char i;
Buff[0]=(Buff[0] & 0xF0) | (Buff[1]>>4 & 0x0F); buff0[0]=Buff[0];
Buff[1]=(Buff[2] & 0xF0) | (Buff[3]>>4 & 0x0F); buff0[1]=Buff[1];
Buff[2]=(Buff[4] & 0xF0) | (Buff[5]>>4 & 0x0F); buff0[2]=Buff[2];
Buff[3]=(Buff[6] & 0xF0) | (Buff[7]>>4 & 0x0F); buff0[3]=Buff[3];
Buff[4]=(Buff[8] & 0xF0) | (Buff[9]>>4 & 0x0F); buff0[4]=Buff[4];
buff0[5]=buff0[0]^buff0[1]^buff0[2]^buff0[3]^buff0[4];
LED=1;
for(i=0;i<6;i++)
printhex(buff0[i]);
putchar('
');
delay_ms(300);
LED=0;
delay_ms(20000);
return 1;
}
return 0;
}
void init(void)
{
PCON=0x00;
SCON=0x50;
TMOD=0x00;
T2H=(65536-(18432000/4/9600))/256;
T2L=(65536-(18432000/4/9600))%256;
AUXR=0x15;
ES=1;
EA=1;
TI=1;
INPORT=1;
delay_ms(300);
}
main()
{
init()
delay_ms(300);
LED=1;
delay_ms(3000);
LED=0;
printf("Start
");
while(1)
{
ReadCardNo();
}
}
此帖出自
小平头技术问答
当然也可以用单片机定时器产生,使用单片机的CLKOUT引脚输出125KHZ,不过好像在11.0592MHz下没成功,16MHz以上实验成功
这个应该是40位吧!
一周热门 更多>