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

📄 serires sub.c

📁 本程序实现通过BDM方式访问MOTOROLA 9S12单片机EEPROM
💻 C
字号:
#include <reg54.h>
#include <delay subroutine.h>
#include <byteone.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit BDR=P1^5;
sbit BDT=P3^5;
sbit RES=P1^7;
uchar xdata Eeprom[4096];

extern uchar Instruction[5]; 
/*
void Timer_ini()
{
	TH1=0xff;
	TL1=0x01;

	TMOD=0x20;	
	SCON=0x50;
	PCON=0x80;
}

void timer1_isr(void) interrupt 3 using 0
{	
	TH1=0x75;
	TL1=0x5f;
	
}
void Timer_Delay(uchar TL1_value,TH1_value)
{
	TR1=0;	
	TH1=TH1_value;
	TL1=TL1_value;

	TMOD=0x10;
	TR1=1; 			//启动定时器1
	while(TF1!=1);
//	TF1=0;
	TR1=0;	
}*/

uint Baud_Config()
{
	int ii;
	uchar bytehh,bytell;
	uint Baud_byte_r;
	uint Baud_vh;
	Baud_vh=1;
//	Baud_vl=1;

	BDT=0;
	RES=0;
	delay100ms();
	RES=1; 
	delay100ms();
	BDT=1;
	delay100ms();
	
	Trbyte(0x90,Baud_vh,Baud_vh);
	delay10ms();
	for(ii=0;ii<1000;ii++)
	{
		delay10ms();
		Baud_byte_r=Baud_vh+1;
		Trbyte(0xe0,Baud_vh,Baud_vh);Trbyte(0x00,Baud_vh,Baud_vh);Trbyte(0x0b,Baud_vh,Baud_vh);//e0 00 0b
		delay10us();delay10us();
		bytehh=RecByte(Baud_byte_r);
		bytell=RecByte(Baud_byte_r);
	//	output(bytell);
	//	delay1ms();
		if(bytell!=0x00)
			{
			Baud_vh+=1;
			
//			Baud_vl+=1;
			continue;
			}
		break;
	}

	
	Trbyte(0xe4,Baud_vh,Baud_vh);Trbyte(0xff,Baud_vh,Baud_vh);Trbyte(0x01,Baud_vh,Baud_vh);//e4 ff 01
	delay10us();delay10us();
	bytehh=RecByte(Baud_byte_r);
	bytell=RecByte(Baud_byte_r);
//	output(bytell);					//
	if((bytell & 0xc0) == 0xc0)
		{
		output(0x55);
		output(0xbb);	
		}
	else
		{
		output(0xaa);
		output(0x00);

		P4 &= ~(1 << 3);			//报错点亮红灯+

		P4 &= ~(1 << 1);
		delay200ms();delay200ms();
		P4 |= (1 << 1);						//蜂鸣器
		delay200ms();delay200ms();
		P4 &= ~(1 << 1);
		delay200ms();delay200ms();
		P4 |= (1 << 1);						//蜂鸣器
		delay200ms();delay200ms();
		P4 &= ~(1 << 1);
		delay200ms();delay200ms();
		P4 |= (1 << 1);						//蜂鸣器 

		  #pragma asm
		   ljmp   8000h
		  #pragma endasm
		}	
	
	return(Baud_vh);
}

void Tr_write_sequence(uchar byte1,byte2,byte3,byte4,byte5,uint byte_config_sub)
{
	Trbyte(byte1,byte_config_sub,byte_config_sub);
	Trbyte(byte2,byte_config_sub,byte_config_sub);
	Trbyte(byte3,byte_config_sub,byte_config_sub);
	Trbyte(byte4,byte_config_sub,byte_config_sub);
	Trbyte(byte5,byte_config_sub,byte_config_sub);
}

