历史上的今天
今天是:2025年01月18日(星期六)
2020年01月18日 | Proteus仿真51单片机的SPI通信程序
2020-01-18 来源:51hei
仿真原理图如下
实验现象 会有数码管1到8的显示 从机跟随主机
单片机源程序如下:
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit SCK = P1^0;//位定义时钟
//sbit CS = P1^1;//位定义片选(使能) 此项目可以不使用
sbit SDI = P1^2;//位定义Input
sbit SDO = P1^3;//位定义Output
/*-----函数声明-----*/
void delay5us();
void delay();
void SpiSend(uchar dat1);
uchar SpiReceive();
/*-----主函数(主机)-----*//
void main()
{
unsigned char i;
P2 = 8;
while(1)
{
for(i = 0; i<10 ;i++)
{
P2 = i;
SpiSend(i);
delay();
}
}
;//空语句
}
/*-----5微秒延时函数-----*/
void delay5us()
{
_nop_();
}
/*-----延时函数-----*/
void delay()
{
uchar i=1000,j=1000;
while(i--)
while(j--);
}
/*-----CPHA=0;CPOL=1 模式2-----*/
/*-----SPI发送函数-----*/
/*-----上升沿发送-----*/
void SpiSend(uchar dat1)
{
uchar i;
for (i=0; i<8; ++i)//8bit,一位一位写
{
SCK = 0;
if (dat1 & 0x80)//判断当前最高位为1还是0
{
SDO = 1;
}
else
{
SDO = 0;
}
SCK = 1;//上升沿发送数据
dat1 <<= 1;
delay5us();
}
}
/*-----SPI接收函数-----*/
/*-----下降沿接收-----*/
uchar SpiReceive()
{
uchar i, dat0;
dat0 = 0x00;//dat0初始化
for (i=0; i<8; ++i)//8bit,一位一位读
{
dat0<<=1;
while(SCK == 1);
while(SCK == 0);//下降沿读取数据
dat0 |= SDI;
}
return (dat0);//收到数据(返回值)dat0
}
# include
# include
# define uchar unsigned char
# define uint unsigned int
sbit SCK = P1^0;//位定义时钟
//sbit CS = P1^1;//位定义片选(使能) 此项目可以不使用
sbit SDI = P1^2;//位定义Input
sbit SDO = P1^3;//位定义Output
/*-----函数声明-----*/
void delay5us();
void SpiSend(uchar dat1);
uchar SpiReceive();
/*-----主函数(从机)-----*/
void main()
{
//UARTInit();
while(1)
{
P2 = SpiReceive();// 循环接收数据
}
;//空语句
}
/*-----5微秒延时函数-----*/
void delay5us()
{
_nop_();
}
/*-----CPHA=0;CPOL=1 模式2-----*/
/*-----SPI发送函数-----*/
/*-----上升沿发送-----*/
void SpiSend(uchar dat1)
{
uchar i;
for (i=0; i<8; ++i)//8bit,一位一位写
{
SCK = 0;
if (dat1 & 0x80)//判断当前最高位为1还是0
{
SDO = 1;
}
else
{
SDO = 0;
}
SCK = 1;//上升沿发送数据
dat1 <<= 1;
delay5us();
}
}
/*-----SPI接收函数-----*/
/*-----下降沿接收-----*/
uchar SpiReceive()
{
uchar i, dat0;
dat0 = 0x00;//dat0初始化
for (i=0; i<8; ++i)//8bit,一位一位读
{
dat0<<=1;
while(SCK == 1);
while(SCK == 0);//下降沿读取数据
dat0 |= SDI;
}
return (dat0);//收到数据(返回值)dat0
}
史海拾趣
|
各位老大问个ADS的问题 我想裸奔ARM 2440但有AXD调试的时候报 DBE Warning 00056: The statement into which was stepped is singular (i.e. it has no exit) 程序无法跳转到MAIN函数里面。 我想请教一下是啥问题,我的R0设置为0X30002000 ini ...… 查看全部问答> |
|
1、Total Control Sigma键盘输入满足您用键盘输入文字的需求,使您打字如飞。。。Total Control 会在您的手机上安装 Sigma 输入法,当手机连接电脑后,可以在键盘上进行文字输入。聊天,发贴不再需要“一指禅”,操作起来方便迅速,得心应手 截屏 ...… 查看全部问答> |
|
大家都收到了STM32F429I,可是我今天才收到,所以传一个STM32 STLINK驱动 我已经使用证明可以了,根据某论坛说的应该装在C:中的INF中所以我也就那么做了,装在别处是否可以我没验证,呵呵。分享给大家呗! [ 本帖最后由 jsxykj1 于 2013-12-19 14:30 编辑 ]… 查看全部问答> |
|
这是关于EDA软件工具Allegro的教学书,想巩固一下PCB基础的可以参考下。 https://download.eeworld.com.cn/download/lixandq/551527 … 查看全部问答> |




