SPI_93c46记忆.zip

  • PUDN用户
    了解作者
  • C/C++
    开发工具
  • 2KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 0
    下载次数
  • 2018-09-19 21:33
    上传日期
93C46的驱动代码,能存储数据和读取数据,亲自测试可用于51代码
SPI_93c46记忆.zip
  • SPI_93c46记忆.txt
    6.2KB
内容介绍
#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit CS=P1^0; //片选信号 sbit CLK=P1^1; //时钟 sbit DI=P1^2; //串行输入 sbit DO=P1^3; //串行输出 uchar code duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管段码 void yanshi(uint z); void start(); void stop(); void send(uint dat,uchar num); //传送数据子程序 void EWEN(); //写允许 void EWDS(); //写禁止 void time0_init (); //定时器0初始化 uint read(uchar address); //读数据 bit write(uint dat,uchar address); //写入一个字节 bit quanca(); //全擦 bit ca(uchar address); //擦一个字节 bit quan_write(uint dat); //全写 uchar t1s; void main() { uchar addr; uint date; time0_init(); addr=0; date=read(addr); //读出掉电时最后一个写入的数据 quanca(); //全部擦掉SPI里的内容 write(date,addr); //写入,防止在不到一秒内掉电出错 while(1) { P0=duanma[date]; //输出 if(t1s>=20) //判断是否到一秒 { t1s=0; //清零 date++; //数据自加 write(date,addr); //写入自加后变化的数据 if(date==16) //判断是否达到设置的现实上限 date=0; //清零 } } } void time0_init () //定时器0初始化 { TMOD=0x01; //设置定时器工作方式 TH0=(65536-50000)/256; TL0=(65536-50000)%256;//设置定时器初始值 TR0=1; //启动时器0中断 ET0=1; //开定时器0中断 EA=1; //开总中断 } void dingshi0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256;//设置定时器初始值 t1s++; } void yanshi(uint z) { uint x,y; for(x=z;x>0;x--) for(y=250;y>0;y--); } void start() //防止CS的改动引起数据时序混乱 { DO=1; //虚高,高阻态 CS=0; CLK=0; CS=1; //片选 yanshi(5); //cs,di在CLK出现首个上升沿时写入数据,开始置低,传送数据时直接置高开始写入读出 } void stop() //取消选中 { CS=0; DI=1; CLK=1; } void send(uint dat,uchar num) { uchar i; dat=dat<<(16-num); //16位的通用,输入指定位数的数据,左移去掉无用位 for(i=0;i<num;i++) { DI=dat&0x8000; //先取数据的第一位 CLK=1; //然后上升沿期间保持数据稳定 yanshi(1); CLK=0; //下降沿改变数据变换 dat=dat<<1; //准备下一位要传送的数据 } } void EWEN() //写允许 { start(); //先开始 send(0x04,3); //传送3位指令 100 send(0x30,6); //传送6位地址 11XXXX stop(); //结束 } void EWDS() //写禁止 { start(); send(0x04,3); //同上 100 send(0x00,6); //00xxxx stop(); } uint read(uchar address) //带返回值,读出 { uchar i; uint temp; start(); //开始 send(0x06,0x03); //3位指令 110 send(address,0x06); //6位数据 XXXXXX temp=0; //存放返回数据值清零 for(i=0;i<16;i++) //循环读出16位数据 { temp=temp<<1; //先左移一位空出最右边的一位 CLK=1; //保持 CLK=0; //变化 temp=temp|DO; //与运算送值给temp } stop(); //停止传送 return temp; //将取出的值返回函数 } bit write(uint dat,uchar address) //带返回值,写入 { bit temp; //定义一个写状态标志位 uint temp1; //定义一个延时数值 EWEN(); //开启写允许 start(); //开始 send(0x05,3); //送3位指令 101 send(address,6); //送6位地址,可指定 XXXXXX send(dat,16); //送16位要写入的数据 CS=0; CS=1; //地变高状态确认 temp=1; //先置一表示没错误 temp1=50000; //设置一个延时等待数值 while(DO!=1) //查询DO的状态确定器件的准备或繁忙状态;DO位低电平时说明操作 { //没有完成保持在while里,为高说明器件可以执行下一命令 temp1=temp1-1; //对temp1进行自减起到延时 if(temp1==0) //确定temp1是否减到零, { temp=0; //如果减到零说明延时已到但是仍然没有退出while说明写入失败,对temp置零 return(temp); //函数返回值为零,说明写入错位 //退出循环 } stop(); //停止 EWDS(); //写禁止 return temp; //如果在延时到达时前退出while返回值为一说明写入正确 } } bit ca(uchar address) //带返回值位擦除 { bit temp; uint temp1; //解释同上 EWEN(); start(); send(0x07,3); // 111 send(address,6); //XXXXXX CS=0; CS=1; temp=1; temp1=50000; while(DO!=1) { temp1=temp1-1; if(temp1==0) { temp=0; return(temp); break; } stop(); EWDS(); return temp; } } bit quanca() //擦全部 { bit temp; uint temp1; EWEN(); //解释同上 start(); send(0x04,3); //100 send(0x20,6); //10XXXX CS=0; CS=1; temp=1; temp1=50000; while(DO!=1) { temp1=temp1-1; if(temp1==0) { temp=0; return(temp); break; } stop(); EWDS(); return temp; } } bit quan_write(uint dat) //写全部 { bit temp; uint temp1; EWEN(); start(); send(0x04,3); //100 send(0x10,6); //01XXXX send(dat,16); //写入全部16位数据 CS=0; CS=1; temp=1; temp1=50000; while(DO!=1) { temp1=temp1-1; if(temp1==0) { temp=0; return(temp); break; } stop(); EWDS(); return temp; } }
评论
    相关推荐
    • 93c46.rar
      串行EE2PROM芯片93C46SPI接口驱动程序。
    • SPI93C46.rar
      c51语言的93C46驱动程序
    • 28335-93c46.zip
      spi eeprom 通讯,通讯这块可以只用PDO方式传输而不用SDO方式传输,对象字典的参数部分存在PDO,部分存在SDO,当第一台伺服驱动器去修改第二台伺服驱动器对象字典中的参数时只能用SDO传输方式。
    • C51_93C46.rar
      AT89C51/52单片机模拟SPI总线,驱动1k的EEPROM存储芯片的程序,已经封装好,直接在工程中添加93C46.C文件,并且在主函数中#include 93C46.H
    • 93c46.rar
      单片机以太网驱动程序
    • AT93C46.rar
      串行EE2PROM芯片93C46SPI接口驱动程序。
    • 93c46MCU.rar
      MCU上通过GPIO口模拟IIC接口,实现的EEPROM的操作,代码比较实用
    • 93C46.rar
      93C46的应用与开发,可以使你很方便的应用该程序做为驱动
    • EEPROM-drive-24CXX-93C46.rar
      51单片机可用的EEPROM驱动程序 包括24CXX 93C46两种。已测试很好用
    • GaussDB_100_1.0.1-DATABASE-REDHAT-64bit.tar.gz
      guassdb100在redhat上安装包,单机部署的包,安装步骤请看我的文中介绍,经过大量实验搭建总结出来的文档