电路设计,软件开发,专业项目团队承接电子产品开发!


ISPRO下载型编程器
火爆销售中

RS232/TTL转换器
全IC串口窃电

RS232/TTL转换线
全IC串口窃电

ByteBlasterMV Cable
CPLD/FPGA并口下载线

ByteBlaster II Cable ISPRO下载型编程器
支持S51/AVR/PIC
超级51开发板套件
前卫实用超值

PC/MCU/CPLD
三合一学习套件

全新万年历方案
AVR单片机开发板
 

Min51单片机仿真机
迷你型

ARM7开发板
仅售260元!
 

RS-232/RS-485双向接口电平转换器  

51单片机升级STM32
火爆销售中
MPLAB-ICD2
火爆销售中
LED51开发板
玩具又名图文显示棒

面板模块/开发板
经济危机明智决择

       

GSM MODEM GSM猫

SMS短信模块 工业级/全自动
火爆销售中

大功率数传电台

高速数传电台

您当前位置:电子技术资料 -> 外围驱动 -> EEPROM ->

祝您阅读愉快!

ISPRO下载型编程器

RS232 TO TTL转换器
↑↑本文相关产品介绍↑↑

用消息结构实现对at93C46读写


类别:技术文章
来源:未知
作者:未知
关键字:at93C46
加入日期:2010-8-3

用消息结构实现对at93C46读写
/*93c46操作。*/
/*中国电子网www.ec66.com*/
#include <reg52.h>
#include <intrins.h>

#include <Timer.h>
#include <Const.h>
#include <News.h>

sbit o93_cs=P3^4;
sbit o93_sk=P3^3;
sbit io93_data=P1^4;

unsigned char xdata m93c46_Task=0;
/*存储在93C46中的镜象*/
unsigned char xdata g93c46_Store[STORE93C46MAX];
/*存储在93C46中的镜象备份*/
unsigned char xdata g93c46_BakStore[STORE93C46MAX];
/*写全部缓冲时用的计数器*/
unsigned char xdata m93c46_Id;
bit fBusyDelay; /*写的延时标志*/
/*93C46存储数据缺省*/
unsigned char code c93c46_Default[]={
5,
5,
0,
0,
0,
0,
0,
0,
160,
100,
100,
60,
0,
160,
120,
0,
40,
1,
10,
120,
40,
90,
0};
bit fLinMode; /*单双线使用的标志,为提速而使用的*/
/***********************************************
内部函数。
软件延时4个时钟
***********************************************/
#define In93_SoftDlay() _nop_();_nop_();_nop_();_nop_()
/***********************************************
内部函数。
clk时钟
***********************************************/
void Clk93c46()
{
In93_SoftDlay();
o93_sk=1;
In93_SoftDlay();
o93_sk=0;
}
/***********************************************
内部函数
送起始位
***********************************************/
void startbit93c46(){
o93_cs=0;
In93_SoftDlay();
io93_data=1;
o93_cs=1;
Clk93c46(); /*输出1*/
}
/***********************************************
内部函数
送地址或数据
***********************************************/
void ad93c46(unsigned char outdata){
unsigned char i=8;
do{
ACC=outdata;
io93_data=ACC7;
Clk93c46();
ACC<<=1;
outdata=ACC;
}while(--i);
}
/***********************************************
读入一char字返回
***********************************************/
unsigned char Read93c46(unsigned char mLocation)
{
unsigned char i;

startbit93c46(); /*开始*/

Clk93c46(); /*输出个1*/

ad93c46(mLocation); /*送地址*/

io93_data=1;
for(i=8;i>0;i--){
In93_SoftDlay();
o93_sk=1;
ACC=mLocation;
ACC+=ACC;
ACC0=io93_data;
mLocation=ACC;
o93_sk=0;
}
In93_SoftDlay();
o93_cs=0;

return(mLocation);
}

/***********************************************
写一char字
***********************************************/
void Write93c46(unsigned char mLocation,unsigned char mData)
{
if(fBusyDelay==0){
startbit93c46();

io93_data=0;
Clk93c46(); /*输出个0*/

ad93c46(0x60); /*写允许*/
In93_SoftDlay();
o93_cs=0;
In93_SoftDlay();
}
//---------------------------------------------
startbit93c46();
io93_data=0;
Clk93c46(); /*输出个0*/

ad93c46(mLocation|0x80); /*送地址写*/
ad93c46(mData);
o93_cs=0;

fBusyDelay=1; /*开始10MS写忙延时*/

g93c46_Store[STORE93C46MAX-1]=g93c46_Store[STORE93C46MAX-1]-g93c46_BakStore
[mLocation]+mData; /*更新效验和*/
}


