X5045读写一体化C51程序包

发布者:rho27最新更新时间:2016-11-16 来源: eefocus关键字:X5045  读写一体化  C51 手机看文章 扫描二维码
随时随地手机看文章

void X5045SpiOpen(void);//打开X5045片选
void X5045SpiClose(void);//关闭X5045片选
void X5045WriteEnable(void);//软件使能X5045写操作
void X5045WriteDisable(void);//软件禁止X5045写操作
unsigned char X5045SpiSend(unsigned char val);//X5045收发SPI协议
void X5045WriteByte(unsigned int addr    unsigned char val);//写X5045一个字节
void X5045WriteWord(unsigned int addr    unsigned int val);//写X5045一个字
unsigned char X5045ReadByte(unsigned int addr);//读X5045一个字节
unsigned int X5045ReadWord(unsigned int addr);//读X5045一个字
unsigned char X5045ReadStatus(void);//读X5045状态
void X5045WriteStatus(unsigned char val);//写X5045状态
void X5045WriteWait(void);//等待X5045写入完成

/*--------------------------------------
       打开X5045片选
--------------------------------------*/
void X5045SpiOpen(void)
{
    EEPROMCS      = 1;//WDT
    EEPROMSCK     = 0;
    EEPROMSIO     = 1;//SO=SI=1 释放总线
    EEPROMCS      = 0;//WDT;打开X5045片选CS
}
/*--------------------------------------
      关闭X5045片选
--------------------------------------*/
void X5045SpiClose(void)
{
    EEPROMCS      = 1;//关闭X5045片选CS
    EEPROMSIO     = 1;//SO=SI=1 释放总线
    EEPROMSCK     = 0;
}

/*--------------------------------------
      软件使能X5045写操作
--------------------------------------*/

void X5045WriteEnable(void)
{
    X5045SpiOpen();//打开X5045片选
    EEPROMWP = 1;//硬件使能X5045写操作
    X5045SpiSend(WREN);//发送使能X5045写命令
    X5045SpiClose();//关闭X5045片选
}


/*--------------------------------------
      软件禁止X5045写操作
--------------------------------------*/
void X5045WriteDisable(void)
{
    X5045SpiOpen();//打开X5045片选
    X5045SpiSend(WRDI);//发送禁止X5045写命令
    EEPROMWP = 0;//硬件禁止X5045写操作
    X5045SpiClose();//关闭X5045片选
}

/*--------------------------------------
      X5045收发SPI协议
--------------------------------------*/
unsigned char X5045SpiSend(unsigned char val)
{
unsigned char i;
    WDTRST = 0x1e;//89s52内狗
    WDTRST = 0xe1;//89s52内狗
    ACC = val;
    for (i = 8; i > 0; i --)
    {
    CY = EEPROMSO;//取数据SO
      _rlca_();//存数据ACC.0读数据ACC.7同时进行
EEPROMSI = CY;//送数据SI
EEPROMSCK = 1;//上升沿打入数据
      _nop_();
EEPROMSCK    = 0;//下降沿读入数据(首次为假动作)
    }
    return ACC;
}

/*--------------------------------------
      写X5045一个字节
--------------------------------------*/
void X5045WriteByte(unsigned int addr    unsigned char val)
{
unsigned char temp;
    temp = WRITE;
    if ((addr >> 8) & 0x01) temp |= 8;
    X5045WriteEnable();//使能X5045写操作
    X5045SpiOpen();//打开X5045片选
    X5045SpiSend(temp);//发送X5045写命令及高位地址
    X5045SpiSend(addr & 0xff);//发送X5045写低位地址
    X5045SpiSend(val);//发送X5045写数据
    X5045SpiClose();//关闭X5045片选
    X5045WriteWait();//等待本次X5045写入完成
    X5045WriteDisable();//禁止X5045写操作
}


