历史上的今天
返回首页

历史上的今天

今天是:2024年11月16日(星期六)

2019年11月16日 | 基于STC15W408AS单片机内部EEPROM读写接口函数

2019-11-16 来源:51hei


#include "reg51.h"

#include "intrins.h"

#define uint unsigned int

#define uchar unsigned char

#define ulong unsigned long

typedef uchar BYTE;

typedef uint WORD;



sfr P1M1 = 0x91;    //PxM1.n,PxM0.n     =00--->Standard,    01--->push-pull

sfr P1M0 = 0x92;    //                  =10--->pure input,  11--->open drain

sfr P0M1 = 0x93;

sfr P0M0 = 0x94;

sfr P2M1 = 0x95;

sfr P2M0 = 0x96;

sfr P3M1 = 0xB1;

sfr P3M0 = 0xB2;

sfr P4M1 = 0xB3;

sfr P4M0 = 0xB4;

sfr P5M1 = 0xC9;

sfr P5M0 = 0xCA;

sfr P6M1 = 0xCB;

sfr P6M0 = 0xCC;

sfr P7M1 = 0xE1;

sfr P7M0 = 0xE2;



sfr IAP_DATA    =   0xC2;           //IAP数据寄存器

sfr IAP_ADDRH   =   0xC3;           //IAP地址寄存器高字节

sfr IAP_ADDRL   =   0xC4;           //IAP地址寄存器低字节

sfr IAP_CMD     =   0xC5;           //IAP命令寄存器

sfr IAP_TRIG    =   0xC6;           //IAP命令触发寄存器

sfr IAP_CONTR   =   0xC7;           //IAP控制寄存器



#define CMD_IDLE    0               //空闲模式

#define CMD_READ    1               //IAP字节读命令

#define CMD_PROGRAM 2               //IAP字节编程命令

#define CMD_ERASE   3               //IAP扇区擦除命令

#define ENABLE_IAP  0x82            //if SYSCLK<20MHz

#define IAP_ADDRESS 0x0400



uint c,d,h,k,j;



/***************************输出宏定义***********************/

#define OUT0 OUT_1=1;OUT_2=1;OUT_3=1;OUT_4=1;OUT_5=1;OUT_6=1;//定义0档

#define OUT1 OUT_1=0;OUT_2=1;OUT_3=1;OUT_4=1;OUT_5=1;OUT_6=1;//定义1档

#define OUT2 OUT_1=0;OUT_2=0;OUT_3=1;OUT_4=1;OUT_5=1;OUT_6=1;//定义2档

#define OUT3 OUT_1=0;OUT_2=0;OUT_3=0;OUT_4=1;OUT_5=1;OUT_6=1;//定义3档

#define OUT4 OUT_1=0;OUT_2=0;OUT_3=0;OUT_4=0;OUT_5=1;OUT_6=1;//定义4档

#define OUT5 OUT_1=0;OUT_2=0;OUT_3=0;OUT_4=0;OUT_5=0;OUT_6=1;//定义5档

#define OUT6 OUT_1=0;OUT_2=0;OUT_3=0;OUT_4=0;OUT_5=0;OUT_6=0;//定义6档

    

sbit key1=P3^6; //1号键:火力加

sbit key2=P3^5; //2号键:火力减

sbit key3=P3^4; //3号键:启动开关

sbit WORK_LED=P1^1;     //显示板工作指示灯

sbit SPK=P1^2; //蜂鸣器的驱动IO口

sbit COM_LED=P1^0;      //显示板COM控制

sbit SCK=P2^7;          //显示板74HC164,SCK

sbit SDA=P2^6;          //显示板74HC164,SDA

sbit OUT_1=P2^0;        //输出1

sbit OUT_2=P2^1;        //输出2

sbit OUT_3=P2^2;        //输出3

sbit OUT_4=P2^3;        //输出4

sbit OUT_5=P2^4;        //输出5

sbit OUT_6=P2^5;        //输出6

sbit FIRE=P1^3;         //火焰检测

sbit AD0=P1^4;          //开关AD输入

sbit LGNITION_SW=P1^5;  //点火开关

sbit TEMP=P1^6;         //温度控制

sbit LGNITION=P3^7;     //点火控制


uchar SEG_tab[11]={0xf7,0xc1,0xbb,0xdb,

             0xcd,0xde,0xfe,0xc3,0xff,0xdf,0x00};//0-9,关闭;



/***************************延时函数*************************/

void Delay(BYTE n)

{

    WORD  x;

    while (n--)

    {

       x = 5000;

       while (x--);

    }

}



/***************************74HC164驱动程序*************************/

void Send_164(uchar dd)    //发送一个字节

{                   

     uchar a;    

     SCK=0;    

     for(a=0;a<8;a++)    

     {    

         SCK=0; SDA=dd&0x80;     

         SCK=1; dd=dd<<1;         

     } 

     SDA=0; 

}

/***************************蜂鸣*************************/

void key_beep()

{  

  uchar b;  

  for(b=2;b>0;b--)

     {

       for(c=2;c>0;c--)

       {

         SPK=0;

         Delay(5);

         SPK=1;

       }

     }     

}


/*----------------------------

关闭IAP

----------------------------*/

void IapIdle()

{

    IAP_CONTR = 0;                  //关闭IAP功能

    IAP_CMD = 0;                    //清除命令寄存器

    IAP_TRIG = 0;                   //清除触发寄存器

    IAP_ADDRH = 0x80;               //将地址设置到非IAP区域

    IAP_ADDRL = 0;

}


/*----------------------------

从ISP/IAP/EEPROM区域读取一字节

----------------------------*/

BYTE IapReadByte(WORD addr)

{

    BYTE dat;                       //数据缓冲区


    IAP_CONTR = ENABLE_IAP;         //使能IAP

    IAP_CMD = CMD_READ;             //设置IAP命令

    IAP_ADDRL = addr;               //设置IAP低地址

    IAP_ADDRH = addr >> 8;          //设置IAP高地址

    IAP_TRIG = 0x5a;                //写触发命令(0x5a)

    IAP_TRIG = 0xa5;                //写触发命令(0xa5)

    _nop_();                        //等待ISP/IAP/EEPROM操作完成

    dat = IAP_DATA;                 //读ISP/IAP/EEPROM数据

    IapIdle();                      //关闭IAP功能


    return dat;                     //返回

}


/*----------------------------

写一字节数据到ISP/IAP/EEPROM区域

----------------------------*/

void IapProgramByte(WORD addr, BYTE dat)

{

    IAP_CONTR = ENABLE_IAP;         //使能IAP

    IAP_CMD = CMD_PROGRAM;          //设置IAP命令

    IAP_ADDRL = addr;               //设置IAP低地址

    IAP_ADDRH = addr >> 8;          //设置IAP高地址

    IAP_DATA = dat;                 //写ISP/IAP/EEPROM数据

    IAP_TRIG = 0x5a;                //写触发命令(0x5a)

    IAP_TRIG = 0xa5;                //写触发命令(0xa5)

    _nop_();                        //等待ISP/IAP/EEPROM操作完成

    IapIdle();

}


/*----------------------------

扇区擦除

----------------------------*/

void IapEraseSector(WORD addr)

{

    IAP_CONTR = ENABLE_IAP;         //使能IAP

    IAP_CMD = CMD_ERASE;            //设置IAP命令

    IAP_ADDRL = addr;               //设置IAP低地址

    IAP_ADDRH = addr >> 8;          //设置IAP高地址

    IAP_TRIG = 0x5a;                //写触发命令(0x5a)

    IAP_TRIG = 0xa5;                //写触发命令(0xa5)

    _nop_();                        //等待ISP/IAP/EEPROM操作完成

    IapIdle();

}


推荐阅读

史海拾趣

DIPTRONICS MANUFACTURING INC公司的发展小趣事

随着技术的不断进步,圜达实业不断投入研发,成功推出了一系列具有创新性和竞争力的产品,如旋转开关、滑动开关等。这些产品不仅满足了市场的需求,还为公司赢得了良好的口碑。此外,公司还获得了TS 16949及ISO-14001认证,进一步提升了产品品质和竞争力。

Ecera Comtek Corp公司的发展小趣事

随着公司实力的不断增强,Ecera Comtek Corp公司开始寻求更广阔的发展空间。公司决定进军国际市场,拓展海外业务。然而,国际市场的竞争更加激烈,Ecera Comtek Corp公司面临着来自全球各地的强大竞争对手。为了应对这一挑战,Ecera Comtek Corp公司加强了与国际合作伙伴的联系,共同研发新产品,开拓新市场。同时,公司还加大了对海外市场的宣传力度,提高了品牌的知名度和美誉度。经过几年的努力,Ecera Comtek Corp公司的产品逐渐在国际市场上获得了认可,海外业务也取得了显著的进展。

GardTec Inc公司的发展小趣事

背景:为了满足全球客户的需求,GardTec开始实施全球化战略,在亚洲和美国等地设立全球制造厂和库存地。

发展:通过在全球范围内的战略布局,GardTec不仅提升了产品的供应效率,还更好地服务了世界各地的客户。公司的全球化布局进一步巩固了其在风扇配件市场的领先地位。

