求51单片机模拟SPI通讯的C程序,最好带详解!谢谢

求51单片机模拟SPI通讯的C程序,最好带详解!谢谢,第1张

调试已经通过

///////////////////////////spi.h/////////////////////////////

#ifndef

SPI_H

#define

SPI_H

#include

<stc12le5a60s2.h>

#include

<spi.h>

//sfr

P4

=

0xe8

//STC12LE5A60S2单片机自带SPI控制器连接

//sbit

VCC1

=

P2^0//

VCC1

NO

USE

//sbit

SON

=

P1^6

//

MISO

//sbit

SIN

=

P1^5

//

MOSI

//sbit

SCKN

=

P1^7

//

SCK

sbit

CSN

=

P1^4

//

28J60

--

CS

//sbit

RSTN

=

P3^5

//RST,

no

use

//sbit

INTN

=

P3^3

//

INT,

no

use

void

init_spi(void)

void

WriteByte(u8_t

temp)

u8_t

ReadByte(void)

#endif

//////////////咐毕//////////////////////////////////////////////////

///////////////////////////spi.c/////////////////////////////

#include<spi.h>

//STC12LE5A60S2单片机自带SPI控制器连接

void

init_spi(void)

{

//SSIG

=

1

//忽略SS脚

//SPEN

=

1

//允许SPI工作

//DORD

=

0

//先传高位MSB

//MSTR

=

1

//设置单片机为主机

SPCTL

=

0xD0

//SPI

Control

Register

SSIG

SPEN

DORD

MSTR

CPOL

CPHA

SPR1

SPR0

0000,0100

SPSTAT

=

0xC0

//歼简碰

//IE2

|=

0x02

//允许SPI中断控制位

}

void

WriteByte(u8_t

temp)

{

SPDAT

=

temp

while(!(SPSTAT

&

0x80))

SPSTAT

=

0xC0

}

u8_t

ReadByte(void)

{

idata

u8_t

temp

//SPSTAT

=

0xC0

SPDAT

=

0x00

while(!(SPSTAT

&

0x80))

temp

=

SPDAT

SPSTAT

=

0xC0

return

temp

}

/////氏谈///////////////////////////////////////////////////////////

1.定义三个gpio: p0-sclk, p1-sdi, p2-sdo;p0用于模拟spi的clock,薯陆禅p1用于接收数据,p2用于f发送数据;硬件上单片机A的p0接单片机B的p0,A的p1接B的p2,A的p2接B的p1

2.发送程序:clock拉低,sdo输出0或1(数据),延时一定时间,clock拉高,延时一定时间,这样A就发送一位数据到B,循环8次就发送一个字节数据

3.接收程序:检测clock状态,数尘如果为低,就读取sdi,直到clock拉高,结束该次输入,重复8次,读取一个字节

注意:

1。clock空闲状态为高,发送数据就拉低;悉轮

2.还需要加入起始停止同步协议,可根据需要进行完善

实现单片机和PC机进行SPI通讯方法:\x0d\x0a1:电路设计\x0d\x0a设计的电路,利用两片AT89C52芯片,一片做为发送模块,一片做为接收模块。分别编写发送和接收程序,实现数据的发送和接受。通过LED显示接收到的数据。通过示波器观察输出的波形。\x0d\x0a2:编写程序\x0d\x0a根据设计好的电路及题目要求分别编写数据发送程序和数据接收程序。①:数据发送程序#define\x0d\x0aucharunsignedchar\x0d\x0a#defineuintunsignedint\x0d\x0a\x0d\x0a#defineulongunsignedlong\x0d\x0a//---------------------------#include\x0d\x0a#include\x0d\x0a//---------------------------sbitSPICLK=P1^0//时钟信号sbitMOSI=P1^1//主器件数据输出,从器件数据输入sbitMISO=P1^2//主器件数据输入,从器件数据输出\x0d\x0asbitSS=P1^3//从器件使能信号\x0d\x0avoidDat_Transmit(uchardat)//发送数据程序\x0d\x0a{uchari,datbuf\x0d\x0adatbuf=dat\x0d\x0aSS=1while(SS){}for(i=0i\x0d\x0a#include\x0d\x0a//---------------------------sbitSPICLK=P1^0//时钟信号sbitMOSI=P1^1//主器件数据输出,从器件数据输入sbitMISO=P1^2//主器件数据输入,返裤运从器件数据输出sbitSS=P1^3//从器件使能信号\x0d\x0a\x0d\x0a//---------------------------voidNop(void)\x0d\x0a{\x0d\x0a}\x0d\x0avoidDelay(uchart){while(t--){}\x0d\x0a}\x0d\x0a\x0d\x0aucharData_Receive(void)//数据接收程序\x0d\x0a{uchari,dat=0,tempbit\x0d\x0abt\x0d\x0a\x0d\x0aSPICLK=1MISO=1SS=0\x0d\x0a//选中器件\x0d\x0aNop()Nop()\x0d\x0afor(i=0i 回答于 2022-12-14


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12386969.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存