void Config_Eeprom(uint byte_config)
{	
	delay104us();
	Tr_write_sequence(0xc0,0x00,0x12,0x41,0x41,byte_config);	
	delay1ms();delay1ms();

	Tr_write_sequence(0xc0,0x00,0x10,0x00,0x00,byte_config);
	delay1ms();delay1ms();

	Tr_write_sequence(0xc0,0x01,0x10,0x05,0x05,byte_config);	//4a
	delay1ms();delay1ms();

	Tr_write_sequence(0xc0,0x01,0x12,0x00,0x00,byte_config);	
	delay1ms();delay1ms();

	Tr_write_sequence(0xc0,0x01,0x14,0xff,0xff,byte_config);	
	delay1ms();delay1ms();

//	Tr_write_sequence(0xc0,0x01,0x15,0x32,0x32,byte_config);	
	delay1ms();delay1ms();
}

void Read_datas()
{
	uchar addrll,addrhh;
	int r_cycle;
	uint Crystal,Crystal_r;
	uint Data_Size_Read;
	uchar byte_h,byte_l;

	Crystal=Baud_Config();
	Crystal_r=Crystal+1;

	addrhh=Instruction[1];
	addrll=Instruction[2];
 	Data_Size_Read=(Instruction[3])*256+Instruction[4];

	//Trbyte(0x90,Crystal,Crystal);
	delay10ms();
	Config_Eeprom(Crystal);
	delay200ms();delay200ms();delay200ms();delay200ms();delay200ms();
	for(r_cycle=0;r_cycle<Data_Size_Read;r_cycle+=2)
	{
		Trbyte(0xe8,Crystal,Crystal);Trbyte(addrhh,Crystal,Crystal);Trbyte(addrll,Crystal,Crystal);
		delay10us();delay10us();
		byte_h=RecByte(Crystal_r);
		byte_l=RecByte(Crystal_r);
		output(byte_h);
		output(byte_l); 
		delay104us();delay104us();

		addrll+=2;
		if(addrll!=0)
		 	continue;
		addrhh+=1;
	}
}

/*********************************************************
*function name    :void In_datas();
*function describe:receive datas from the pc
*********************************************************/
void In_datas() 
{    
	int j_in;
 	uint In_size;
	In_size=(Instruction[3])*256+Instruction[4];
	for(j_in=0;j_in<In_size;j_in++) 
		{
   	  	Eeprom[j_in]=(input());
    	}
}

