标题:
51单片机模拟SPI总线通信程序及proteus仿真
[打印本页]
作者:
221
时间:
2017-11-18 17:44
标题:
51单片机模拟SPI总线通信程序及proteus仿真
分享一个51单片机模拟SPI总线来进行通信的程序及仿真
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(10.33 KB, 下载次数: 105)
下载附件
2017-11-19 06:17 上传
0.png
(14.96 KB, 下载次数: 99)
下载附件
2017-11-19 06:16 上传
单片机源程序如下:
#include<reg51.h> //包含单片机寄存器的头文件
#include<intrins.h> //包含_nop_()函数定义的头文件
//x5045引脚定义
sbit SCK=P3^4; //将SCK位定义为P3.4引脚
sbit SI=P3^5; //将SI位定义为P3.5引脚
sbit SO=P3^6; //将SO位定义为P3.6引脚
sbit CS=P3^7; //将SCK位定义为P3.7引脚
//功能变量定义
#define WREN 0x06 //写使能锁存器允许
#define WRDI 0x04 //写使能锁存器禁止
#define WRSR 0x01 //写状态寄存器
#define READ 0x03 //读出
#define WRITE 0x02 //写入
/*****************************************************
函数功能:延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函数功能:延时若干毫秒
入口参数:n
***************************************************/
void delaynms(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
/*****************************************************
函数功能:从X5045的当前地址读出数据
出口参数:x
***************************************************/
unsigned char ReadCurrent(void)
{
unsigned char i;
unsigned char x=0x00; //储存从X5045中读出的数据
SCK=1; //将SCK置于已知的高电平状态
for(i = 0; i < 8; i++)
{
SCK=1; //拉高SCK
SCK=0; //在SCK的下降沿输出数据
x<<=1; //将x中的各二进位向左移一位,因为首先读出的是字节的最高位数据
x|=(unsigned char)SO; //将SO上的数据通过按位“或“运算存入 x
}
return(x); //将读取的数据返回
}
/*****************************************************
函数功能:写数据到X5045的当前地址
入口参数:dat
***************************************************/
void WriteCurrent(unsigned char dat)
{
unsigned char i;
SCK=0; //将SCK置于已知的低电平状态
for(i = 0; i < 8; i++) // 循环移入8个位
{
SI=(bit)(dat&0x80); //通过按位“与”运算将最高位数据送到S
//因为传送时高位在前,低位在后
SCK=0;
SCK=1; //在SCK上升沿写入数据
dat<<=1; //将y中的各二进位向左移一位,因为首先写入的是字节的最高位
}
}
/*****************************************************
函数功能:写状态寄存器 ,可以设置看门狗的溢出时间及数据保护
入口参数:rs; //储存寄存器状态值
***************************************************/
void WriteSR(unsigned char rs)
{
CS=0; //拉低CS,选中X5045
WriteCurrent(WREN); //写使能锁存器允许
CS=1; //拉高CS
CS=0; //重新拉低CS,否则下面的写寄存器状态指令将被丢弃
WriteCurrent(WRSR); //写状态寄存器
WriteCurrent(rs); //写入新设定的寄存器状态值
CS=1; //拉高CS
}
/*****************************************************
函数功能:写数据到X5045的指定地址
入口参数:addr
***************************************************/
void WriteSet(unsigned char dat,unsigned char addr)
{
SCK=0; //将SCK置于已知状态
CS=0; //拉低CS,选中X5045
WriteCurrent(WREN); //写使能锁存器允许
CS=1; //拉高CS
CS=0; //重新拉低CS,否则下面的写入指令将被丢弃
WriteCurrent(WRITE); //写入指令
WriteCurrent(addr); //写入指定地址
WriteCurrent(dat); //写入数据
CS=1; //拉高CS
SCK=0; //将SCK置于已知状态
}
/*****************************************************
函数功能:从X5045的指定地址读出数据
入口参数:addr
出口参数:dat
***************************************************/
unsigned char ReadSet(unsigned char addr)
{
unsigned char dat;
SCK=0; //将SCK置于已知状态
CS=0; //拉低CS,选中X5045
WriteCurrent(READ); //开始读
WriteCurrent(addr); //写入指定地址
dat=ReadCurrent(); //读出数据
CS=1; //拉高CS
SCK=0; //将SCK置于已知状态
return dat; //返回读出的数据
}
/*****************************************************
函数功能:看门狗复位程序
***************************************************/
void WatchDog(void)
{
CS=1; //拉高CS
CS=0; //CS引脚的一个下降沿复位看门狗定时器
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
SPI.zip
(38.13 KB, 下载次数: 437)
2017-11-18 17:44 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
LHT_Peter
时间:
2018-2-8 09:17
百度只看到这个有源码
作者:
ye5914
时间:
2018-4-7 13:22
真好 很棒
作者:
neroli
时间:
2018-5-2 11:58
不错的东西,下来看看
作者:
吴中男
时间:
2018-5-21 20:26
好 真棒
作者:
好的好的
时间:
2018-7-19 13:14
强强,小白受教了
作者:
烦死地球人
时间:
2018-7-27 13:25
感谢大佬
作者:
烦死地球人
时间:
2018-7-27 13:44
他就是可以实现普通IO口模拟SPI的功能 对吧
作者:
tianqi911
时间:
2018-9-13 10:14
Proteus里这个芯片没有 看门狗 模块。可以搞其他部分。
作者:
wdliming
时间:
2018-9-29 14:50
谢谢!!!
作者:
syjs10
时间:
2019-1-9 20:31
感谢大佬分享
作者:
nyyinye
时间:
2019-3-30 11:19
感谢分享
作者:
PegasusHu
时间:
2019-4-23 21:15
小白来学习,回复可以拿币吗?
作者:
standanhy
时间:
2019-4-25 10:31
学习一下
作者:
zzn6737
时间:
2019-5-26 16:38
正需要这个来参考一下,谢谢楼主.
作者:
顺德动力
时间:
2019-8-6 23:26
下来学习学习,感谢分享。
作者:
yong11
时间:
2019-9-10 17:49
为什么时钟是(3j+2)*i=(3×33+2)×10=1010(微秒)
作者:
zz烂尾
时间:
2019-11-15 07:08
很好,学习了
作者:
lw1997
时间:
2020-3-14 00:24
感谢分享
作者:
cxllll
时间:
2020-6-12 20:41
这个可以运行吗
作者:
hj3ger
时间:
2020-6-15 09:42
很棒,非常感谢
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1