注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

lql990832的博客

枫生于岭格外红.......

 
 
 

日志

 
 

X5045芯片读写控制程序  

2011-09-26 21:59:31|  分类: 单片机原理与应用 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
X5045芯片主要有四种功能:上电复位、看门狗定时器、电源电压监控和块锁(Block LockM)保护串行EEPROM存储器,该芯片
控制函数如下:
/***********************************************************************************
* 标题: X5045读写程序 *
* *
* 编程: LQL990832 *
* *
* 单片机型号: STC89C55RD+ *
* 晶振频率: 12MHz *
* *
* *
* *
*************************************************************************************/

#include <REG52.H>
#include <stdio.h>
#include "intrins.h"
//X5045引脚定义

sbit SO=P1^3; /*5045输出*/
sbit SI=P1^1; /*5045输入*/
sbit SCK=P1^2; /*5045时钟*/
sbit CS=P1^0; /*5045片选*/


//X5045可编程看门狗监控EEPROM指令集
#define WREN 0x06; 00000110 //设置写使能锁存器(允许写操作)
#define WRDI 0x04; 00000100 //复位写使能锁存器(禁止写操作)
#define RDSR 0x05; 00000101 //读状态寄存器
#define WRSR 0x01; 00000001 //写状态寄存器(块锁定)
#define READ 0x03; 00000011 //读出数据,地址0X00~0XFF
#define READH 0x0B; //读出数据,地址0X100~0X1FF
#define WRTE 0x02; 00000010 //写数据, 地址0X00~0XFF
#define WRITEH 0x0A; //写数据, 地址0X100~0X1FF
///////////////////////////////////////////////////////


//X5045可编程看门狗监控EEPROM控制函数集
void wren_dog(void);//看门狗写使能子程序
void wrdi_dog(void);//看门狗写禁止子程序
void in_byte(unsigned char byt);//单字节指令或数据写入X5045
unsigned char out_byte(void);//单字节数据从X5045读到单片机
void wrsr_dog(unsigned char status_reg);//写状态寄存器
unsigned char rdsr_dog(void);//读状态寄存器
unsigned char wip_poll(void);//检验写操作是否结束?
unsigned char byte_read(unsigned char H,unsigned char L);//X5045字节读
void byte_write(unsigned char H,unsigned char L,unsigned char D);//X5045字节写
void rest_dog(void);//复位看门狗子程序
////////////////////////////////////////////////////////////

void delay_ms(unsigned int ms); //延时函数

void delay_ms(unsigned int ms)
{
unsigned int i;
for(i=0;i<ms;i++)
{
}
}
////////////////////////////////////////////////////////////


bit Flag;
unsigned char ReData,SenData;
unsigned int j;




void main (void) {

//串口通讯初始化、、、、、、、、、、、、、、、、、、、、、、、、、、、
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x20; //定时器工作方式2
PCON|= 0x80;
TH1 = 0xF3; // //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (12Mz)
TL1 = 0xF3;
TR1 = 1; // T1启动计数
ES = 1; //开串口中断
EA = 1; // 开总中断
//串口通讯初始化结束/////////////////////////////////////////////////////

SBUF=0x02;
while(TI==0);
TI=0;


wren_dog(); //看门狗写使能子程序

wrsr_dog(0x00); //写状态寄存器 //看门狗被禁止,无保护模块

SenData=rdsr_dog(); // 读状态寄存器

SBUF=SenData; //SUBF接受/发送缓冲器,发送状态寄存器内容到PC

while(TI==0); //等待SUBF发送结束
TI=0;



//写EEPROM
for(j=0;j<=255;j++)
{ wren_dog();
byte_write(0,j,1); //0X00~0XFF全部写“1”
}




//读EEPROM
for(j=0;j<=255;j++)
{ SenData=byte_read( 0,j);
SBUF=SenData; //SUBF接受/发送缓冲器
while(TI==0);
TI=0;
}

while(1)
{
}

}

/****************************************************
串口中断程序
******************************************************/
void ser_int (void) interrupt 4 using 1
{
if(RI == 1) //RI接受中断标志
{
RI = 0; //清除RI接受中断标志
ReData = SBUF; //SUBF接受/发送缓冲器
SenData=ReData;
Flag=1; //消息函数
}
}


/****************************************************
X5045控制程序
******************************************************/

//复位看门狗子程序
void rest_dog(void)
{
CS=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
CS=1;
}


//看门狗写使能子程序
void wren_dog(void)
{

SCK=0;
CS=0;
in_byte(0x06);
SCK=0;
CS=1;
}

//看门狗写禁止子程序
void wrdi_dog(void)
{
SCK=0;
CS=0;
in_byte(0x04);
SCK=0;
CS=1;
}

//写状态寄存器
void wrsr_dog(unsigned char status_reg)
{
SCK=0;
CS=0;
in_byte(0x01);
in_byte(status_reg);
SCK=0;
CS=1;
wip_poll();
}


//读状态寄存器
unsigned char rdsr_dog(void)
{
unsigned char com;
SCK=0;
CS=0;
in_byte(0x05);
com=out_byte();
SCK=0;
CS=1;
return(com);
}


//单字节指令或数据写入X5045
//在SI线上输入的数据在SCK的上升沿被锁存。
void in_byte(unsigned char byt)
{
unsigned char i;
for(i=8;i>=1;i--)
{
SCK=0;
delay_ms(20);
SI=byt&0x80;
delay_ms(20);
SCK=1;
delay_ms(20);
byt=byt<<1;
}
}


//单字节数据从X5045读到单片机
//数据由SCK的下降沿输出到SO线上。
unsigned char out_byte(void)
{
unsigned char i;
unsigned char byt;

for(i=8;i>=1;i--)
{
byt=byt<<1;
SCK=1;
delay_ms(20);
SCK=0;
delay_ms(20);
byt|=SO;
delay_ms(20);
}
return (byt);
}



//X5045字节读
unsigned char byte_read(unsigned char H,unsigned char L)
{
unsigned char data_dog,add;
SCK=0;
CS=0;
SO=1;
SI=1;
add=H<<3;
add|=0x03;//READ;
in_byte(add);
add=L;
in_byte(add);
data_dog=out_byte();
SCK=0;
CS=1;
return(data_dog);
}

//X5045字节写
//H,地址高字节;L地址低字节;D写入的数据
void byte_write(unsigned char H,unsigned char L,unsigned char D)
{
unsigned char data_dog,add;
SCK=0;
CS=0;
SO=1;
SI=1;
add=H<<3;
add|=0x02; //WRTE;
in_byte(add);
add=L;
in_byte(add);
data_dog=D;
in_byte(data_dog);
CS=1;
wip_poll();
}


//检验X5045写操作是否结束。
unsigned char wip_poll(void)
{
unsigned char i;
unsigned char wip;
for(i=0xff;i>=1;i--)
{
wip=rdsr_dog();
wip&=0x01;
if(wip==0) break;
}
return(wip);
}



  评论这张
 
阅读(777)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018