找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2955|回复: 1
收起左侧

中颖单片机SH88F516读写SPI总线EEPROM 93C56的源程序

[复制链接]
ID:246796 发表于 2017-11-18 04:57 | 显示全部楼层 |阅读模式
代码工程与芯片pdf资料:
0.png


实现本功能的中颖单片机源码如下:
  1. /*************************************************************************************************
  2. 说明;SPI使用EEPROM存储芯片93C56A,256X8bit=2K的存储空间.在使用SPI通讯时通常使用端口进行仿真,为了符合
  3. 使用需要,本程序同样使用了端口进行仿真,当然也可以直接使用88F516自带的SPI总线进行通讯.
  4. 串口1用于观测93C56A的读写数据正确与否?写入成功接收到数据R,写入失败接收到数据E,读取成功接收到数据r,
  5. 读取失败接收到数据e.
  6. 要求:打开拨码开关J6的5,6,7,8,打开拨码开关J4
  7. *************************************************************************************************/

  8. #include <sh88f516.h>
  9. #include <INTRINS.H>        //for use 51 instruction

  10. sbit cs_93=P1^4;
  11. sbit di_93=P1^5;
  12. sbit do_93=P1^6;
  13. sbit sk_93=P1^7;

  14. void UART1SendChar(unsigned char value)
  15. {
  16.         IEN1 &= 0xFB;               //ES1=0;               
  17.         SBUF1=value;                            //写SBUF1,激活发送
  18.         while(TI1==0);                          //等待转换结束
  19.         TI1=0;                                                //清除发送标志位
  20.         IEN1 = 0x04;                //ES1=1;               
  21. }


  22. /*-----------------------------------------------------
  23. SPI93cXX系列函数调用
  24. void high56(void)--------发送1
  25. void low56(void) --------发送0
  26. void wd56(unsigned char dd)        --------写8位数据,输入参数address or data
  27. unsigned char rd56(void) --------读8位数据,返回值data
  28. -----------------------------------------------------*/
  29. void high56(void)
  30. {
  31.         di_93=1;
  32.         sk_93=1; _nop_();
  33.         sk_93=0; _nop_();
  34. }
  35. void low56(void)
  36. {
  37.         di_93=0;
  38.         sk_93=1;_nop_();
  39.         sk_93=0;_nop_();
  40. }
  41. void wd56(unsigned char dd)
  42. {
  43.         unsigned char i;
  44.         for (i=0;i<8;i++)
  45.         {
  46.                 if (dd>=0x80) high56();
  47.                 else low56();
  48.                 dd=dd<<1;
  49.         }
  50. }
  51. unsigned char rd56(void)
  52. {
  53.         unsigned char i,dd=0;
  54.         do_93=1;
  55.         for (i=0;i<8;i++)
  56.         {
  57.                 dd<<=1;
  58.                 sk_93=1;_nop_();
  59.                 sk_93=0;_nop_();
  60.                 if (do_93) dd|=1;
  61.         }
  62.         return(dd);
  63. }

  64. /*-----------------------------------------------------
  65. SPI93c56系列函数调用
  66. void ewen56(void)-----------写使能
  67. unsigned char read93c56_word(unsigned char address) ------------SPI读函数,输入参数为address,返回dat
  68. bit write93c56_word(unsigned char address,unsigned char dat)----SPI写函数,输入参数为address,dat,写入成功返回0,失败返回1
  69. -----------------------------------------------------*/
  70. void ewen56(void)
  71. {
  72.         _nop_();
  73.         cs_93=1;
  74.         high56();
  75.         low56();
  76.         low56();
  77.         //low56();
  78.         high56();//add
  79.         wd56(0xc0);
  80.         //wd56(0x00);
  81.         cs_93=0;
  82. }

  83. unsigned char read93c56_word(unsigned char address)
  84. {
  85.         unsigned char dat;
  86.         cs_93=sk_93=0;
  87.         cs_93=1;

  88.         high56();                        //1 --start
  89.         high56();                        //1       
  90.         low56();                        //0        --10 read
  91.         low56();                        //X        --A8,
  92.         wd56(address);                //A7--A0
  93.         dat=rd56();                        //data

  94.         cs_93=0;
  95.         return(dat);
  96. }

  97. bit write93c56_word(unsigned char address,unsigned char dat)
  98. {
  99.         unsigned char e;
  100.         unsigned char temp=address;
  101.         e=0;
  102.         while (e<3)
  103.         {
  104.                 cs_93=sk_93=0;
  105.                 cs_93=1;
  106.                 ewen56();
  107.                 _nop_();
  108.                 cs_93=1;
  109.                 _nop_();

  110.                 high56();                  //1 --start
  111.                 low56();                  //0       
  112.                 high56();                  //1        --01 write
  113.                 low56();                  //X        --A8,
  114.                 wd56(address);          //A7--A0
  115.                 wd56(dat);                  //data

  116.                 cs_93=0;
  117.                 _nop_();
  118.                 cs_93=1;

  119.                 do_93=1;
  120.                 while (1)
  121.                 {
  122.                         if (do_93==1) break;
  123.                 }
  124.                 cs_93=0;
  125.                 if (read93c56_word(temp)==dat)
  126.                 {
  127.                         return(0);
  128.                 }
  129.                 e++;
  130.         }
  131.         return(1);
  132. }



  133. main()
  134. {
  135.     unsigned char i;

  136.         CLKCON = 0x60;                   //f=osc/12

  137.         SCON1 = 0x50;                    //工作方式选择,此处为工作方式1
  138.         SBRT1 = 0xFF;                   //波特率设置.工作在方式1时,BAUDRATE=(1/16)*Fsys/(32768-SBRT[1:0])   Fsys=16M
  139.         SBRT0 = 0xF7;                   //Fsys=16M/12

  140.         IEN1 = 0x04;                       
  141.         EA = 1;  

  142.         for(i=0;i<200;i++)
  143.         {
  144. ……………………

  145. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码



压缩包里面包含有中颖单片机sh88f516常用功能的源码,中文注释都很详细
下载地址:http://www.51hei.com/bbs/dpj-98300-1.html



回复

使用道具 举报

ID:149075 发表于 2018-7-26 09:30 | 显示全部楼层
已学习,再接再厉!加油
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表