基于STC15W408AS单片机内部EEPROM读写接口函数

2019-11-16来源: 51hei关键字:STC15W408AS  单片机  内部EEPROM读写  接口函数


#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();

}


关键字:STC15W408AS  单片机  内部EEPROM读写  接口函数 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic480210.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:51单片机定时闹钟仿真程序
下一篇:L297,L298驱动步进电机原理图proteus仿真+程序 LCD显示速度

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

51单片机STC15W408AS驱动无感无刷电机BLDC
看到很多人在用C8051做无感无刷电机的驱动,今天瑞生给大家来个国产51单片机STC15W408AS驱动无刷电机的驱动资料吧!1.硬件设计主控单片机使用STC15W408AS,单片机自带硬件PWM模块、ADC模块和比较器模块,所以非常适合做无刷电机的驱动,主频35M,无需外部晶振和复位电路,接好VCC和GND就可以工作。半桥电路使用PMOS+NMOS的组合,PMOS为IRF9540,NMOS为IRF540.驱动芯片用TC4427A。先在洞洞板上做实验吧。原理图如下所示,懒得用软件画了,还是手画来得快些。下面的图中,只画出了A相的桥,B相和C相的桥与A相一样。依照原理图,焊接好的板子如下图所示:2.软件设计2.1PWM模块PWM模块
发表于 2016-12-10
51单片机STC15W408AS驱动无感无刷电机BLDC
avr单片机功能特性介绍
RISC 优先选取使用频率最高的简单指令,避免复杂指令:并固定指令宽度,减少指令格式和寻址方式的种类,从而缩短指令周期,提高运行速度。由于 AVR 采用了 RISC 的这种结构,使AVR系列单片机都具备了1MIPS/MHz(百万条指令每秒/兆赫兹)的高速处理能力。早期单片机主要由于工艺及设计水平不高、功耗高和抗干扰性能差等原因,所以采取稳妥方案:即采用较高的分频系数对时钟分频,使得指令周期长,执行速度慢。以后的CMOS单片机虽然采用提高时钟频率和缩小分频系数等措施,但这种状态并未被彻底改观(51以及51兼容)。此间虽有某些精简指令集单片机(RISC)问世,但依然沿袭对时钟分频的作法。AVR单片机的推出,彻底打破这种旧设计格局,废除
发表于 2019-12-14
avr单片机功能特性介绍
avr单片机按键程序
  什么是avr单片机  AVR单片机是1997年由ATMEL公司研发出的增强型内置Flash的RISC(Reduced InstrucTIon Set CPU) 精简指令集高速8位单片机。可以广泛应用于计算机外部设备、工业实时控制、仪器仪表、通讯设备、家用电器等各个领域。AVR单片机是 Atmel 公司 1997 年推出的 RISC 单片机。RISC(精简指令系统计算机)是相对于CISC(复杂指令系统计算机)而言的。RISC 并非只是简单地去减少指令,而是通过使计算机的结构更加简单合理而提高运算速度的。  RISC 优先选取使用频率最高的简单指令,避免复杂指令:并固定指令宽度,减少指令格式和寻址方式的种类,从而缩短指令周期,提高
发表于 2019-12-14
avr单片机按键程序
三分钟告诉你:AVR单片机的熔丝与解锁
AVR单片机的熔丝位配置是AVR单片机初学者很容易出错的地方,其实只要注意一些事项,还是能够尽量避免单片机被锁死,即使单片机被锁死,也可以使用一些方法解锁,本文讲述我在刚开始接触AVR单片机时熔丝位配置出现的一些问题。1、AVR单片机的熔丝位是比较独到的特征,可以控制系统的时钟,JTAG调试、看门狗、芯片加密等等。图1是progisp软件,对于初学者来说,对熔丝位不熟悉,可以先将2处的编程熔丝对勾去掉,这样在编程的时候,就不会对熔丝位进行编程,单片机出厂的默认设置就可以使用。点击1处进入熔丝位配置界面。图1图2为位配置方式,这里的每一位都不能随意点击,尤其是熔丝低位控制时钟的地方,一般来说,直接对位进行配置并不安全,一定要确定是
发表于 2019-12-14
三分钟告诉你:AVR单片机的熔丝与解锁
avr单片机和stm32区别与优缺点分析
  摘要:avr单片机和stm32单片机是目前使用较广泛的单片机,那么avr单片机和stm32单片机有什么区别呢?有什么优劣势呢?  一、AVR单片机介绍  AVR单片机是1997年由ATMEL公司研发出的增强型内置Flash的RISC(Reduced InstrucTIon Set CPU) 精简指令集高速8位单片机。可以广泛应用于计算机外部设备、工业实时控制、仪器仪表、通讯设备、家用电器等各个领域。  avr单片机特点:  1. avr系列没有类似累加器A的结构,它主要是通过R16~R31寄存器来实现A的功能。在avr中,没有像51系列的数据指针DPTR,而是由X(由 R26、R27组成)、Y(由R28、R29组成)、Z
发表于 2019-12-14
AVR系列单片机的主要特性及选型
AVR单片机是ATMEL公司研制开发的一种新型单片机,它与51单片机、PIC单片机相比具有一系列的优点:在相同的系统时钟下AVR运行速度最快;芯片内部的Flsah、EEPROM、SRAM容量较大;所有型号的Flash、EEPROM都可以反复烧写、全部支持在线编程烧写(ISP);多种频率的内部RC振荡器、上电自动复位、看门狗、启动延时等功能,零外围电路也可以工作;每个IO口都可以以推换驱动的方式输出高、低电平,驱动能力强;内部资源丰富,一般都集成AD、DA模数器;PWM;SPI、USART、TWI、I2C通信口;丰富的中断源等。目前支持AVR单片机编译器的语言主要有汇编语言、C语言、BASIC语言等。其中C编译器主要有
发表于 2019-12-14
AVR系列单片机的主要特性及选型
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved