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

📄 main.c

📁 stc单片机读内部eeprom代码
💻 C
字号:
//////////// 
#include <reg52.h>             ///52的库 
#include <intrins.h> 
///////////////////// 
//sfr  isp_wdt     = 0xe1; 
sfr  isp_data    = 0xe2; 
sfr  isp_addrh   = 0xe3; 
sfr  isp_addrl   = 0xe4; 
sfr  isp_cmd     = 0xe5; 
sfr  isp_trig    = 0xe6; 
sfr  isp_contr   = 0xe7; 
///////// 
#define uchar unsigned char
#define uint  unsigned int
#define Dlen 8
uchar Data[Dlen+1]={1};//={1,2,3,4,5,6,7,8,9,0xA,0xB,0x0C,0x0D};
uchar Databak[Dlen+1];
uchar AckData[Dlen+1];
uchar number,flag;
uchar Eeprom_data[Dlen];
sfr WDT=0XE1;
/*sfr ISP_DATA=0XE2;
sfr ISP_ADDRH=0xE3;
sfr ISP_ADDRL=0xE4;
sfr ISP_CMD=0xE5;
sfr ISP_TRIG=0xE6;
sfr ISP_COUNT =0xE7;
sfr ENABLE_ISP=0x80;
uchar DEBUG_DATA =0x5A;
uint DFSA=0x2000; */

sbit LED=P1^7;
sbit LED1=P3^4;
sbit LED2=P3^5;
bit BeingEnd=1;
uint TimerCount=0,mTcount=0;
bit cansend=0,issend=0,whilerec=0,whilesend=0;

///////// 
unsigned char iic_num; 
////写入到从t_addr地址开始 
/* 打开 ISP,IAP 功能 */ 
void EraseEeprom(unsigned char t_addr) 
{ 
    isp_addrh = t_addr; 
    isp_addrl = 0; 
    EA    =    0;    /* 关中断 */ 
    isp_contr = 0x81;       /* 1000,0000 */ 
    isp_cmd = 3; 
    isp_trig = 0x46; 
    isp_trig = 0xb9; 
    _nop_(); 
    _nop_(); 
    isp_contr = 0;    /* 0111,1111 */ 
    isp_cmd = 0; 
    isp_trig = 0; 
    isp_addrh = 0; 
    isp_addrl = 0; 
    EA = 1;                    /* 开中断 */ 
} 
////一次最多256个,建议试用几个,要存入的数据松在指针指向的缓冲区 
void WriteEeprom(unsigned char t_addr, unsigned char num, unsigned char /*xdata*/  *ptr) 
{ 
    EraseEeprom(t_addr); 
    for (iic_num=0; iic_num<num; iic_num++) 
    { 
        isp_data = *(ptr+iic_num); 
        isp_addrh = t_addr; 
        isp_addrl = iic_num; 
        EA    =    0;                 /* 关中断 */ 
        isp_contr = 0x81;       /* 1000,0000 */ 
        isp_cmd = 2; 
        isp_trig = 0x46; 
        isp_trig = 0xb9; 
        _nop_(); 
        _nop_(); 
        isp_contr = 0;    /* 0111,1111 */ 
        isp_cmd = 0; 
        isp_trig = 0; 
        isp_addrh = 0; 
        isp_addrl = 0;         
        EA = 1;                    /* 开中断 */ 
    } 
} 
////从eeprom的t_addr地址开始读出num个数据 
////存入以temp[0]开始的存储单元 
////一次最多256个,读数的数据存入指针指向的缓冲区 
void ReadEeprom(unsigned char s_addr, unsigned char num, unsigned char /*xdata*/ *ptr) 
{ 
    for (iic_num=0; iic_num<num; iic_num++) 
    { 
        isp_addrh = s_addr; 
        isp_addrl = iic_num; 
        EA    =    0;    /* 关中断 */ 
        isp_contr = 0x81;       /* 1000,0000 */ 
        isp_cmd = 1; 
        isp_trig = 0x46; 
        isp_trig = 0xb9; 
        _nop_(); 
        _nop_(); 
        isp_contr = 0;    /* 0111,1111 */ 
        isp_cmd = 0; 
        isp_trig = 0; 
        isp_addrh = 0; 
        isp_addrl = 0;         
        EA = 1;                            /* 开中断 */ 
        *(ptr+iic_num) = isp_data; 
    } 
}/***********串口发送一个字节****************/

 void send(uchar S_Data)
{
	SBUF = S_Data;
    while(TI == 0);
		TI =0;
}

