⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 at93c46.c

📁 AT93C46的读定程序 利用C语言写的
💻 C
字号:
/****************************************
*PROJECT CORD:AT93C46操作函数,ORG接地 *
*USE LANGUAGE:C51                      *
*CREATED BY :沙漠里的鱼                *
*CREATE DATE:2006.6.7 	                *
*MCU :AT89C51                           *
****************************************/

/************EEPROM AT93C46介绍*******************/

/******************管脚图(8-lead PDIP)及功能介绍*********************************
*                                                                                 *
*                                                                                 *
*                                                                                 *
*              ====   ====                                                        *
*          CS—* 1 * * 8 *—VCC                                                   *
*              *         *                                                        *
*          SK—* 2     7 *—DC                                                    *
*              *         *                                                        *
*          DI—* 3     6 *—ORG                                                   *
*              *         *                                                        *
*          DO—* 4     5 *—GND                                                   *
*              ===========                                                        *
*                                                                                 *
*管脚功能如下:                                                                   *
*                                                                                 *
*VCC GND :电源 接地端,电压范围 2.7~5.5V                                         *
*CS      :片选信号,高电平有效                                                   *
*SK      :串行时钟信号,SK上升沿进行芯片读写                                     *
*DI      :串行数据输入端                                                         *
*DO      :串行数据输出端,地址檫/写周期或芯片檫/写周期时,该端提供忙/闲信息      *
*ORG     :存储器构造配置端,该端接高电平时,输出为16位;接低电平时,输出为8位    *
*DC      :空脚,无连接                                                           *
*                                                                                 *
**********************************************************************************/


/*****************AT93C46控制命令*******************************************************************
*          ********命令格式********                                                                *
*   =====================================                                                          *
*   * 起始位 * 操作码 * 地址段 * 数据段 *                                                          *
*   =====================================                                                          *
*   * 1位    * 2位    * A6~A0  * D15~D0 *                                                          *
*   =====================================                                                          *
*                                                                                                  *
*                                                                                                  * 

*                           **************控制命令*****************                                *
* *======*====*====*=============================*============================*==================* *
* * 操作 * 起 * 操 *            地址段           *           数据段           *   功能           * * 
* *      * 始 * 作 *==============*==============*==============*=============*                  * *
* * 命令 * 位 * 码 *      8位     *      16位    *       8位    *      16位   *                  * *
* *======*====*====*==============*==============*==============*=============*==================* *
* *READ  * 1  * 10 *     A6~A0    *     A5~A0    *              空            * 从指定单元读数据 * *
* *======*====*====*==============*==============*============================*==================* *
* *EWEN  * 1  * 00 *    11XXXXX   *    11XXXX    *              空            * 允许写指令       * *
* *======*====*====*==============*==============*============================*==================* *
* *ERASE * 1  * 11 *    A6~A0     *    A5~A0     *              空            * 檫除指定单元     * *
* *======*====*====*==============*==============*============================*==================* *
* *WRITE * 1  * 01 *    A6~A0     *    A5~A0     *    D7~D0     *    D15~D0   * 写入指定单元     * *
* *======*====*====*==============*==============*============================*==================* *
* *ERAL  * 1  * 00 *    10XXXXX   *    10XXXX    *              空            * 檫除所有存储单元 * *
* *======*====*====*==============*==============*============================*==================* *
* *WRAL  * 1  * 00 *    01XXXXX   *    01XXXX    *    D7~D0     *    D15~D0   * 写入所有存储单元 * *
* *======*====*====*==============*==============*==============*=============*==================* *
* *EWDS  * 1  * 00 *    00XXXXX   *    00XXXX    *              空            * 禁止写指令       * *
* *======*====*====*==============*==============*============================*==================* *
*                                                                                                  *
***************************************************************************************************/


#include<at89x51.h>
#define uchar unsigned char

sbit CS=P1^0;
sbit SK=P1^1;
sbit DI=P1^2;
sbit DO=P1^3;

void at93c46_ewen(void); //写使能
void at93c46_ewds(void); //写禁止
uchar at93c46_read(uchar addr);  //读指定地址字节
void at93c46_write(uchar addr,uchar mybyte);  //将指定字节写入指定存储单元
void at93c46_erase(uchar addr);  //檫除指定单元
void at93c46_wral(uchar mybyte);  //将指定字节写入所有存储单元
void at93c46_eral(void);  //檫除所有存储单元


/********写使能函数,使EEPROM处于可写状态************/

void at93c46_ewen(void)
{
   uchar i,tmp;
   CS=0;SK=0;CS=1;  //时序同步
   DI=1;SK=1;SK=0;  //送起始位
   tmp=0x30;
   for(i=0;i<8;i++)  //送命令字
    { 
      DI=tmp&0x80;
      SK=1;SK=0;
      tmp<<=1;
    }
   CS=0;
}


