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

📄 11-3.1.c

📁 这是一个C51写的程序,采用Keil C51 编译开发.本程序是一个标准的串口收发程序.
💻 C
字号:
#include <reg51.h> 
unsigned char time;
unsigned int TR2,scl;

int my_s24();
int my_wd24();
int my_wd24();
int my_wd24();
int my_s24();
int my_wd24();
int d=my_rd24_ack();



void sen(unsigned char ctrl) {
	SBUF=ctrl;while (!TI) {}
	TI=0;
}
unsigned char rec(void) {
	time=0;
	while (!RI) {if (time>40) return(0);}
	RI=0;
	return(SBUF);
}

bit send_to_card(unsigned char no) {
	unsigned char d,i,j,k,dd;
	no--;
	sen(0xaa);	                             //向卡请求发送 
	if (rec()!=0xaa) return(1);
	sen(no);	                                  //送出储存块号
	if (rec()!=no) return(1);	                   //确认
	
	EA=0;TR2=1;
	for (k=0;k<4;k++) 
	   {
		my_s24();
		my_wd24(0xa0|(k<<1));
		scl=0;
		my_wd24(0);
		scl=0;
		my_wd24(0);
		scl=0;
		my_s24();
		my_wd24(0xa1|(k<<1));
		scl=0;
		d=my_rd24_ack();
		for (i=0;i<64;i++) {
			j=0;
			do {
				TI=0;
				SBUF=d;
				dd=my_rd24_ack();
				time=0;
				while (!RI) {
					if (TH2>200) {
						TH2=0;
						if ((++time)>40)
						{my_p24();
						EA=1;
						TR2=0;
						return(1);}
					}
				}
				RI=0;
				if (
				SBUF!=d) {my_p24();
				EA=1;
				TR2=0;
				return(1);
				}
				d=dd;
				j++;
			} while (j);
		}
		d=my_rd24();
		my_p24();
	}
	EA=1;TR2=0;
	return(0);
}

unsigned char idata buf[32];

bit write_buf(unsigned int as) {
	unsigned char e=0,i;
	while (e<3) {
		my_s24();
           my_wd24(0xa0|((as/16384)<<1));
          scl=0;
          my_wd24(as/256);
          scl=0;
          my_wd24(as);
          scl=0;
		for (i=0;i<32;i++) {my_wd24(buf[i]);
          scl=0;}
		my_p24();
		time=0;
		while (1) {
			my_s24();
			my_wd24(0xa0|((as/16384)<<1));
			sda=1;
			if (sda==0) break;
			if (time>10) break;
			scl=0;
		}
		scl=0;
		for (i=0;i<32;i++) {
			if (my_read(as+i)!=buf[i]) break;
		}
		if (i==32) return(0);
		e++;
	}
	return(1);
}

bit rec_from_card(unsigned char no) {
	unsigned int as;
	unsigned char d,i;
	no--;
	sen(0x55);	                                  //请求rec
	if (rec()!=0x55) return(1);
	sen(no);
	if (rec()!=no) return(1);
	REN=1;
	as=0;
	do {
		for (i=0;i<32;i++) {
			d=rec();
			if (time>40) return(1);
			TI=0;
			SBUF=d;
			buf[i]=d;
		}
		if (write_buf(as)) return(1);
		as+=32;
	} while (as);
	return(0);
}

⌨️ 快捷键说明

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