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

📄 cpueeprom.c

📁 单体电容测试仪源码程序 可测电压、有A/D转换等。
💻 C
字号:

#include <intrins.h>
#include "CPUeeprom.H"
#include "OS_CFG.H"
#include "NewType.h"


//stc89c58 eeprom数据
//stc89c58 eeprom共有58个扇区,每个扇区512字节,
//第一扇区起始地址为0x8000,结束地址为0x81ff,最后扇区起始地址为0xf200,结束地址为0xf3ff。
//根据姚工提示:
//擦写eeprom期间,串口硬件仍会工作,但只能收到最后一个数,看门狗也在工作,如果设的太短,会复位
//读写eeprom CPU等待时间按晶振频率设置,与6T或12T无关,
//14.7456M晶体写eeprom CPU等待时间按20M有些长,按10M有些短,还是按20M设吧
//读写擦除的触发指令后一般加1个NOP,只是习惯,不是必须
//可是试试读等待时间按最短处理

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; 


//写入Eeprom
//注意写入前应擦出相应的扇区
//功能:将若干个字节的数据写入Eeprom。
//		pc_DataBuf 指向数据缓冲区的指针。
//		RomAddress 指向Eeprom内部地址。
//		ByteNumber 要写入的字节数
bit WriteEeprom(unsigned char *pc_DataBuf,unsigned int RomAddress,
				unsigned char ByteNumber) 
{
    
	for(;ByteNumber!=0;ByteNumber--) {
		EA=0;    // 关中断 
		isp_data=*pc_DataBuf;
        isp_addrh = RomAddress/256; 
        isp_addrl = RomAddress%256; 
        isp_contr = 0x81;
        isp_cmd = 2; 
        isp_trig = 0x46; 
        isp_trig = 0xb9; 
        _nop_(); 
		pc_DataBuf++;
		RomAddress++;
		EA = 1;                            // 开中断 
	}
    isp_contr = 0;
    isp_cmd = 0; 
    isp_trig = 0; 
    isp_addrh = 0; 
    isp_addrl = 0;         
    EA = 1;                            // 开中断 
	return 1;
}

//读Eeprom
//功能:从Eeprom读出若干个字节。
//		pc_DataBuf 指向数据缓冲区的指针。
//		RomAddress 指向Eeprom内部地址。
//		ByteNumber 需要读出的字节数。
bit ReadEeprom(unsigned char *pc_DataBuf,unsigned int RomAddress,
				unsigned char ByteNumber)
{
//    EA=0;    // 关中断 
	for(;ByteNumber!=0;ByteNumber--)
	{
		EA=0;    // 关中断 
        isp_addrh = RomAddress/256; 
        isp_addrl = RomAddress%256; 
        //isp_contr = 0x81;       // 1000,0001 按20M设置等待时间
        isp_contr = 0x83;       // 1000,0001 按5M设置等待时间
        isp_cmd = 1; 
        isp_trig = 0x46; 
        isp_trig = 0xb9; 
        _nop_(); 
		*pc_DataBuf = isp_data;
		pc_DataBuf++;
		RomAddress++;
		EA = 1;                            // 开中断 
	}
    isp_contr = 0; 
    isp_cmd = 0; 
    isp_trig = 0; 
    isp_addrh = 0; 
    isp_addrl = 0;         
    EA = 1;                            // 开中断 
	return 1;
}

//块擦除
//StarAddress和ByteNumber必须是512的整数倍
bit eraser_eeprom(unsigned int StarAddress,unsigned int ByteNumber) 
{
	unsigned char i,sector_number;
	//计算要擦除的扇区数
	if (ByteNumber%512==0)	sector_number=ByteNumber/512;
	else                    sector_number=ByteNumber/512+1;
	//开始擦除扇区
    EA = 0;    // 关中断 
    isp_addrh = ((unsigned char)(StarAddress/256)) & 0xfe; 
   	isp_addrl = 0; 
	for (i=0;i<sector_number;i++) {
    	isp_contr = 0x81;
	    isp_cmd = 3; 
    	isp_trig = 0x46; 
	    isp_trig = 0xb9; 
    	_nop_(); 
	    isp_addrh +=2;	//扇区首址+512字节
	}
    isp_contr = 0;
   	isp_cmd = 0; 
    isp_trig = 0; 
   	isp_addrh = 0; 
    isp_addrl = 0; 
   	EA = 1;         // 开中断 
	return 1;
}


⌨️ 快捷键说明

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