历史上的今天
返回首页

历史上的今天

今天是:2025年01月09日(星期四)

正在发生

2018年01月09日 | AT93C46 SPI接口EEPROM读写程序

2018-01-09 来源:eefocus

//-----------------------函数声明-------------------------------------------------------- 
#include "reg51.h" 
#include "intrins.h" 
//-----------------------管脚声明-----www.pICavr.com------------------------------------- 

sbit CS_93=P1^0; 
sbit CLK_93=P1^1; 
sbit DI_93=P1^2; 
sbit DO_93=P1^3; 
sbit VCC_93=P1^4; 
#define READ_c   0x02 
#define WRITE_c  0x01 
#define ERASE_c  0x03 
#define EWEN_c   0x00 
#define EWDS_c   0x00 
#define ERAL_c   0x00 
#define WRAL_c   0x00 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: delay 
// 入口参数: N 
// 函数功能:延时子程序,实现(16*N+24)us的延时  
// 系统采用11.0592MHz的时钟时,延时满足要求,其它情况需要改动 
//-------------------------------------------------------------------------------------------------- 
  void delay(unsigned  int N)   
  { 
  int i;  
  for(i=0;i  } 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: SEND_1 
// 函数功能: 送1位数据"1" 
//-------------------------------------------------------------------------------------------------- 
void SEND_1(void) 
      {  
      DI_93=1;  
      CLK_93=1;  
      _nop_();  
      CLK_93=0; 
      _nop_(); 
      } 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: SEND_0 
// 函数功能: 送1位数据"0" 
//-------------------------------------------------------------------------------------------------- 
void SEND_0(void) 
        {  
         DI_93=0;  
         CLK_93=1; 
         _nop_(); 
         CLK_93=0; 
         _nop_(); 
         } 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: SEND_0 
// 函数功能: 送1位数据"0" 
//-------------------------------------------------------------------------------------------------- 
void start_operation(unsigned char operation_code) 
        {  
         CS_93=1;  
          SEND_1();                   //起始位 
          if (operation_code&0x02)    //操作码 
          SEND_1();  
          else  
          SEND_0(); 
          if (operation_code&0x01)  
          SEND_1();  
          else  
          SEND_0(); 
         } 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: SEND_BYTE 
// 入口参数: dd,待发送的数据 
// 函数功能: 送1BYTE数据 
//-------------------------------------------------------------------------------------------------- 
void SEND_BYTE(unsigned char dd) 
     {  
      unsigned char i;  
      for (i=0;i<8;i++)  
          { 
          if (dd>=0x80) SEND_1();  
          else SEND_0(); 
          dd=dd<<1;  
          } 
     } 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: RECEIVE_BYTE 
// 返回值:   dd,待接收的数据 
// 函数功能: 送1BYTE数据 
//-------------------------------------------------------------------------------------------------- 
unsigned char RECEIVE_BYTE(void) 
              { 
              unsigned char i,dd;  
              DO_93=1; 
              for (i=0;i<8;i++)  
              {  
              dd<<=1;  
              CLK_93=1;_nop_(); 
              CLK_93=0;_nop_();  
              if (DO_93) dd|=1;  
              }  
              return(dd); 
             } 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: EWEN 
// 函数功能: 擦/写允许指令 
// 捎谠谏系绺次缓螅珹T93CXX首先将处于擦/写不允许状态。 
// 故该指令必须在所有编程模式前执行,一旦该指令执行后, 
// 只要外部没有断电就可以对芯片进行编程。 
//-------------------------------------------------------------------------------------------------- 
void EWEN(void) 
           { 
           _nop_();  
           CS_93=1;  
           start_operation(EWEN_c);  
           SEND_BYTE(0xC0);  
           CS_93=0; 
           } 
//-------------------------------------------------------------------------------------------------- 
// 函数名称:EWDS 
// 函数功能: 擦写截止 
// 使用该指令可对写入的数据进行保护 
//-------------------------------------------------------------------------------------------------- 
void EWDS(void) 
           { 
           _nop_();  
           CS_93=1;  
           start_operation(EWDS_c);  
           SEND_BYTE(0x00);  
           CS_93=0; 
           } 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: ERAL 
// 函数功能: 片擦 
// 该指令可将整个存贮器阵列置为1,其它功能与地址擦指令相同 
// 要求VCC = 4.5V to 5.5V。 
//-------------------------------------------------------------------------------------------------- 
void ERAL(void) 
           { 
           _nop_();  
           CS_93=1;  
           start_operation(ERAL_c);  
           SEND_BYTE(0x80);  
           CS_93=0; 
           } 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: READ_BYTE 
// 函数功能: 从存储区读一字节数据 
//-------------------------------------------------------------------------------------------------- 
unsigned char READ_BYTE(unsigned char address) 
             {  
             unsigned char dat;  
             CS_93=CLK_93=0; 
             CS_93=1;  
             start_operation(READ_c);  
             SEND_BYTE(address);  
             dat=RECEIVE_BYTE(); 
             CS_93=0; 
             return(dat); 
             } 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: WRITE_BYTE 
// 入口参数: address。dat 
// 返回值:   1或0,表示成功写入 
// 函数功能: 写一字节数据到存储区 
//-------------------------------------------------------------------------------------------------- 
bit WRITE_BYTE(unsigned char address,unsigned char dat) 
                { 
                 unsigned char e,time,temp=address;  
                  e=0;  
                  while (e<3)  
                   { 
                  CS_93=CLK_93=0;  
                  CS_93=1; 
                  EWEN(); 
                  _nop_(); 
                  CS_93=1; 
                  _nop_(); 
                  start_operation(WRITE_c);  
                  SEND_BYTE(address);  
                  SEND_BYTE(dat);  
                  CS_93=0; 
                  _nop_(); 
                  CS_93=1; 
                  time=0; 
                  DO_93=1; 
                  while (1)  
                  { 
                  if (DO_93==1) break; 
                  if (time>20) break; 
                  time++; 
                  }  
                  CS_93=0;  
                 if (READ_BYTE(temp)==dat)  
                    { 
                    return(0); 
                    } 
                    e++; 
                    }  
                    return(1); 
    } 


推荐阅读

史海拾趣

AND Displays公司的发展小趣事

在追求经济效益的同时,AND Displays也积极践行环保理念。公司采用环保材料和生产工艺,减少了对环境的污染。同时,公司还推出了多款节能型显示面板,帮助用户降低能耗、减少碳排放。此外,AND Displays还积极参与公益事业,通过捐赠和技术支持等方式,为社会的可持续发展贡献力量。

Delta Electronics公司的发展小趣事

作为一家具有社会责任感的企业,Delta Electronics一直积极践行可持续发展理念。公司自2004年起,全球新建办公大楼、生产基地均依绿建筑工法设计建造。此外,公司还积极参与各类环保活动和社会公益事业,推动绿色能源和环保技术的发展。这些举措不仅有助于保护环境、减少污染,也提升了Delta的企业形象和品牌价值。

Aydin Corp公司的发展小趣事

随着电子技术的快速发展,Aydin Corp意识到只有不断创新才能在市场中立于不败之地。公司投入大量资源用于研发,不断推出具有创新性和竞争力的产品。这些产品不仅性能卓越,而且设计独特,迅速赢得了消费者的青睐。同时,Aydin Corp还注重产品升级和迭代,以满足市场不断变化的需求。

ACEINNA公司的发展小趣事

在国内市场取得一定成绩后,Aydin Corp开始积极拓展国际市场。通过与全球知名企业的合作,公司成功将产品打入多个国家和地区的市场。同时,Aydin Corp还积极参加国际电子展会和交流活动,与业界同行建立了广泛的合作关系。这些举措不仅提升了公司的国际知名度,也为公司的持续发展注入了新的动力。

ENOCEAN公司的发展小趣事

为了进一步推动其技术在建筑行业的应用,EnOcean发起并建立了EnOcean联盟。该联盟由来自建筑行业的400多家公司组成,致力于推广基于EnOcean无线标准的免维护无线解决方案。通过与联盟成员的合作,EnOcean不断拓展其市场份额,并为智慧楼宇及能源管理提供更稳定的硬件解决方案。

FRIWO公司的发展小趣事

作为全球化的技术型企业,FRIWO在全球范围内设立了研发、生产和营销部门,以满足不同市场的需求。FRIWO的电源解决方案业务部(FPS)专注于为客户量身订做电源解决方案,其客户群遍布医疗科技、IT通讯、家用电器、移动工具以及工业应用等多个领域。为了更好地服务本地客户,FRIWO在不同地区设立了分支机构,确保能够快速响应客户需求并提供专业的技术支持和服务。这种全球化布局与本地化服务的策略,使得FRIWO在激烈的市场竞争中保持了强劲的竞争力。

问答坊 | AI 解惑

高速PCB设计指南

高速PCB设计指南,一共八章,word文档,值得一看哦…

查看全部问答>

电脑故障

我的电脑 无法启动 甚至 电源CPU 显卡 风扇 都 不转 电源是 好的 我应该怎样 做 …

查看全部问答>

不仅是外观,揭秘电纸书设计

本帖最后由 jameswangsynnex 于 2015-3-3 20:01 编辑 解读三代kindle,从“书”到“纸”再到“字” “在为汉王设计电纸书之时,我们仔细地研究了电子书的鼻祖——亚马逊推出的三代Kindle产品,然后就发现了一个很有趣的现象:第一代kindle采用了 ...…

查看全部问答>

好心人帮下忙做下毕业设计!

简易声谱仪的固件设计 规定用神州III号的STM32开发板。…

查看全部问答>

求高手

本帖最后由 paulhyde 于 2014-9-15 04:27 编辑 有没有人平时比较空的,能帮助我解决一些问题啊,我在单片机方面不是很专业,需要一个师傅带着,我可以拜他为师,还请师傅不要嫌弃我,回一下我的帖吧!跪谢!!我的qq:335947998 加我的时候最 ...…

查看全部问答>

关于智能小车循迹问题

各位大哥大姐,我在网上买了一个 4路的循迹模块。  程序是一个学长给我们写的。  4路循迹不跟单片机连接起来的时候,每一路指示灯的灭亮显示的正常。  但是只要跟单片机控制端口连接一来 。  指示灯的亮灭 ...…

查看全部问答>

基于LM3s +触摸屏的 计算器程序

基于LM3s +触摸屏的 计算器程序   哪位大侠有啊…

查看全部问答>

MSP-EXP430F5529 培训PPT资料

附件为EXP-MSP430F5529的官方开发板教程,由合肥工大改编,全中文,将之前官版的大实验进行了分解,更容易理解。 [ 本帖最后由 wstt 于 2013-1-28 10:15 编辑 ]…

查看全部问答>

出液晶屏、RS232/RS422转换器、以太网转RS232/RS485/RS422模块

本帖最后由 zhoupxa 于 2013-12-26 18:44 编辑 1. 8块拆机TRULY品牌12864点阵液晶屏,型号MCG12864C2-3,有负压,带背光,可提供规格书及C51驱动测试程序。拆机品,难免磕碰,个别屏面有少许划痕。 实物拍摄,如实描述,成色如图;零售7元/块不 ...…

查看全部问答>

适用于所有便携式电子设备的精确电量监测计

你有这样的经历吗,每次出门前都要检查一下手机的电量,生怕电量不够支撑一天的使用?或者在使用过程中,手机突然就没有电了?TI推出的能够精确地监控电池电量的产品能够帮你解决这些问题。 $(\'flv_GG1\').innerHTML=(AC_FL_RunContent(\'width\', ...…

查看全部问答>