找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1849|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

51驅(qū)動(dòng)93c46程序,8位16位通用

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:309610 發(fā)表于 2022-8-12 21:40 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
自學(xué)51中,用到了93c46。網(wǎng)上公布的93c46驅(qū)動(dòng)程序不多,找大神的程序修修改改,希望幫到初學(xué)者。

/*/-------------主程序93c46main--舉例--------------------
/*/-------------主程序93c46main----------------------
          cwei(1);           //16位存儲(chǔ)模式
      //  cwei(0);    8位存儲(chǔ)模式
         En_93C46();                       //寫(xiě)入允許
         EE_93C46();                           //擦除93C46所有數(shù)據(jù)函數(shù)
     for(ia=0;ia<10;ia++)    //從0地址開(kāi)始寫(xiě)入10個(gè)數(shù)據(jù)  
       {            
         W93c46Data(ia,datacode16[ia]); //寫(xiě)93C46(地址,數(shù)據(jù))函數(shù)
         }
     for(ia=0;ia<10;ia++)
       {  
                num= Read93c46(ia); //讀93C46(地址,數(shù)據(jù))函數(shù)                   */          
//*****************************************************************/
//=================93c46.h====================
#ifndef  __93C46_H__
#define  __93C46_H__
//extern  org;
// sbit OG=P1^7;//存儲(chǔ)結(jié)構(gòu)選擇
//sbit org=P1^0;
//bit org;
void En_93C46(void);                                                            //寫(xiě)入允許
void W93c46pc_addr(unsigned char opcode,unsigned char addr);  //合并操作碼和地址寫(xiě)入
void E_93C46(unsigned char eraseaddr);                                //擦除93C46某地址數(shù)據(jù)函數(shù)
void EE_93C46(void);                                                                 //擦除93C46所有數(shù)據(jù)函數(shù)
void W93c46Data(unsigned char waddr,unsigned int wdata); //寫(xiě)93C46(地址,數(shù)據(jù))函數(shù)
unsigned int Read93c46(unsigned int raddr); //讀93C46(地址,數(shù)據(jù))函數(shù)
void cwei(unsigned char idata ww);           //數(shù)據(jù)結(jié)構(gòu)設(shè)置,0=8位存儲(chǔ)結(jié)構(gòu),1=16位存儲(chǔ)結(jié)構(gòu)
#endif


//============子程序93c46.c====================
#include <reg52.h>
#include "delay.h"
#include "93c46.h"

sbit CS=P1^7;//片選,高電平有效
sbit SK=P1^6;//時(shí)鐘a
sbit DI=P1^5;//數(shù)據(jù)輸入
sbit DO=P1^4;//數(shù)據(jù)輸出
  //sbit org=P1^3;
bit  org;                                //extern  org;//存儲(chǔ)結(jié)構(gòu)選擇
#define uchar unsigned char
#define uint unsigned int

unsigned int raddr;

void En_93C46(void);                      //寫(xiě)入允許
void W93c46pc_addr(uchar opcode,uchar addr);  //合并操作碼和地址寫(xiě)入
void E_93C46(uchar eraseaddr);//擦除93C46某地址數(shù)據(jù)函數(shù)
void EE_93C46(void);        //擦除93C46所有數(shù)據(jù)函數(shù)
void W93c46Data(uchar waddr,uint wdata); //寫(xiě)93C46(地址,數(shù)據(jù))函數(shù)
unsigned int Read93c46 (unsigned int raddr);  //讀93C46(地址,數(shù)據(jù))函數(shù)       

void cwei(unsigned char idata ww) //數(shù)據(jù)結(jié)構(gòu)設(shè)置,0=8位存儲(chǔ)結(jié)構(gòu),1=16位存儲(chǔ)結(jié)構(gòu)
        {org=ww;}

//--------------93C46寫(xiě)使能函數(shù)--------------------------------------
void En_93C46(void)  //93C46寫(xiě)使能函數(shù):          
{           uchar wad=0x60; //8位結(jié)構(gòu)地址碼01100000
   if (org==1)
       wad=0X30;           //16位結(jié)構(gòu)地址碼110000
       CS=1;//選通
    W93c46pc_addr(0x04,wad);//使能寫(xiě)允許100 ,110000
       CS=0;//選通禁止
}
//----------------------------------------------------------------------

//------------擦除93C46某地址數(shù)據(jù)函數(shù)--------------------------------
void E_93C46(unsigned char eraseaddr)//擦除93C46某地址數(shù)據(jù)函數(shù)
{          
   if(org==1)
       eraseaddr= eraseaddr&0x3f;  //16位結(jié)構(gòu)擦除地址xxxxxx
           CS=1;//選通
   W93c46pc_addr(0x07,eraseaddr);//操作碼1000 ,擦除地址xxxxxxx
       CS=0;//選通禁止
       CS=1;//選通
    while(!DO);//等待擦除完成
        CS=0;
}
//-------------------------------------------------------------------------

//---------------擦除93C46所有數(shù)據(jù)函數(shù)-----------------------------
void EE_93C46(void)        //擦除93C46所有數(shù)據(jù)函數(shù)
{          
     uchar wad=0x40;   //8位結(jié)構(gòu)擦除所有地址碼        1000000
   if (org==1)
       wad=0X20;           //16位結(jié)構(gòu)擦除所有地址碼         100000
       CS=1;//選通
   W93c46pc_addr(0x04,wad);//使能寫(xiě)允許100 ,110000
       CS=0;//選通禁止
       CS=1;//選通
    while(!DO);//等待擦除完成
        CS=0;
}
//-----------------------------------------------------------------------
//---------------合并操作碼和地址寫(xiě)入----------------------------------
void W93c46pc_addr(unsigned char opcode,unsigned char addr) //合并操作碼和地址寫(xiě)入
  {
    unsigned char i;
    unsigned int temp;
    uchar wt=7,wi=10;                     //OG=0表示8位結(jié)構(gòu)  地址7位合成10位操作數(shù)
        uint wd=0x0200;
if (org==1)                                        //16
    {
        wt=6;wi=9;wd=0x0100; }       //OG=1表示16位結(jié)構(gòu) 地址6位合成9位操作數(shù)  
          temp=opcode;                            //操作碼
    temp=(temp<<wt)|addr;           //把起始位、操作碼和地址合成一個(gè)數(shù)置入int型數(shù)
for(i=0;i<wi;i++)                  
   {                          
                          //注意:93C56/66芯片地址是9位,合并以后是一個(gè)12位的int型數(shù)據(jù)                 
    DI=(temp&wd)?1:0;       //OG=0從int型數(shù)據(jù)的第10位(0x0200)開(kāi)始取數(shù)                     
    SK=0;//產(chǎn)生時(shí)鐘                    //OG=1從int型數(shù)據(jù)的第9位(0x0100)開(kāi)始取數(shù)
    SK=1;                   //如果是12位數(shù),從int型數(shù)據(jù)的第11位(0x0800)開(kāi)始取數(shù)
    temp<<=1;//取下一位   
     }
   }

//---------------寫(xiě)93C46數(shù)據(jù)函數(shù)----------------------------------------
void W93c46Data(unsigned char waddr,unsigned int wdata)        //寫(xiě)93C46(地址,數(shù)據(jù))函數(shù)
{
        uchar i, wi=16;                //OG=1  16位結(jié)構(gòu)
                uint  wd=0x8000;        //
if (!org==1)
    {                                            //8位結(jié)構(gòu)
         wi=8; wd=0x80;
         wdata=wdata&0xff;
          }
        CS=1;//選通
     W93c46pc_addr(0x05,waddr);//寫(xiě)入寫(xiě)操作碼101和地址
  for(i=0;i<wi;i++)//寫(xiě)入8位數(shù)據(jù)
     {
         DI=(wdata&wd)?1:0;//逐位寫(xiě)入
                 SK=0;//產(chǎn)生時(shí)鐘
         SK=1;
         wdata<<=1;//取下一位
       }
        CS=0;//選通禁止
        CS=1;
        while(!DO);//等待寫(xiě)完
        CS=0;
}
//-------------------------------------------------------------------------
//----------------讀93C46(地址,數(shù)據(jù))函數(shù)--------------------------------
unsigned int Read93c46(unsigned int raddr)  //讀93C46(地址,數(shù)據(jù))函數(shù)
{
       uchar i, wi=8;                //OG=1  16位結(jié)構(gòu)
           uint rdata=0;
if (org==1)
       {wi=16; }                                    //8位結(jié)構(gòu)                  
        CS=1;
        W93c46pc_addr(0x06,raddr);//寫(xiě)入寫(xiě)操作碼110和地址
for(i=0;i<wi;i++)//讀取8/16位數(shù)據(jù)
     {
                   SK=0;//
        SK=1;   
                   rdata<<=1;//存下一位
  if(DO==1)rdata|=0x01;//逐位讀取數(shù)據(jù)并處理
  else rdata&=(~0x01);
        }

        CS=0;//選通禁止
if (!org==1)
       rdata=rdata&0x00ff;
        return rdata;
}
//--------------------------------------------------------------------------------------


評(píng)分

參與人數(shù) 2黑幣 +45 收起 理由
wpppmlah + 15 共享資料的黑幣獎(jiǎng)勵(lì)!
崇慶陽(yáng)光 + 30 贊一個(gè)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:907675 發(fā)表于 2022-8-13 07:52 | 只看該作者
支持共享。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表