51单片机SPI总线的实现

发布者:心动代码最新更新时间:2015-09-08 来源: eefocus关键字:51单片机  SPI总线 手机看文章 扫描二维码
随时随地手机看文章
//-----------------------函数声明,变量定义------------------------------------------------------

#include

#include

sbit SCK=P1^0; // 将p1.0口模拟时钟输出

sbit MOSI=P1^1; // 将p1.1口模拟主机输出

sbit MISO=P1^2; // 将p1.1口模拟主机输入

sbit SS1=P1^3; // 将p1.1口模拟片选

#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

 

//-----------------------------------------------------------------------------------------------

// 函数名称: SPISendByte

// 入口参数: ch

// 函数功能: 发送一个字节

//------------------------------------------------------------------------------------------------

void SPISendByte(unsigned char ch)

{

unsigned char idata n=8; // 向SDA上发送一位数据字节,共八位

SCK = 1 ; //时钟置高

SS1 = 0 ; //选择从机

 

while(n--)

{

delayNOP();

SCK = 0 ; //时钟置低

if((ch&0x80) == 0x80) // 若要发送的数据最高位为1则发送位1

{

MOSI = 1; // 传送位1

}

else

{

MOSI = 0; // 否则传送位0

}

delayNOP();

ch = ch<<1; // 数据左移一位

SCK = 1 ; //时钟置高

}

}

//------------------------------------------------------------------------------------------------

// 函数名称: SPIreceiveByte

// 返回接收的数据

// 函数功能: 接收一字节子程序

//------------------------------------------------------------------------------------------------

unsigned char SPIreceiveByte()

{

unsigned char idata n=8; // 从MISO线上读取一上数据字节,共八位

unsigned char tdata;

SCK = 1; //时钟为高

SS1 = 0; //选择从机

while(n--)

{

delayNOP();

SCK = 0; //时钟为低

delayNOP();

tdata = tdata<<1; // 左移一位,或_crol_(temp,1)

if(MISO == 1)

tdata = tdata|0x01; // 若接收到的位为1,则数据的最后一位置1

else

tdata = tdata&0xfe; // 否则数据的最后一位置0

SCK=1;

}

return(tdata);

}

//------------------------------------------------------------------------------------------------

// 函数名称: SPIsend_receiveByte

// 入口参数: ch

// 返回接收的数据

// 函数功能:串行输入/输出子程序

//------------------------------------------------------------------------------------------------

unsigned char SPIsend_receiveByte(unsigned char ch)

{

unsigned char idata n=8; // 从MISO线上读取一上数据字节,共八位

unsigned char tdata;

SCK = 1; //时钟为高

SS1 = 0; //选择从机

while(n--)

{

delayNOP();

SCK = 0; //时钟为低

delayNOP();

{

tdata = tdata<<1; // 左移一位,或_crol_(temp,1)

if(MISO == 1)

tdata = tdata|0x01; // 若接收到的位为1,则数据的最后一位置1

else

tdata = tdata&0xfe; // 否则数据的最后一位置0

}

{

if((ch&0x80) == 0x80) // 若要发送的数据最高位为1则发送位1

{

MOSI = 1; // 传送位1

}

else

{

MOSI = 0; // 否则传送位0

}

ch = ch<<1; // 数据左移一位

}

SCK=1;

}

return(tdata);

}

关键字:51单片机  SPI总线 引用地址:51单片机SPI总线的实现

上一篇:51单片机I2C总线协议的实现
下一篇:基于51单片机的RS-485的多机通信

推荐阅读最新更新时间:2024-03-16 14:30

51单片机ROM与RAM
众所周知,51内部的存储器分为数据存储器RAM和程序存储器ROM。以AT89c51为例,其中有128字节随机存储器(又称数据储存器RAM)和4K字节的只读存储器(又称程序存储器ROM)。 先说说这个4K字节的程序存储器或者说只读存储器,我们写的程序经过编译器编译成机器码都是存在这个区域,所以称为程序存储器;但单片机上电执行的时候,此区域内的数据只能读取而不能写入,他的只读存储器的名称从这而来。89c51的ROM采用的是FPEROM(Flash Programmable and Erasable Read Only Memory),具体工艺我也不太清楚,号称可以擦写1000次,也就是说你每天写30次,一个多月就报废了。 在说说128
[单片机]
51单片机 同时扩展ROM,RAM的具体实现及kiel的具体设置
51MCU内部有RAM,ROM,不同于8031。尽管如今的增强行51MCU的内部RAM,ROM可能已经很大的空间。但就技术而言,扩展RAM,ROM还是需要学会的。 对于不同的设计方案需求,扩展可能基于以下任何一种设计: A,只扩展RAM B,只扩展ROM C,扩展ROM,RAM ****************************总线扩展时,P2口是否可用做普通IO口************************************ 这种扩展是基于总线扩展的,所以,P0P2口就已经不可以再做它用了(有网友提供信息,总线扩展P2还可以做普通IO口用,有两种
[单片机]
51单片机(STC89C52RC)小综合实验(续2)
  在上一次实验后的电路,拿到实际当中去测试,发现还是出现问题的,主要是电压的回落时间变得很慢,仔细检查电路发现,原因主要是由于变更了电容的容量大小,原来的采用了10uf的滤波电容,变更后采用了3300uf的滤波电容,按理来说滤波电容大点也是没有问题的.更有助于平滑波形不是吗?可是在这个电路当中,主要是希望lm393的电压变化作为信号,在上次实验的时候,采用的是初始电压为0,也就是相当于能够关闭供电电压的,实际是持续供给,初始电压不为0,于是采用大电容后,放电时间延迟严重.   得到的教训:滤波电容并不是越大越好的,需要根据电路的需求进行相应的调整.
[单片机]
51单片机驱动8位数码管电路图+程序
电路图: JP10排线连接J12 J21跳线跳12处 测试程序 #include reg52.h typedef unsigned char BYTE; typedef unsigned int WORD; sbit LS138A = P2^2; //定义138译码器的输入A脚由P2.2控制 sbit LS138B = P2^3; //定义138译码器的输入脚B由P2.3控制 sbit LS138C = P2^4; //定义138译码器的输入脚C由P2.4控制 //此表为 LED 的字模, 共阴数码管 0-9 - BYTE code Disp_Tab = {0x3f,0x06,0
[单片机]
<font color='red'>51单片机</font>驱动8位数码管电路图+程序
51单片机程序技巧
本系列文章探讨的主题都是在Keil uVision3集成编译环境下完成的,针对的是51系列单片机。 下面就介绍一下在我的单片机程序里必须要包含的一个头文件---- const.h ,完整内容如下: #ifndef _CONST_H_ #define _CONST_H_ #include intrins.h #define TRUE 1 #define FALSE 0 typedef unsigned char BYTE; typedef unsigned int WORD; typedef unsigned long DWORD; typedef float FLOAT; typedef char CHAR; typed
[单片机]
51单片机GPS+sim800c GSM定位短信LCD1602液晶显示程序
sim800c+GPS芯片 一个练手的小设计,有点丑哈。附上程序和原理PcB图。 第一次发帖,做的不好烦请原谅哈 按键功能一个按键报警,蜂鸣器响,另外一个按键发送短信到指定的手机上,手机号码程序里面写好就行了 单片机源程序如下: #include common.h #include uart.h #include gps.h #include gsm.h #include lcd.h #define GPS_STR_LEN 48 uchar ess_inc; //char xdata GPS_SEND_STR ; sbit key = P1^3; sbit key1 = P1^4; sbit
[单片机]
<font color='red'>51单片机</font>GPS+sim800c GSM定位短信LCD1602液晶显示程序
51单片机-流水灯
这个是原理图,从图中最右边有一个排阻,也就是这里八个电阻封装在一起,这里排阻的特点是八个 电阻有一个公共端,然后一个电源VCC通过跳线与排阻相连。到达二极管的电流从正极流向负极,如 果二极管负极是低电平,则电流流过二极管,发光二极管亮起来。负极接在单片机的P2端口上。也就 是说P2的引脚位低电平时可驱动发光二极管发光。驱动各个灯闪烁的方法是把各位循环左移,使用函数 _crol_。 #include #include unsigned int a; void delay(){ int i,j; for(i = 0; i 0xff; i++) f
[单片机]
<font color='red'>51单片机</font>-流水灯
基于AT89C51单片机设计的简易智能机器人
引言 随着微电子技术的不断发展,微处理器芯片的集成程度越来越高,单片机已可以在一块芯片上同时集成CPU、存储器、定时器/计数器、并行和串行接口、看门狗、前置放大器、A/D转换器、D/A转换器等多种电路,这就很容易将计算机技术与测量控制技术结合,组成智能化测量控制系统。这种技术促使机器人技术也有了突飞猛进的发展,目前人们已经完全可以设计并制造出具有某些特殊功能的简易智能机器人。 1 设计思想与总体方案 1.1 简易智能机器人的设计思想 本机器人能在任意区域内沿引导线行走,自动绕障,在有光源引导的条件下能沿光源行走。同时,能检测埋在地下的金属片,发出声光指示信息,并能实时存储、显示检测到的断点数目以及各断点至起跑线
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved