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

📄 comm.c

📁 这是我做的关于考勤机的一些测试程序
💻 C
字号:
/******************************************************************
 *                    copyright  2004                          *
*******************************************************************
		文件名称:   comm.c
		文件版本:   2.00
		创建人:	 于冬梅
		创建日期:   2004.03.10
		功能描述:   考勤机串口通讯程序
		相关硬件:    AT89S52,11.0592M晶震
		修改记录:    2002.11.8汇编版本
					  
		
*******************************************************************/
 #include "kqj.h"
extern uchar re_buf[14];		//串口接收缓冲区
extern uchar tr_buf[22];		//串口发送缓冲区,串口发送缓冲区的第一个值是 mcu_adr
extern uchar re_num;			//接收计数单元
extern uchar tr_num;
extern uchar tr_pointer;
extern uchar re_pointer;
 void inti_comm()
 {
 	RCAP2H=0XFF;
	RCAP2L=0XDC;		//;ffb2	12m, 4800
						//	;ffb8  11.0592 4800; ffdch 11.0592 9600
 	
	SCON=0x50;
	T2CON=T2CON|0X30;
	TR2=1;
	ES=1;
	
 }

//串口中断服务子程序
void serial(void) interrupt 4
{
	uchar  temp;

	if(TI)
	{
		TI=0;
/*		tr_num--;
		
      	if(tr_num==0){tr_num=4;tr_pointer=0; return;}
      else
	{
	  SBUF=tr_buf[++tr_pointer];	
		}
	     
*/			
	}
	if(RI)
	{
		RI=0;
		temp=SBUF;
		re_buf[re_pointer++]=SBUF;
		SBUF=temp;	
		re_num--;
		if(re_num==0)
		{
		 re_pointer=0;
		 re_num=4;
		/*
			if(re_crc(re_buf[2])) re_wr_ack(0x00);
			else  re_wr_ack(0xee);
			re_num=0x04;
		*/
		}


	
	}
}


//接收写命令应答祯
//帧格式:
//地址码	命令码	00H或eeh	校验和

void re_wr_ack(uchar type )
{
	uchar crc=0;
	//第一个字节,本机的地址已存在串口发送缓冲中,直接发送
	SBUF=tr_buf[0];
	tr_buf[1]=re_buf[1];		//命令码
	tr_buf[2]=type;				//正常应答祯数据标志
	crc=tr_buf[0]+tr_buf[1];
	crc=crc+tr_buf[2];
	tr_buf[3]=crc;
	tr_num=0x04;
	tr_pointer=0x00;
	
}


void wr_sram()
{
	switch (re_buf[1])							//命令代码
	{
		case 0xb1:								//写卡号命令wr_card()
		{
			wr_card(re_buf[3]);
		}
		break;
		case 0xb2:								//写时间命令wr_time();
		{
			wr_time();
		}
		break;
		case 0xb3:								//写语音段号命令wr_sound();
		{
			wr_sound();
		}
		break;
		case 0xb4:								//写删除命令 wr_erase();
		{
		   wr_erase();
		}
		break;
		case 0xb5:								//初始化命令 wr_inti();
		{
			wr_inti();
		}
		break;
		default :
		{
		}
		break;
	}
}

void rd_record_ack()
{
}

//接收校验和正确,返回1,错误,返回0
//datanum 接收祯的数据域长度
bit  re_crc(uchar datanum)
{
	uchar crc;
	uchar i;
	crc=re_buf[0]+re_buf[1];	//地址码+命令码
	crc=crc+datanum;			//加数据域长度 re_buf[2]
	if(datanum==0&&crc==re_buf[3]) return 1;	//读命令校验
//	if(re_buf[2]==0&&crc==re_buf[3])return 1;
	else
	{
		for(i=3;i<datanum+3;i++)
		crc=crc+re_buf[i];
		if(crc==re_buf[datanum+3]) return 1;
	}
	return 0;
}

⌨️ 快捷键说明

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