之二: [《农民运动讲习所》现任所长] [54次] 01-11-22 下午 04:34:53
/***********************************************
备份93C46镜象
***********************************************/
void AT93_Backup()
{
unsigned char i;
for(i=0;i<STORE93C46MAX;i++)g93c46_BakStore[i]=g93c46_Store[i];
}

/***********************************************
93C46镜象与备份比较,如果不等则发出写命令
***********************************************/
void AT93_StoreChange()
{
unsigned char i;
for(i=0;i<STORE93C46MAX;i++){
if(g93c46_BakStore[i]!=g93c46_Store[i]){
News_PushInt(WRITE93C46,i,g93c46_Store[i]);
}
}
}

/***********************************************
写93C46的循环
***********************************************/
void AT93_MainLoop()
{
switch(m93c46_Task){
case 0: if(fSYS_Touch){ /*20ms触发*/
if(fBusyDelay)m93c46_Task=1; /*开始延时*/
}
break;
case 1: /*写效验和*/
if(fSYS_Touch){
startbit93c46();
io93_data=0;
Clk93c46(); /*输出个0*/

ad93c46((STORE93C46MAX-1)|0x80); /*送地址写*/
ad93c46(g93c46_Store[STORE93C46MAX-1]);
o93_cs=0;

m93c46_Task=2;
}
break;
case 2: /*写禁止*/
if(fSYS_Touch){
startbit93c46();
ad93c46(0); /*写禁止*/
In93_SoftDlay();
o93_cs=0;

fBusyDelay=0; /*撤消忙信号*/
m93c46_Task=0;
}
break;
/*写全部缓冲的循环*/
case 3: if(m93c46_Id<STORE93C46MAX-1){
Write93c46(m93c46_Id,g93c46_Store[m93c46_Id]);
m93c46_Task=4;
}
else m93c46_Task=0; /*写完,有忙信号,继续延时*/
break;
case 4: if(fSYS_Touch){ /*20ms触发*/
m93c46_Task=5; /*开始延时*/
}
break;
case 5: if(fSYS_Touch){
m93c46_Id++;
m93c46_Task=3;
}
break;
}
}

/***********************************************
处理93C46消息的循环
***********************************************/
void AT93News_Loop()
{
unsigned char i;

if(News_Read0Data()==nINIT){ /*初始化*/
o93_cs=0;
o93_sk=0;
In93_SoftDlay();

for(i=0,B=0;i<(STORE93C46MAX-1);i++){
g93c46_Store[i]=Read93c46(i); /*读到镜象*/
B+=g93c46_Store[i]; /*效验和*/
}
g93c46_Store[i]=Read93c46(i); /*效验字*/
B+=0x36;

if(B!=g93c46_Store[i]){ /*效验不对,写缺省值*/
/*初始化数据*/
News_Push(WRITE93DEFAULT);
}
else {
if(g93c46_Store[LINEMODE]>0)fLinMode=1; /*单双线使用的标志,为提
速而使用的*/
else fLinMode=0;
}
return;
}

switch(News_Read0Data()){
case WRITE93C46: /*有93C46的写请求*/
News_Pop(); /*弹出消息位*/
if(fBusyDelay){
News_PushInt(WRITE93C46,News_Pop(),News_Pop
()); /*继续在消息队列中保存*/
}
else Write93c46(News_Pop(),News_Pop
()); /*写*/
break;
case WRITE93DEFAULT: News_Pop();
/*初始化数据*/
for(i=0,B=0;i<(STORE93C46MAX-1);i++){
g93c46_Store[i]=c93c46_Default[i];
B+=g93c46_Store[i]; /*效验和*/
}
B+=0x36;
g93c46_Store[i]=B;

if((fBusyDelay==1)||(m93c46_Task!=0))
{ /*忙*/
News_Push
(WRITE93DEFAULT); /*继续在消息队列中保存*/
}
else {

m93c46_Task=3; /*进入写全部的循环*/
m93c46_Id=0;
}
break;
}
}

您可能还会关注的相关技术资料:

中国电子网
www.EC66.com
QQ:34740080 EMAIL:iloveaoe@163.com
最佳浏览:1024*768
Copyright (C) 2001-2010 EC66.COM All Rights Reserved
Aoe/帝国 制作维护
粤ICP备18061901号