专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STC15模擬i2c從機
2019-03-24 17:11
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
8790
5
1598
我是學習STC15的新手,想要把STC15模擬成i2c從機和另一主機溝通,但是網路上都找不到從機的範例可以參考,請問有高手能提供C語言的實例給我參考嗎?謝謝 此帖出自
小平头技术问答
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
qwqwqw2088
1楼-- · 2019-03-25 03:01
從機的範例
STC15的手册应该有范例
加载中...
ABCD1771
2楼-- · 2019-03-25 04:52
精彩回答 2 元偷偷看……
加载中...
ienglgge
3楼-- · 2019-03-25 06:38
给你个思路,参考一下。可以操作两个io,输出高低电平,产生简单时序。单纯发送。 认真分析i2c的时序。踏下心来,这一步很重要。 设计一个主设备控制流程图。结合一个参考程序,主设备程序不难找吧, 连接从设备,实现简单通信。设计从设备通信的流程图。用程序实现,进行调试。
加载中...
数码小叶
4楼-- · 2019-03-25 12:01
单主单从:
#include "reg51.h"
//#define MASTER //define:master undefine:slave
#define FOSC 11059200L
#define BAUD (256 - FOSC / 32 / 115200)
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef unsigned long DWORD;
sfr AUXR = 0x8e; //Auxiliary register
sfr SPSTAT = 0xcd; //SPI status register
#define SPIF 0x80 //SPSTAT.7
#define WCOL 0x40 //SPSTAT.6
sfr SPCTL = 0xce; //SPI control register
#define SSIG 0x80 //SPCTL.7
#define SPEN 0x40 //SPCTL.6
#define DORD 0x20 //SPCTL.5
#define MSTR 0x10 //SPCTL.4
#define CPOL 0x08 //SPCTL.3
#define CPHA 0x04 //SPCTL.2
#define SPDHH 0x00 //CPU_CLK/4
#define SPDH 0x01 //CPU_CLK/16
#define SPDL 0x02 //CPU_CLK/64
#define SPDLL 0x03 //CPU_CLK/128
sfr SPDAT = 0xcf; //SPI data register
sbit SPISS = P1^3; //SPI slave select, connect to slave' SS(P1.4) pin
void InitUart();
void InitSPI();
void SendUart(BYTE dat); //send data to PC
BYTE RecvUart(); //receive data from PC
BYTE SPISwap(BYTE dat); //swap SPI data between master and slave
///////////////////////////////////////////////////////////
void main()
{
InitUart(); //initial UART
InitSPI(); //initial SPI
while (1)
{
#ifdef MASTER //for master (receive UART data from PC and send it to slave, in the meantime
// receive SPI data from slave and send it to PC)
SendUart(SPISwap(RecvUart()));
#else //for salve (receive SPI data from master and
ACC = SPISwap(ACC); // send previous SPI data to master)
#endif
}
}
///////////////////////////////////////////////////////////
void InitUart()
{
SCON = 0x5a; //set UART mode as 8-bit variable baudrate
TMOD = 0x20; //timer1 as 8-bit auto reload mode
AUXR = 0x40; //timer1 work at 1T mode
TH1 = TL1 = BAUD; //115200 bps
TR1 = 1;
}
///////////////////////////////////////////////////////////
void InitSPI()
{
SPDAT = 0; //initial SPI data
SPSTAT = SPIF | WCOL; //clear SPI status
#ifdef MASTER
SPCTL = SPEN | MSTR; //master mode
#else
SPCTL = SPEN; //slave mode
#endif
}
///////////////////////////////////////////////////////////
void SendUart(BYTE dat)
{
while (!TI); //wait pre-data sent
TI = 0; //clear TI flag
SBUF = dat; //send current data
}
///////////////////////////////////////////////////////////
BYTE RecvUart()
{
while (!RI); //wait receive complete
RI = 0; //clear RI flag
return SBUF; //return receive data
}
///////////////////////////////////////////////////////////
BYTE SPISwap(BYTE dat)
{
#ifdef MASTER
SPISS = 0; //pull low slave SS
#endif
SPDAT = dat; //trigger SPI send
while (!(SPSTAT & SPIF)); //wait send complete
SPSTAT = SPIF | WCOL; //clear SPI status
#ifdef MASTER
SPISS = 1; //push high slave SS
#endif
return SPDAT; //return received SPI data
}
复制代码
加载中...
xgliyouquan
5楼-- · 2019-03-25 13:49
精彩回答 2 元偷偷看……
加载中...
一周热门
更多
>
相关问题
相关文章
基于51单片机的计算器设计
0个评论
51单片机300个proteus仿真实例下载
0个评论
51单片机 蜂鸣器
0个评论
51单片机驱动RC522模块
0个评论
基于51单片机的指纹密码锁
0个评论
AT89C51单片机制作简易密码锁
0个评论
51单片机汇编语言计数器
0个评论
51单片机精确延时设计
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
STC15的手册应该有范例
- #include "reg51.h"
- //#define MASTER //define:master undefine:slave
- #define FOSC 11059200L
- #define BAUD (256 - FOSC / 32 / 115200)
- typedef unsigned char BYTE;
- typedef unsigned int WORD;
- typedef unsigned long DWORD;
- sfr AUXR = 0x8e; //Auxiliary register
- sfr SPSTAT = 0xcd; //SPI status register
- #define SPIF 0x80 //SPSTAT.7
- #define WCOL 0x40 //SPSTAT.6
- sfr SPCTL = 0xce; //SPI control register
- #define SSIG 0x80 //SPCTL.7
- #define SPEN 0x40 //SPCTL.6
- #define DORD 0x20 //SPCTL.5
- #define MSTR 0x10 //SPCTL.4
- #define CPOL 0x08 //SPCTL.3
- #define CPHA 0x04 //SPCTL.2
- #define SPDHH 0x00 //CPU_CLK/4
- #define SPDH 0x01 //CPU_CLK/16
- #define SPDL 0x02 //CPU_CLK/64
- #define SPDLL 0x03 //CPU_CLK/128
- sfr SPDAT = 0xcf; //SPI data register
- sbit SPISS = P1^3; //SPI slave select, connect to slave' SS(P1.4) pin
- void InitUart();
- void InitSPI();
- void SendUart(BYTE dat); //send data to PC
- BYTE RecvUart(); //receive data from PC
- BYTE SPISwap(BYTE dat); //swap SPI data between master and slave
- ///////////////////////////////////////////////////////////
- void main()
- {
- InitUart(); //initial UART
- InitSPI(); //initial SPI
- while (1)
- {
- #ifdef MASTER //for master (receive UART data from PC and send it to slave, in the meantime
- // receive SPI data from slave and send it to PC)
- SendUart(SPISwap(RecvUart()));
- #else //for salve (receive SPI data from master and
- ACC = SPISwap(ACC); // send previous SPI data to master)
- #endif
- }
- }
- ///////////////////////////////////////////////////////////
- void InitUart()
- {
- SCON = 0x5a; //set UART mode as 8-bit variable baudrate
- TMOD = 0x20; //timer1 as 8-bit auto reload mode
- AUXR = 0x40; //timer1 work at 1T mode
- TH1 = TL1 = BAUD; //115200 bps
- TR1 = 1;
- }
- ///////////////////////////////////////////////////////////
- void InitSPI()
- {
- SPDAT = 0; //initial SPI data
- SPSTAT = SPIF | WCOL; //clear SPI status
- #ifdef MASTER
- SPCTL = SPEN | MSTR; //master mode
- #else
- SPCTL = SPEN; //slave mode
- #endif
- }
- ///////////////////////////////////////////////////////////
- void SendUart(BYTE dat)
- {
- while (!TI); //wait pre-data sent
- TI = 0; //clear TI flag
- SBUF = dat; //send current data
- }
- ///////////////////////////////////////////////////////////
- BYTE RecvUart()
- {
- while (!RI); //wait receive complete
- RI = 0; //clear RI flag
- return SBUF; //return receive data
- }
- ///////////////////////////////////////////////////////////
- BYTE SPISwap(BYTE dat)
- {
- #ifdef MASTER
- SPISS = 0; //pull low slave SS
- #endif
- SPDAT = dat; //trigger SPI send
- while (!(SPSTAT & SPIF)); //wait send complete
- SPSTAT = SPIF | WCOL; //clear SPI status
- #ifdef MASTER
- SPISS = 1; //push high slave SS
- #endif
- return SPDAT; //return received SPI data
- }
复制代码一周热门 更多>