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

📄 _rb_24c16_rw.c

📁 本程式是使用C++寫單片機的軔體程式, 可以和PC做串列埠COM port通訊, 也結合I2C通訊標準, 將接收的資料燒錄傳輸至硬件IC 24C16
💻 C
字号:
#include <REG51.h>
#include "__24C16.h"

//-----------------------------------------------------------------------------------------
const unsigned long XTAL = 11059200;
const unsigned long baudrate = 9600;

const unsigned char Ins_Read_RomToPC = 0x55;
const unsigned char Ins_Write_PCToRom = 0x5A;
const unsigned char Ins_OK = 0x33;
const unsigned char Ins_NotOK = 0x26;
const unsigned char Ins_Start = 0xAA;
const unsigned char Ins_Stop = 0xDC;

void com_initialize(void);
void DataOut(unsigned char);
unsigned char DataIn(void);
void DelayX100ms(unsigned int);
unsigned char CheckSum(unsigned char*, int);
Bool RecPCData(unsigned char*, int);
void SendPCData(unsigned char*, int);
void ChangeAddr(unsigned char*, unsigned char*, unsigned char);
//-----------------------------------------------------------------------------------------
void main(void){
	Byte PCIns[6]; 	//Instruction Form Length is 6; 1st is Ins, 2nd is DeviceAddress.
					// 3rd is StartAddress.
					// 4th is the times of work; 5th is the mount of each work.
					// 6th is CheckSum.
					// But in this program, the 2nd, 3rd and 4th, We do not use.
    Byte PCInsC = 0x00;
	Byte RomData[17]; // array size is for read or write data size; (Rom page size)
	
	Byte DataSum = 0x00;	// check sum
	Byte DataAddr = 0x00;	// Data Address
	Byte DevAddr = 0x00;	// Device Address
	Byte Page = 0x00;		// Device page
	Byte Pgsize = 0x00;		// Each page size in each Device

	Bool PCIns_Flag = 0;	// 1 is ok, 0 is wrong;
	int i = 0;
	com_initialize();
	P0=0x00;
	while(1){
		PCIns_Flag = RecPCData(&PCIns,6);
		if(~PCIns_Flag){
			DataOut(Ins_NotOK);
			P0=Ins_NotOK;
		}
		if(PCIns_Flag){
			DataOut(Ins_OK);
			P0=Ins_OK;//
			DataAddr = 0x00;
			DevAddr = 0xA0;
			Page = 128;
			Pgsize = 16;
		}
		while(PCIns_Flag){	// when Flag = 1, it means that we have many work to do befor
 	    					// next RecPCIns. it usually has write or read many data, so 
							// we use "while", not use "if".
			PCInsC = 0x00;
			PCInsC = DataIn();
			if(PCInsC == Ins_Stop){
				PCIns_Flag = 0;
				break;	// To avoid infinite loop
			}
			if((PCIns[0] == Ins_Read_RomToPC)&&(PCInsC == Ins_Start)){
				I2cByteRead(DevAddr,DataAddr,Pgsize,&RomData); // read 16 data in each read action
				for (i=0;i<16;i++){//
 					P0 = ~RomData[i];
					DelayX100ms(1);
				}
				SendPCData(&RomData,Pgsize);
				ChangeAddr(&DevAddr,&DataAddr,Pgsize);				
			}
			if((PCIns[0] == Ins_Write_PCToRom)&&(PCInsC == Ins_Start)){
				RecPCData(&RomData,17);
				for (i=0;i<16;i++){//
 					P0 = ~RomData[i];
					DelayX100ms(1);
				}
				I2cByteWrite(DevAddr, DataAddr, Pgsize, &RomData);
				ChangeAddr(&DevAddr,&DataAddr,Pgsize);
			}
		}
	}
}
//-----------------------------------------------------------------------------------------
void ChangeAddr(unsigned char* pDevAddr, unsigned char* pDataAddr, unsigned char Pgsize){
	int DataWord = 0x0000;
	DataWord = (int)(*pDataAddr);
	DataWord += (int)Pgsize;
	*pDevAddr &=0x0F;
	if(DataWord >= 256){
		*pDevAddr = *pDevAddr + 2;
	}
	*pDevAddr &=0x0F;
	*pDevAddr |=0xA0;
	*pDataAddr = (unsigned char)DataWord;
}
void SendPCData(unsigned char* pData, int DataLen){ // Send total Data length is DataLen+1 
	int i;
	Byte Sum;
	Sum = CheckSum(pData, DataLen);
	for(i=0;i<DataLen;i++){
		DataOut(*(pData+i));
	}
	DataOut(Sum);
}
Bool RecPCData(unsigned char* pData, int DataLen){  // Receive total Data length is DataLen
	int i;											// the lastest Data is checksum
	Byte Sum;
	for(i=0;i<DataLen;i++){
		*(pData+i) = DataIn();
	}
	Sum = CheckSum(pData,DataLen-1);
	if (*(pData+DataLen-1) == Sum)
		return 1;
	else
		return 0;
}
unsigned char CheckSum(unsigned char* pData, int Num){
	int i;
	int Sum = 0x00;			// integer Sum
	Byte ReSum = 0x00;		// return Sum for unsigned char (8 bits)

	for(i=0;i<Num;i++){
		Sum += (int)(*(pData+i));
	}
	ReSum = (unsigned char)Sum;
	return ReSum;
}
void DelayX100ms(unsigned int count){
	unsigned char i,j,k;
	for (i=0;i<count;i++)
		for(j=0;j<100;j++)
			for(k=0;k<250;k++)
				;
}
unsigned char DataIn(void){
	do{
	}while(!RI);
	RI=0;
	return(SBUF);
}
void DataOut(unsigned char c){
	do{
	}while(!TI);	
	TI = 0;			//Before transmit next data, must clear TI; 
	SBUF = c;	
}
void com_initialize(void){
	SCON = 0x52; // choose  mode 1 serial interrupt, and no read state. Set TI = 1;
	PCON = 0x00; // power control, PCON.1 is SMOD which is choose baudrate double or not.
 
	IE = 0x00; // Set on interrupt.
	IP = 0x10; // Set on Serial interrupt priority.

	TMOD = 0x20;// Set Time control in Timer1 work on model 2.
	TH1 = (unsigned char)(256-(XTAL/((unsigned long)384*baudrate)));
	TR1 = 1; // Timer1 start.
}

⌨️ 快捷键说明

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