/*********写禁止函数,禁止写入EEPROM******************/

void at93c46_ewds(void)
{
    uchar i,tmp;
    CS=0;SK=0;CS=1;  //时序同步
    DI=1;SK=1;SK=0;  //送起始位
    tmp=0x00;
    for(i=0;i<8;i++)  //送命令字
      {
         DI=tmp&0x80;
         SK=1;SK=0;
         tmp<<=1;
      }
    CS=0;
}


/***************读指定地址字节,参数addr为内存地址**********/

uchar at93c46_read(uchar addr)
{
   uchar i,result;
   at93c46_ewen();  //写使能
   CS=0;SK=0;CS=1;  //时序同步
   DI=1;SK=1;SK=0;  //送起始位
   DI=1;SK=1;SK=0;  //送操作码
   DI=0;SK=1;SK=0; 
   for(i=0;i<8;i++)  //送地址
     {
       DI=addr&0x80;
       SK=1;SK=0;
       addr<<=1;
     }
   CS=0;DO=1;CS=1;   //置接收端为1
   SK=0;
   while(!DO)   //检查DO是否为0,DO为0表示芯片开始传送数据
      {	
        SK=1;SK=0;
      }
   SK=1;SK=0;   //空过第一个标志位
   result=0;
   for(i=0;i<8;i++)
      {
        result<<=1;
        result=result|DO;
        SK=1;SK=0;
      }
    CS=0;
    return(result);
}
 
 
/**********将指定字节写入指定存储单元,参数addr为内存地址,参数mybyte为写入数据**********/


void at93c46_write(uchar addr,uchar mybyte)
{
   uchar i;
   at93c46_ewen();  //写使能
   CS=0;SK=0;CS=1;  //时序同步
   DI=1;SK=1;SK=0;  //送起始位
   DI=0;SK=1;SK=0;  //送操作码
   DI=1;SK=1;SK=0; 
   for(i=0;i<8;i++)   //送地址
     {
       DI=addr&0x80;
       SK=1;SK=0;
       addr<<=1;
     }
   
   for(i=0;i<8;i++)   //送数据
     {
       DI=mybyte&0x80;
       SK=1;SK=0;
       mybyte<<=1;
     }
   CS=0;DO=1;CS=1;   //置接收端为1 
   SK=0;
   while(DO)  //DO为0表示芯片忙
       {
         SK=1;SK=0;
       }
   SK=0;CS=0;
   at93c46_ewds();  //写禁止
}


/*************檫除指定单元,addr为内存地址*************/


void at93c46_erase(uchar addr)
{
  
   uchar i;
   at93c46_ewen();  //写使能
   CS=0;SK=0;CS=1;  //时序同步
   DI=1;SK=1;SK=0;  //送起始位
   DI=1;SK=1;SK=0;  //送操作码
   DI=1;SK=1;SK=0; 
   for(i=0;i<8;i++)  //送地址
     {
       DI=addr&0x80;
       SK=1;SK=0;
       addr<<=1;
     }
   CS=0;DO=1;CS=1;   //置接收端为1
   SK=0;
   while(DO)  //DO为0表示芯片忙
       {
         SK=1;SK=0;
       }
   SK=0;CS=0;
   at93c46_ewds();  //写禁止
}


/*************将指定字节写入所有存储单元,参数mybyte为写入数据************/
 
void at93c46_wral(uchar mybyte)
{
   uchar i,tmp;
   at93c46_ewen();  //写使能
   CS=0;SK=0;CS=1;  //时序同步
   DI=1;SK=1;SK=0;  //送起始位
   tmp=0x10;
   for(i=0;i<8;i++)  //送命令字
    { 
      DI=tmp&0x80;
      SK=1;SK=0;
      tmp<<=1;
    }
   for(i=0;i<8;i++)   //送数据
    {
      DI=mybyte&0x80;
      SK=1;SK=0;
      mybyte<<=1;
    }
   CS=0;DO=1;CS=1;   //置接收端为1 
   SK=0;
   while(DO)  //DO为0表示芯片忙
       {
         SK=1;SK=0;
       }
   SK=0;CS=0;
   at93c46_ewds();  //写禁止
}


/*************檫除所有存储单元***********************/


void at93c46_eral(void)
{
   uchar i,tmp;
   at93c46_ewen();  //写使能
   CS=0;SK=0;CS=1;  //时序同步
   DI=1;SK=1;SK=0;  //送起始位
   tmp=0;
   for(i=0;i<8;i++)  //送命令字
    { 
      DI=tmp&0x80;
      SK=1;SK=0;
      tmp<<=1;
    }
   CS=0;DO=1;CS=1;   //置接收端为1 
   SK=0;
   while(DO)  //DO为0表示芯片忙
       {
         SK=1;SK=0;
       }
   SK=0;CS=0;
   at93c46_ewds();  //写禁止
}












⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -