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

📄 sp89com.c

📁 单片机c语言资料,这是不错的资料,对大家学习单片机有很大帮助哦
💻 C
字号:
/*P89CXX 编程器电脑发送程序*/
#include "stdio.h"
#include "dos.h"
#include "process.h"
#include "string.h"
#include "time.h"
float start_time;


#define b_init 0

#define b_erase 1
#define b_erase_block 2				/*P89C51RC+、P89C51RD+特有*/
#define b_erase_sbyte_bvec 3		/*P89C51RC+、P89C51RD+特有*/

#define b_read 4

#define b_program_byte 5
#define b_program_sbyte 6			/*P89C51RC+、P89C51RD+特有*/
#define b_program_boot_vector 7		/*P89C51RC+、P89C51RD+特有*/

#define b_lock1 8
#define b_lock12 9
#define b_lock123 10

#define b_cpu 12					/*定义需要编程的cpu类型,0:P89C51 1:P89C52 2:P89C54 3:P89C58 4:P89C51RC+ 5:P89C51RD+*/


unsigned char *cpu_d[]={{"P89C51U"},{"P89C52U"},{"P89C54U"},{"P89C58U"},{"P89C51RC+"},{"P89C51RD+"}};


void init_com3(void) {
	outportb(0x3eb,0x80);
	outportb(0x3e8,1);
	outportb(0x3e9,0x0);
	outportb(0x3eb,0x3);
}
void sen_com3(unsigned char d) {
	long i;
	while (!(inportb(0x3ed)&0x20));
	outportb(0x3ed,0x0);
	outportb(0x3e8,d);
	i=clock();
	while (1) {
		if (clock()>(i+9)) {printf("Time out.\n\7\7");exit(1);}
		if ((inp(0x3ed)&0x1)==1) break;
	}
	if (inp(0x3e8)!=d) {printf("CRC error.\n");exit(1);}
}
unsigned char rec_com3(void) {
	long i;
	unsigned char d;
	i=clock();
	while (1) {
		if (clock()>(i+9)) {printf("Time out.\n\7\7");exit(1);}
		if ((inp(0x3ed)&1)==1) break;
	}
	d=inp(0x3e8);
	while (!(inportb(0x3ed)&0x20));
	outportb(0x3ed,0x0);
	outportb(0x3e8,d);
	return(d);
}



void select_cpu(unsigned char cpu) {
	long i;
	printf(" Testing CPU ...           ");
	sen_com3(0x0);	/*send start byte*/
	sen_com3(b_cpu);
	sen_com3(cpu);
	if (rec_com3()) {
		fcloseall();
		printf(" CPU not ready or CPU type error!\n\7\7");
		exit(1);
	}
	printf(" The CPU is %s. \n",cpu_d[cpu]);
}

void init_cpu(void) {
	unsigned char temp;
	printf(" Initialize CPU ...        ");
	sen_com3(0x0);/*send start byte*/
	sen_com3(b_init);
	while (1) {
		temp=rec_com3();
		if (temp==0) break;
		else if (temp==1) {
			fcloseall();
			printf(" Error!\7\n");
			exit(1);
		}
	}
	printf(" Success.\n");
}

void lock_cpu(void) {
	unsigned char temp;
	printf(" Lock CPU ...              ");
	sen_com3(0);	/*send start byte*/
	sen_com3(b_lock123);
	while (1) {
		temp=rec_com3();
		if (temp==0) break;
		else if (temp==1) {
			fcloseall();
			printf(" Error!\7\n");
			exit(1);
		}
	}
	printf(" Success.\n                Total used  %3.2f seconds.\n\7",(clock()-start_time)/18.2);
}

void program(FILE *fp1) {
	unsigned char y,d;
	unsigned int lenth=0;
	long i;
	printf(" Programing ...            ");
	sen_com3(0);	/*send start btye*/
	sen_com3(b_program_byte);
	y=wherey();
	while (! (feof(fp1)) ) {
		sen_com3(getc(fp1));
		if ((lenth%0x100)==0) {
			gotoxy(18,y);printf("%4x BYTE  ",lenth);
		}
		lenth++;
	}
	gotoxy(18,y);printf("%4x BYTE  ",lenth-1);
	i=clock();while (clock()<(i+9)) {}
	gotoxy(28,y);
	printf(" Success.\n");
	fclose(fp1);
}
void main(char n,char *d[]) {
	unsigned char cpu;
	FILE *fp1;
	unsigned char chip;
	switch (n) {
	case 1:
		printf(" Please select file.\n\7");
		exit(1);
		break;
	case 2:
		printf(" Please select CPU type.\n");
		exit(1);
		break;
	case 3:
		printf(" Please select pararmeter.\n");
		exit(1);
		break;
	case 4:
		if ((fp1=fopen(*(d+1),"rb"))==NULL) {
			printf ("  File no found.\n\7\7");
			exit(1);
		}
		for (cpu=0;cpu<6;cpu++) {
			if (strcmp(*(d+2),*(cpu_d+cpu))==0) break;
		}
		if (cpu==6) {
			printf(" CPU tpye error.\n");
			exit(1);
		}
		init_com3();
		start_time=clock();
		select_cpu(cpu);

		switch (d[3][0]) {
		case 'P':
		case 'p':
			program(fp1);
			break;
		case 'i':
		case 'I':
			init_cpu();
			break;
		case 'l':
		case 'L':
			lock_cpu();
			break;
		case 'a':
		case 'A':
			init_cpu();
			program(fp1);
			lock_cpu();
			break;
		}
		break;
	}
}

⌨️ 快捷键说明

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