影响:全球化战略的实施,使得GardTec的产品能够迅速响应市场变化,满足不同地区客户的多样化需求,从而增强了公司的市场竞争力。

FUJI公司的发展小趣事

背景:GardTec Inc公司,成立于1987年(也有资料显示为1985年),自创立之初便确立了成为全球风扇配件产品第一供应商的目标。这一明确的定位为公司后续的发展奠定了坚实的基础。

发展:在创立初期,GardTec专注于风扇配件的研发与生产,通过技术创新和品质提升,逐渐在行业内崭露头角。公司利用现代化的制造和工程设施,不断突破设计与材料的限制,推出了一系列具有创新性的风扇配件产品。

影响:随着产品质量的提升和市场份额的扩大,GardTec逐渐在电子行业中建立了良好的口碑,为后续的快速发展奠定了基础。

AdaptivEnergy公司的发展小趣事

背景:GardTec始终致力于产品创新和技术研发,不断推出符合市场需求的新产品。

发展:公司积极与风扇制造商密切合作,联合推出了一系列具有创新性的风扇配件产品。同时,GardTec还投入大量资源用于研发工作,不断提升产品的技术含量和附加值。

影响:通过持续的创新与合作,GardTec不仅巩固了其在风扇配件市场的领先地位,还推动了整个行业的技术进步和产业升级。

Ememory Technology Inc公司的发展小趣事

为了满足市场对高性能、低功耗芯片的需求,eMemory在2016年宣布向150nm高电压制程工艺扩展其可编程Neobit技术。这一技术的成功开发,使得eMemory能够在LCD驱动IC、逻辑IC和功率控制IC等高速增长的市场中占据一席之地。Neobit技术的可擦编程只读存储器特性,为芯片设计提供了更大的灵活性和可定制性。

问答坊 | AI 解惑

无线发射功率以及接收灵敏度

发射功率与增益 无线电发射机输出的射频信号,通过馈线(电缆)输送到天线,由天线以电磁波形式辐射出去。电磁波到达接收地点后,由天线接收下来(仅仅接收很小很小一部分功率),并通过馈线送到无线电接收机。因此在无线网络的工程中,计算发 ...…

查看全部问答>

请教:如何从硬盘引导进入vxworks

各位,我先从优盘引导进入dos,盘符为C: 然后把生成的bootrom.sys,vxworks以及vxload.com拷贝到硬盘D:(已用format d:/s格式化了) 结果启动到verifying DMI pool data......就不动了,我的硬盘是4G的电子盘,我不知道这个做法对否?希望大家能帮 ...…

查看全部问答>

又是可怕的DEMO: InterruptInitialize failed!!! 请各位前辈帮帮忙。

InterruptInitialize(SysInt,Interruptevent,NULL,0)      我的这个函数总是返回为FALSE,      SysInt在oalintr.h上已经定义,而且在cfw.s   和armint.c也加入相应的中断处理,使能,代码Interru ...…

查看全部问答>

你知道预处理器标识#error的目的吗?

   这问题对区分一个正常的伙计和一个书呆子是很有用的。只有书呆子才会读C语言课本的附录去找出象这种问题的答案。当然如果你不是在找一个书呆子,那么应试者最好希望自己不要知道答案。…

查看全部问答>

成立一个电子技术论坛,大家去看看!!www.520ic.cn

关于单片机、开关电源、信号源与频率计的专业论坛,大家有问题或者想下相关资料的去看看。另外本站首页提供200多万的ic芯片pdf资料搜索下载。www.520ic.cn…

查看全部问答>

网络驱动无法调用我的中断服务程序?/(帮忙)

通过PCI 总线配置寄存器,并安装了中断服务程序,查看中断寄存器也显示发送 和接收包正常,但就是发完和接完就是没有调用中断程序…

查看全部问答>

各位用过的兄弟:STM32生产时怎么设置保密性?

                                 如题,怎样设置以防止软件被读出??…

查看全部问答>

不好意思顶了老帖子,我对UART超时的用法。

我在CC2430上实现了MODBUS,在CC1110上实现了UART透传。 UART应用程序中超时,串口中断的时候数据往环形队列里面放,队列就是一个组数,有两个标记表示头和尾,这个方法我也是模仿一些国外开发系统中集成的程序。 主程序中用getch函数,读队 ...…

查看全部问答>

请教关于STM8S105的问题

                                 请问什么原因会导致STM8S105的可用RAM空间小于128字节呢?文档上不是说有2K的RAM吗。程序出了一点小问题,感觉是ra ...…

查看全部问答>