51单片机模拟spi通信c语言,51单片机模拟SPI总线通信程序及proteus仿真

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引脚的一个下降沿复位看门狗定时器

……………………

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值