void Write_datas()
{
	uchar addrll,addrhh;
	int w_cycle;
	uint Crystal,Crystal_r;
	uint Data_Size_Write;
//	uchar byte_h,byte_l;
	uchar back_byte_h,back_byte_l;

	Crystal=Baud_Config();

	In_datas();
	output(0xee);

	Crystal_r=Crystal+1;
 
	addrhh=Instruction[1];
	addrll=Instruction[2];
 	Data_Size_Write=(Instruction[3])*256+Instruction[4];

	//Trbyte(0x90,Crystal,Crystal);
	delay10ms();
	Config_Eeprom(Crystal);
	delay100ms();

	for(w_cycle=0;w_cycle<Data_Size_Write;w_cycle+=4)
		{
		Trbyte(0xC8,Crystal,Crystal);Trbyte(addrhh,Crystal,Crystal);Trbyte(addrll,Crystal,Crystal);
		Trbyte(0xff,Crystal,Crystal);Trbyte(0xff,Crystal,Crystal);
		delay104us();
		Trbyte(0xC0,Crystal,Crystal);Trbyte(0x01,Crystal,Crystal);Trbyte(0x16,Crystal,Crystal);Trbyte(0x40,Crystal,Crystal);Trbyte(0x40,Crystal,Crystal);//C0 01 16 40 40 		Erase two words(fore bytes)
		delay104us();
		Trbyte(0xC0,Crystal,Crystal);Trbyte(0x01,Crystal,Crystal);Trbyte(0x15,Crystal,Crystal);Trbyte(0x80,Crystal,Crystal);Trbyte(0x80,Crystal,Crystal);//C0 01 15 80 80       Programme a word(two bytes)		
		delay104us();
	do
		{
		delay104us();
		Trbyte(0xE0,Crystal,Crystal);Trbyte(0x01,Crystal,Crystal);Trbyte(0x15,Crystal,Crystal);back_byte_h=RecByte(Crystal_r);back_byte_l=RecByte(Crystal_r);
		}
		while((back_byte_l & 0x80)!=0x80);					//Erase 4 bytes
		delay10ms();

	//	delay52us();
		// start to write byte1
		Trbyte(0xC8,Crystal,Crystal);Trbyte(addrhh,Crystal,Crystal);Trbyte(addrll,Crystal,Crystal);
		Trbyte(Eeprom[w_cycle],Crystal,Crystal);Trbyte(Eeprom[w_cycle+1],Crystal,Crystal);
		delay104us();
		Trbyte(0xC0,Crystal,Crystal);Trbyte(0x01,Crystal,Crystal);Trbyte(0x16,Crystal,Crystal);Trbyte(0x20,Crystal,Crystal);Trbyte(0x20,Crystal,Crystal);//C0 01 16 20 20 		Programme a word(two bytes)
		delay104us();
		Trbyte(0xC0,Crystal,Crystal);Trbyte(0x01,Crystal,Crystal);Trbyte(0x15,Crystal,Crystal);Trbyte(0x80,Crystal,Crystal);Trbyte(0x80,Crystal,Crystal);//C0 01 15 80 80       Programme a word(two bytes)		
		delay104us();
	do
		{
		delay104us();
		Trbyte(0xE0,Crystal,Crystal);Trbyte(0x01,Crystal,Crystal);Trbyte(0x15,Crystal,Crystal);back_byte_h=RecByte(Crystal_r);back_byte_l=RecByte(Crystal_r);
		}
		while((back_byte_l & 0x80)!=0x80);		
		delay10ms();
		addrll+=2;
		if(addrll==0)		  
			{addrhh+=1;}
	
		delay52us();
		// start to write byte2
		Trbyte(0xC8,Crystal,Crystal);Trbyte(addrhh,Crystal,Crystal);Trbyte(addrll,Crystal,Crystal);
		Trbyte(Eeprom[w_cycle+2],Crystal,Crystal);Trbyte(Eeprom[w_cycle+3],Crystal,Crystal);
		delay104us();
		Trbyte(0xC0,Crystal,Crystal);Trbyte(0x01,Crystal,Crystal);Trbyte(0x16,Crystal,Crystal);Trbyte(0x20,Crystal,Crystal);Trbyte(0x20,Crystal,Crystal);//C0 01 16 20 20 		Programme a word(two bytes)
		delay104us();
		Trbyte(0xC0,Crystal,Crystal);Trbyte(0x01,Crystal,Crystal);Trbyte(0x15,Crystal,Crystal);Trbyte(0x80,Crystal,Crystal);Trbyte(0x80,Crystal,Crystal);//C0 01 15 80 80       Programme a word(two bytes)		
		delay104us();
	do
		{
		delay104us();
		Trbyte(0xE0,Crystal,Crystal);Trbyte(0x01,Crystal,Crystal);Trbyte(0x15,Crystal,Crystal);back_byte_h=RecByte(Crystal_r);back_byte_l=RecByte(Crystal_r);
		}
		while((back_byte_l & 0x80)!=0x80);
		delay104us();
		addrll+=2;
		if(addrll==0)		  
			{addrhh+=1;}
		delay10ms();
		}
//	delay200ms();
	output(0x55);
	output(0xff);
}
/*
void Erase_datas()
{
	uchar addrll,addrhh;
	int w_cycle;
	uint Crystal,Crystal_r;
	uint Data_Size_Write;
//	uchar byte_h,byte_l;
	uchar back_byte_h,back_byte_l;

	Crystal=Baud_Config();

	Crystal_r=Crystal+1;
 
	addrhh=Instruction[1];
	addrll=Instruction[2];
 	Data_Size_Write=(Instruction[3])*256+Instruction[4];

	delay10ms();
	Config_Eeprom(Crystal);
	delay10ms();

	for(w_cycle=0;w_cycle<Data_Size_Write;w_cycle+=4)
		{
		Trbyte(0xC8,Crystal,Crystal);Trbyte(addrhh,Crystal,Crystal);Trbyte(addrll,Crystal,Crystal);
		Trbyte(0xff,Crystal,Crystal);Trbyte(0xff,Crystal,Crystal);
		delay52us();
		Trbyte(0xC0,Crystal,Crystal);Trbyte(0x01,Crystal,Crystal);Trbyte(0x16,Crystal,Crystal);Trbyte(0x40,Crystal,Crystal);Trbyte(0x40,Crystal,Crystal);//C0 01 16 40 40 		Erase two words(fore bytes)
		delay52us();
		Trbyte(0xC0,Crystal,Crystal);Trbyte(0x01,Crystal,Crystal);Trbyte(0x15,Crystal,Crystal);Trbyte(0x80,Crystal,Crystal);Trbyte(0x80,Crystal,Crystal);//C0 01 15 80 80       Programme a word(two bytes)		
		delay52us();
	do
		{
		delay104us();
		Trbyte(0xE0,Crystal,Crystal);Trbyte(0x01,Crystal,Crystal);Trbyte(0x15,Crystal,Crystal);back_byte_h=RecByte(Crystal_r);back_byte_l=RecByte(Crystal_r);
		}
		while((back_byte_l & 0x80)!=0x80);					//Erase 4 bytes
		delay10ms();
		addrll+=4;
		if(addrll==0)		  
			{addrhh+=1;}

		
		}
	output(0x55);
	output(0xff);
}*/