/*--------------------------------------
      写X5045一个字
--------------------------------------*/
void X5045WriteWord(unsigned int addr    unsigned int val)
{
unsigned char temp;
    temp = WRITE;
    if ((addr >> 8) & 0x01) temp |= 8;
    X5045WriteEnable();//使能X5045写操作
    X5045SpiOpen();//打开X5045片选
    X5045SpiSend(temp);//发送X5045写命令及高位地址
    X5045SpiSend(addr & 0xff);//发送X5045写低位地址
    X5045SpiSend(val & 0xff);//发送X5045写低位数据
    X5045SpiSend(val >> 8);//发送X5045写高位数据
    X5045SpiClose();//关闭X5045片选
    X5045WriteWait();//等待本次X5045写入完成
    X5045WriteDisable();//禁止X5045写操作
}

/*--------------------------------------
      读X5045一个字节
--------------------------------------*/
unsigned char X5045ReadByte(unsigned int addr)
{
unsigned char val;
    X5045SpiOpen();//打开X5045片选
    val = READ;
    if ((addr >> 8) & 0x01) val |= 8;
    X5045SpiSend(val);//发送X5045读命令及高位地址
    X5045SpiSend(addr & 0xff);//发送X5045读低位地址
    val = X5045SpiSend(0xff);//接收X5045读数据
    X5045SpiClose();//关闭X5045片选
    return val;
}

/*--------------------------------------
      读X5045一个字
--------------------------------------*/
unsigned int X5045ReadWord(unsigned int addr)
{
unsigned char val;
    X5045SpiOpen();//打开X5045片选
    val = READ;
    if ((addr >> 8) & 0x01) val |= 8;
    X5045SpiSend(val);//发送X5045读命令及高位地址
    X5045SpiSend(addr & 0xff);//发送X5045读低位地址
    val = X5045SpiSend(0xff);//接收X5045读低位数据
    addr = X5045SpiSend(0xff);//接收X5045读高位数据
    X5045SpiClose();//关闭X5045片选
    addr <<= 8;
    addr |= val;
    return addr;
}
/*--------------------------------------
      读X5045状态
--------------------------------------*/
unsigned char X5045ReadStatus(void)
{
unsigned char val;
    X5045SpiOpen();//打开X5045片选
    X5045SpiSend(RDSR);//发送读X5045状态命令
    val = X5045SpiSend(0xff);//接收X5045状态数据
    X5045SpiClose();//关闭X5045片选
    return val;
}
/*--------------------------------------
      写X5045状态
--------------------------------------*/
void X5045WriteStatus(unsigned char val)
{
    X5045SpiOpen();//打开X5045片选
    X5045SpiSend(WRSR);//发送写X5045状态命令
    X5045SpiSend(val);//发送X5045状态数据
    X5045SpiClose();//关闭X5045片选
}

/*--------------------------------------
      等待X5045写入完成
--------------------------------------*/
void X5045WriteWait(void)
{
    while (X5045ReadStatus() & WIP);//WIP=0 退出

关键字:X5045  读写一体化  C51 引用地址:X5045读写一体化C51程序包

上一篇:C51简单电子钟
下一篇:X5045的汇编读写程序

推荐阅读最新更新时间:2024-03-16 15:20

keil C51中的本征函数库及使用说明
本征函数(intrinsicroutines)是指编译时直接将固定代码插入当前行,而不用ACALL和LCALL 来实现(无需堆栈操作?),可大大提高函数的访问效率. 函数原型 extern void _nop_ (void); extern bit _testbit_ (bit); extern unsigned char _cror_ (unsigned char, unsigned char); extern unsigned int _iror_ (unsigned int, unsigned char); extern unsigned long _lror_ (unsigned long,
[单片机]
初学C51者应注意的地方
这里讲述一些初学者学习C51的一些误区和注意事项。高手的特别应用不包括在内。 1)C忌讳绝对定位。 常看见初学者要求使用_at_,这是一种谬误,把C当作ASM看待了。在C中变量的定位是编译器的事情,初学者只要定义变量和变量的作 用域,编译器就把一个固定地址给这个变量。怎么取得这个变量的地址?要用指针。比如unsigned char data x;后,x的地址就是&x, 你只要查看这个参数,就可以在程序中知道具体的地址了。所以俺一看见要使用绝对定位的人,第一印象就是:这大概是个初学者。 2)设置SP的问题。 原因和1差不对,编译器在把所有变量和缓冲区赋予地址后,自动把最后一个字节开始的地方,作为SP的开始位置,所以初学者
[单片机]
C51单片机定时器T0,T1的常用基本设置
有时候带手机不方便,可以又想知道时间,这时候可以用蜂鸣器做一个音频的时间提醒器,每60秒发一声提醒 提醒器计时可以使用单片机的定时器T0、T1来做,计时的定时器用T1来做,工作在方式2(8位自动装载),系统运行提示的定时器用T0来做,工作在方式1(16位定时) 代码如下 #include reg52.h #define uint unsigned int #define uchar unsigned char #define time_set0 5000//设置定时器0的计时长度 #define th0 (65536-time_set0)/256//计算定时器高8位装入值 #define tl0 (65
[单片机]
C51编程23-应用篇(HC 06蓝牙模块)
现在的手机,平板,笔记本电脑都会自带蓝牙。本文将会介绍51单片机使用HC 06 蓝牙模块实现手机与笔记本电脑的通讯。 HC 06 模块 购买HC 06模块后需要检测蓝牙模块是否是好的,使用串口线与HC 06 模块连接起来。并在电脑上的串口助手上发送“AT”,在串口助手上可以收到“OK”。 注:建议使用与本文一样的串口调试助手,或者让商家提供测试的串口助手程序。 硬件连接 HC 06 模块TXD 连接单片机的RXD,HC 06 模块RXD 连接单片机的TXD; 功能描述: 上位机在串口助手发送命令,通过上位机的蓝牙传输到单片机中,
[单片机]
<font color='red'>C51</font>编程23-应用篇(HC 06蓝牙模块)
在Keil C51函数中加入ASM代码
使用C51进行单片机编程是事半功倍的事,但是很多算法上以及编译上的问题,往往使用ASM代码更为方便又高效。但不知什么原因,Keil在实现C51夹杂ASM代码比SDCC麻烦很多,方法如下: 预处理指令 #pragma asm 开始ASM代码 预处理指令 #pragma endasm 结束ASM代码 如果就这样直接编译的话,会出现以下错误: error C272: 'asm/endasm' requires src-control to be active 解决方法:在 Files Toolbar 中选中当前C51文件,点右键查看文件选项,将 Generate Assembler SRC File 与 Assembl
[单片机]
单片机简易秒表C51程序
本程序所用的原理图下载: 点这里 ,单片机芯片使用的stc89c52;找到数码管的原理图即可.这是一整个单片机开发板的电路图其他的忽略. 以下是程序源代码: /** *项目:简易秒表 *设计任务书 *一、任务简介: *秒表是体育比赛常用计时工具。本设计要求利用现有的 *有限资源,设计具有储存多个比赛成绩功能的简易秒表, *并能利用键盘查询历史成绩。 *二、设计要求: *⑴ 系统硬件设计: *利用 ISP-III.1型用户板完成设计要 求; *⑵ 系统软件设计: *完成控制软件的编写与调试; *⑶ 基本功能: *① 开机数码管显示0000; *按下1#键开始计时;再次按下1#键停止计时; *② 在停止状 态下, *按下3#键清除所有计
[单片机]
c51中定时器工作时如何使用T0脚输入脉冲信号?
嵌入式系统中,定时器是一种常用的设备,可以实现各种时间控制功能,如计时、计数、产生中断等。8051单片机中有两个定时器:T0和T1,其中T0定时器主要用于计时和计数操作,可以通过T0脚输入脉冲信号来控制定时器的工作。 T0脚是单片机的P3.4口,既可以作为普通的输入输出口,也可以作为T0定时器的外部输入引脚。当T0脚作为定时器的外部输入引脚时,可以通过输入的脉冲信号来控制定时器的计数。在使用T0脚输入脉冲信号时,需要采取一些措施来确保信号的稳定性和正确性。 首先,需要确定输入脉冲信号的频率。在使用T0脚输入脉冲信号时,需要将信号的频率与定时器的工作频率相匹配。具体来说,当定时器使用外部时钟源时,其工作频率为外部时钟源频率的一半,因
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved