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

📄 wm-01t.c

📁 单片机数据通讯典型应用(光盘内容)
💻 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 + -