/************生成校验码子程序***********/
char* XiaoYan(uchar *a)
{
  uchar i, all=0;
 
   for(i=0;i<Dlen;i++)
   all=all+a[i];
   all=~all;
   all=all-1;
   a[Dlen]=all;
   return a;
}

/************接收数据校验子程序***********/
unsigned int RXiaoYan(uchar *a)
{
	uchar rets=0,i, all=0;
 
	for(i=0;i<Dlen;i++)
	all=all+a[i];
	all=~all;
	all=all-1;
	if(a[Dlen]==all)
		rets=1;
	return rets;

}


/****************串口发送子程序****************/
void sends(uchar *b )
{
	
	uchar count,i;
	cansend=0;
	count=Dlen+1;
	LED1=0;
	for(i=0;i<count;i++)
		send(b[i]);
}
//-------------等待接收----------------------
void whilRec(void)
{
	unsigned char Cmd=0;
  	while(whilerec)
	{
		//if(flag==12)
			flag=0;
			number=0;
			Cmd=0;
			Cmd=Data[0];
			if(RXiaoYan(Data)) //crc ok
			{
				if(Cmd>0xA0)//接到的是命令侦
				{
					switch (Cmd)
					{
						case 0xA1:
							break;
						case 0xA2:
							break;
						case 0xAC://应答ok
							cansend=1;
							break;
						case 0xAB://需要重发
							sends(Databak);
							whilerec=0;
							cansend=1;
							break;
						case 0xCB://开始
							BeingEnd=1;
							break;
						case 0xCE://暂停
							BeingEnd=0;
							break;
						default:
							break;
					}
				}
				else  //crc no
				{
					sends(XiaoYan(Data));
					cansend=1;
					whilerec=0;
				}
			}
			else
			{
				
				AckData[0]=0xAB;//要求pc重发
				sends(XiaoYan(AckData));
				whilerec=0;	
				cansend=1;
			}
			whilerec=0;

		
	}
}
 
 /*********MCU初始化**************/
void MCU_Init(void)
{
    TMOD = 0x22;
    //TH1 = TL1 = 0xFA;//9600 T1 为波特率发生器
	TH1 = TL1 = 0xFD;//19200  T1 为波特率发生器
	TH0=TL0=0xa3;
	SCON = 0x50;
	PCON = 0x80;//SMOD=1;
	TR1=1;
	TR0=1;
	ET0=1;
	ES = 1;
	EA = 1;
}
/*************T1中断********************/
void T0_int() interrupt 1
{
	TimerCount++;
	if(TimerCount>200)
	{
		TimerCount=0;
		WDT=0x34;
		mTcount++;
	}
}

/*************接收中断********************/
void Serial() interrupt 4 using 2
{  
	uint num=0;
	if(RI == 1)
    {
		
		LED2=0;
		Data[number++]= SBUF;
		num=number-1;
		Databak[num]=Data[num];
		
		RI = 0;
		flag++;
		if(flag==Dlen+1)
		{
			whilerec=1;

		}
    }
}
/**************主程序***********************/
void main(void)
{
 	unsigned int ld=0,san=0;
    MCU_Init();
	//send(0xAA);
	//for(ld=0;ld<Dlen;ld++)
		//Eeprom_data[ld]=0xA0+ld;
	//WriteEeprom(0x82, Dlen, Eeprom_data); 
			_nop_();
			_nop_();
	send(0x01);
	for(ld=0;ld<Dlen;ld++)
		Eeprom_data[ld]=0;
	
  	while(1)
	{
		if(mTcount>350)
		{
			mTcount=0;
			for(ld=0;ld<Dlen;ld++)
				Eeprom_data[ld]=0;
			LED2=LED1;
			LED1=!LED1;
			ReadEeprom(0x82, Dlen, Eeprom_data) ;
			_nop_();
			_nop_();
			sends(XiaoYan(Eeprom_data));
			/*ReadEeprom(0x83, Dlen, Eeprom_data) ;
			_nop_();
			_nop_();
			sends(XiaoYan(Eeprom_data));
			mTcount=0;	 */
			mTcount=0;

		}
		//whilRec();
	}
}

⌨️ 快捷键说明

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