📄 wm-01t.c
字号:
#include <reg51.h>
//***************************宏定义***********************************
#define uchar unsigned char
#define uint unsigned int
#define N 8 //卡号读取计数
//***************************变量定义********************************
bit flag=0; //成功接收一字节
uchar idstore; //保存串口读取的字节
uchar id_buf[N]={0}; //卡号数据存储单元
enum bool{false,true}; //布尔枚举类型定义
//**************************函数声明***********************************
void delay(uint number); //延时函数
void Init(void); //串口初始化
enum bool check(uchar *id); //数据校验处理
long icIDdeal(void); //IC卡号处理函数
//**************************主函数************************************
void main()
{
long icID=0; //IC卡号,默认为0
Init(); //系统初始化
delay(100); //延时100ms以使系统完全初始化结束
ES=1; //使能串行中断
EA=1; //使能总中断
while(1)
{
icID=icIDdeal(); //获取IC卡号,再获得IC卡号icID后,
//可以对icID做进一步处理, 譬如卡号显示等
//此处添加其他对icID的处理程序;
}
}
//***************************延时子程序*********************************
void delay(uint number)
{
uchar temp;
for(;number>0;number--)
for(temp=112;temp>0;temp--);
}
//********************系统初始化程序**********************
void Init(void)
{
ES=0; // 关闭串口中断
EA=0; // 关闭所有中断
TMOD=0x20; //定时器1八位自动重装
TL1=0xFD; //在11.0592晶振下,波特率9600
TH1=0xFD;
SCON=0x50; //串口工作于方式1,10位异步,定时器控制
PCON=0x00;
TR1=1; //开启定时器1
}
//***********************数据校验处理*******************************
enum bool check(uchar *id)
{
enum bool Bool; //保存校验结果,true表示读取卡号正确
//false表示卡号错误
uchar i;
uchar checkdata=id[0];
if(id[0]==0xAA&&id[1]==0xFF) //命令码是否为AA和FF
{
for(i=0;i<6;i++) //读取数据的前7字节异或
checkdata^=id[i+1];
if(checkdata==id[7]) //异或值是否与第8字节相等
Bool=true;
else
Bool=false;
}
else
Bool=false;
return Bool; //校验结果返回
}
//***********************IC卡号处理函数*******************************
long icIDdeal(void)
{
uchar count=0;
long icID=0;
enum bool Bool;
while(count<N) //存储N个串口数据
{
if(flag) //有新的串口数据
{
id_buf[count++]=idstore;
flag=0; //新数据产生位标志复位
}
}
Bool=check(id_buf); //数据校验
if(Bool==true) //校验成功
icID=id_buf[3]<<24+id_buf[4]<<16+id_buf[5]<<8+id_buf[6];
return icID;
}
//***********************串口接收中断程序*******************************
void serial_rev()interrupt 4 using 3
{
if(RI)
{
RI=0;
idstore=SBUF;
flag= 1; //成功接收字符,置位取数标志
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -