6421|5

2

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STC15模擬i2c從機 [复制链接]

我是學習STC15的新手,想要把STC15模擬成i2c從機和另一主機溝通,但是網路上都找不到從機的範例可以參考,請問有高手能提供C語言的實例給我參考嗎?謝謝
此帖出自51单片机论坛

最新回复

这本书上的IIC通信原理讲解非常详细,有个例子与你需求很接近。[attach]319913[/attach] [attach]319914[/attach]   详情 回复 发表于 2017-9-4 22:07
点赞 关注
 

回复
举报

2万

帖子

342

TA的资源

版主

沙发
 
從機的範例
STC15的手册应该有范例
此帖出自51单片机论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
qwqwqw2088 发表于 2017-8-30 00:05
從機的範例
STC15的手册应该有范例

官方手冊裡面只有用匯編語言寫的,沒有C語言寫的範例,抱歉我是新手還看不懂匯編語言,想說從C入門會比較容易上手,感謝大大的回覆,若有C語言的範例還請告知小弟,謝謝
此帖出自51单片机论坛
 
 
 

回复

3471

帖子

13

TA的资源

五彩晶圆(高级)

4
 
给你个思路,参考一下。可以操作两个io,输出高低电平,产生简单时序。单纯发送。  认真分析i2c的时序。踏下心来,这一步很重要。 设计一个主设备控制流程图。结合一个参考程序,主设备程序不难找吧, 连接从设备,实现简单通信。设计从设备通信的流程图。用程序实现,进行调试。
此帖出自51单片机论坛
 
 
 

回复

2549

帖子

0

TA的资源

五彩晶圆(初级)

5
 
单主单从:
  1. #include "reg51.h"

  2. //#define MASTER                  //define:master undefine:slave
  3. #define FOSC        11059200L
  4. #define BAUD        (256 - FOSC / 32 / 115200)

  5. typedef unsigned char BYTE;
  6. typedef unsigned int WORD;
  7. typedef unsigned long DWORD;

  8. sfr  AUXR       =   0x8e;       //Auxiliary register

  9. sfr SPSTAT      =   0xcd;       //SPI status register
  10. #define SPIF        0x80        //SPSTAT.7
  11. #define WCOL        0x40        //SPSTAT.6
  12. sfr SPCTL       =   0xce;       //SPI control register
  13. #define SSIG        0x80        //SPCTL.7
  14. #define SPEN        0x40        //SPCTL.6
  15. #define DORD        0x20        //SPCTL.5
  16. #define MSTR        0x10        //SPCTL.4
  17. #define CPOL        0x08        //SPCTL.3
  18. #define CPHA        0x04        //SPCTL.2
  19. #define SPDHH       0x00        //CPU_CLK/4
  20. #define SPDH        0x01        //CPU_CLK/16
  21. #define SPDL        0x02        //CPU_CLK/64
  22. #define SPDLL       0x03        //CPU_CLK/128
  23. sfr SPDAT       =   0xcf;       //SPI data register
  24. sbit SPISS      =   P1^3;       //SPI slave select, connect to slave' SS(P1.4) pin

  25. void InitUart();
  26. void InitSPI();
  27. void SendUart(BYTE dat);        //send data to PC
  28. BYTE RecvUart();                //receive data from PC
  29. BYTE SPISwap(BYTE dat);         //swap SPI data between master and slave

  30. ///////////////////////////////////////////////////////////

  31. void main()
  32. {
  33.     InitUart();                 //initial UART
  34.     InitSPI();                  //initial SPI

  35.     while (1)
  36.     {
  37. #ifdef MASTER                   //for master (receive UART data from PC and send it to slave, in the meantime
  38.                                 //            receive SPI data from slave and send it to PC)
  39.         SendUart(SPISwap(RecvUart()));
  40. #else                           //for salve (receive SPI data from master and
  41.         ACC = SPISwap(ACC);     //           send previous SPI data to master)
  42. #endif
  43.     }
  44. }

  45. ///////////////////////////////////////////////////////////

  46. void InitUart()
  47. {
  48.     SCON = 0x5a;                //set UART mode as 8-bit variable baudrate
  49.     TMOD = 0x20;                //timer1 as 8-bit auto reload mode
  50.     AUXR = 0x40;                //timer1 work at 1T mode
  51.     TH1 = TL1 = BAUD;           //115200 bps
  52.     TR1 = 1;
  53. }

  54. ///////////////////////////////////////////////////////////

  55. void InitSPI()
  56. {
  57.     SPDAT = 0;                  //initial SPI data
  58.     SPSTAT = SPIF | WCOL;       //clear SPI status
  59. #ifdef MASTER
  60.     SPCTL = SPEN | MSTR;        //master mode
  61. #else
  62.     SPCTL = SPEN;               //slave mode
  63. #endif
  64. }

  65. ///////////////////////////////////////////////////////////

  66. void SendUart(BYTE dat)
  67. {
  68.     while (!TI);                //wait pre-data sent
  69.     TI = 0;                     //clear TI flag
  70.     SBUF = dat;                 //send current data
  71. }

  72. ///////////////////////////////////////////////////////////

  73. BYTE RecvUart()
  74. {
  75.     while (!RI);                //wait receive complete
  76.     RI = 0;                     //clear RI flag
  77.     return SBUF;                //return receive data
  78. }

  79. ///////////////////////////////////////////////////////////

  80. BYTE SPISwap(BYTE dat)
  81. {
  82. #ifdef MASTER
  83.     SPISS = 0;                  //pull low slave SS
  84. #endif
  85.     SPDAT = dat;                //trigger SPI send
  86.     while (!(SPSTAT & SPIF));   //wait send complete
  87.     SPSTAT = SPIF | WCOL;       //clear SPI status
  88. #ifdef MASTER
  89.     SPISS = 1;                  //push high slave SS
  90. #endif
  91.     return SPDAT;               //return received SPI data
  92. }
复制代码

此帖出自51单片机论坛
 
 
 

回复

16

帖子

0

TA的资源

一粒金砂(中级)

6
 
这本书上的IIC通信原理讲解非常详细,有个例子与你需求很接近。 第14章(电压_电流表_计数器_显示器).rar (821.18 KB, 下载次数: 52)

此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表