void Erase_datas()
{
	uchar addrll,addrhh;
//	int w_cycle;
	uint Crystal,Crystal_r;
	uint Data_Size_Write;
//	uchar byte_h,byte_l;
	uchar back_byte_h,back_byte_l;

	Crystal=Baud_Config();

	Crystal_r=Crystal+1;
 
	addrhh=Instruction[1];
	addrll=Instruction[2];
 	Data_Size_Write=(Instruction[3])*256+Instruction[4];

	delay10ms();
	Config_Eeprom(Crystal);
	delay10ms();


	Trbyte(0xC8,Crystal,Crystal);Trbyte(addrhh,Crystal,Crystal);Trbyte(addrll,Crystal,Crystal);
	Trbyte(0xff,Crystal,Crystal);Trbyte(0xff,Crystal,Crystal);
	delay52us();
	Trbyte(0xC0,Crystal,Crystal);Trbyte(0x01,Crystal,Crystal);Trbyte(0x16,Crystal,Crystal);Trbyte(0x41,Crystal,Crystal);Trbyte(0x41,Crystal,Crystal);//C0 01 16 40 40 		Erase two words(fore bytes)
	delay52us();
	Trbyte(0xC0,Crystal,Crystal);Trbyte(0x01,Crystal,Crystal);Trbyte(0x15,Crystal,Crystal);Trbyte(0x80,Crystal,Crystal);Trbyte(0x80,Crystal,Crystal);//C0 01 15 80 80       Programme a word(two bytes)		
	delay52us();
	do
		{
		delay104us();
		Trbyte(0xE0,Crystal,Crystal);Trbyte(0x01,Crystal,Crystal);Trbyte(0x15,Crystal,Crystal);back_byte_h=RecByte(Crystal_r);back_byte_l=RecByte(Crystal_r);
		}
		while((back_byte_l & 0x80)!=0x80);					//Erase 4 bytes
 
	output(0x55);
	output(0xff);
}

⌨️ 快捷键说明

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