单片机 c语言 定义i o,【51单片机】普通I/O口模拟SPI口C语言程序

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

89C51系列单片机都不带SPI口,所在在这种情况下,我们可以模拟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);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python format 格式化函数

Python2.6 开始&#xff0c;新增了一种格式化字符串的函数 str.format()&#xff0c;它增强了字符串格式化的功能。 基本语法是通过 {} 和 : 来代替以前的 % 。 format 函数可以接受不限个参数&#xff0c;位置可以不按顺序。 实例 “{} {}”.format(“hello”, “world”) # 不…

潭州课堂25班:Ph201805201 爬虫基础 第九课 图像处理- PIL (课堂笔记)

Python图像处理-Pillow 简介 Python传统的图像处理库PIL(Python Imaging Library )&#xff0c;可以说基本上是Python处理图像的标准库&#xff0c;功能强大&#xff0c;使用简单。 但是由于PIL不支持Python3&#xff0c;而且更新缓慢。所以有志愿者在PIL的基础上创建了一个分支…

linux 安装qq,如何安装linux版本QQ?

layout: pagetitle: linuxQQ发布description: linuxQQ安装tags:Linuxqqcategories: linux前文时光匆匆&#xff0c;随着时间流逝&#xff0c;已经来到了2019年&#xff0c;在这一年的1024程序员节这天&#xff0c;腾讯终于又发布了linux版的qq&#xff0c;说起来也是喜大普奔&a…

Python中range()函数的用法

1、函数原型&#xff1a;range&#xff08;start&#xff0c; end&#xff0c; scan)&#xff1a; 参数含义&#xff1a; start:计数从start开始。默认是从0开始。例如range&#xff08;5&#xff09;等价于range&#xff08;0&#xff0c; 5&#xff09;; end:技术到end结束&a…

[SimplePlayer] 1. 从视频文件中提取图像

在开始之前&#xff0c;我们需要了解视频文件的格式。视频文件的格式众多&#xff0c;无法三言两语就能详细分析其结构&#xff0c;尽管如此&#xff0c;ffmpeg却很好地提取了各类视频文件的共同特性&#xff0c;并对其进行了抽象描述。 视频文件格式&#xff0c;统称为contain…

android glide 版本,Android Studio 第六十七期 - Android Glide3.7.0和3.8.0用法

一、前言&#xff1a;再优秀的开源库都有坑要填手上的项目使用的图片加载框架是&#xff1a;Universal-Image-Loader业务需要定制化的一些代码。Universal-Image-Loader 这个框架是一个非常经典好用的框架&#xff0c;唯一的问题是是作者很久之前就不再更新了。所以综合考虑下&…

实例21:python

#猴子吃桃问题&#xff1a;猴子第一天摘下若干个桃子&#xff0c; #当即吃了一半&#xff0c;还不瘾&#xff0c;又多吃了一个第二天早上又将剩下的桃子吃掉一半&#xff0c; #又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。 #到第10天早上想再吃时&#xff0c;见只…

thincmf 分页无法搜索_thinkcmf5 后台搜索分页保持分页条件

本文最后更新于2019-05-16&#xff0c;已超过 1年没有更新&#xff0c;如果文章内容、图片或者下载资源失效&#xff0c;请留言反馈&#xff0c;我会及时处理&#xff0c;谢谢&#xff01;温馨提示&#xff1a;本文共568个字&#xff0c;读完预计2分钟。$where array();$keywo…

Python List insert()方法

Python 列表 描述 insert() 函数用于将指定对象插入列表的指定位置。 语法 insert()方法语法&#xff1a; list.insert(index, obj) 参数 • index – 对象 obj 需要插入的索引位置。 • obj – 要插入列表中的对象。 返回值 该方法没有返回值&#xff0c;但会在列表指定位置插…

android5.1 显示方向,Android5.1 Settings.apk定制显示选项

在Android5.0后&#xff0c;系统应用的目录结构发生了一些变化&#xff0c;以往/system/app/下直接是APK文件&#xff0c;目前是/system/app/应用名目录/应用apk类似这种目录结构。同时在Android5.1上反编译Settings.apk需要使用最新apktool_2.0.3来反编译&#xff0c;否则无法…

db2locate函数_DB2常用函数详解

VALUE函数语法&#xff1a;VALUE(EXPRESSION1,EXPRESSION2)VALUE函数是用返回一个非空的值&#xff0c;当其第一个参数非空&#xff0c;直接返回该参数的值&#xff0c;如果第一个参数为空&#xff0c;则返回第一个参数的值。eg:--表示如果T1.ID为空&#xff0c;则返回空串&…

实例22:python

#题目&#xff1a;两个乒乓球队进行比赛&#xff0c;各出三人。甲队为a,b,c三人&#xff0c; #乙队为x,y,z三人。已抽签决定比赛名单。 #有人向队员打听比赛的名单。a说他不和x比&#xff0c;c说他不和x,z比&#xff0c;请编程序找出三队赛手的名单。 #!/usr/bin/python -- c…

CF468B Two Sets

原题链接 DOWNLOAD AS PDF 题目大意 给出\(n\)个各不相同的数字&#xff0c;将它们分别放入\(A\)和\(B\)两个集合中&#xff0c;使它们满足&#xff1a; 若数字\(x\)在集合\(A\)中&#xff0c;那么数字\(a-x\)也在集合\(A\)中&#xff1b;若数字\(x\)在集合\(B\)中&#xff0c;…

windows c语言 redis,windows上使用VS2012 C++语言调用Redis的解决方案

最近我在VS2012上进行Redis开发遇到一些困扰. 编译Redis的lib库没问题。但是使用这些lib库就不太顺利了. 在网上查来查去也没解决。不过其实Redis的客户端项目RedisCli.vcxproj,就是一个最好的使用例子. 我把几个需要注意的地方贴出来注意事项1. 链接器->输入->忽略所有默…

plantuml 方法图_PlantUML 语法之时序图

plantUML 下载(含《plantUML语法指南手册》)&#xff1a;http://plantuml.com/downloadVisual Studio Code 安装 plantUML 插件&#xff0c;在插件应用商店中搜索&#xff1a;PlantUML&#xff0c;点击安装即可。快捷键&#xff1a;Alt D 即可快速预览&#xff0c;Ctrl Shift…

运维实施面试题

记得不是很清楚了&#xff0c;大概回忆一下 1集线器&#xff0c;路由器。交换机的区别 术语解释   路由器&#xff1a;&#xff08;Router&#xff09;是连接因特网中各局域网、广域网的设备。在路由器中记录着路由表&#xff0c;它会根据信道的情况自动选择和设定路由&#…

CCF 201312-3 最大的矩形[比较简单]

问题描述 试题编号&#xff1a;201312-3试题名称&#xff1a;最大的矩形时间限制&#xff1a;1.0s内存限制&#xff1a;256.0MB问题描述&#xff1a; 问题描述在横轴上放了n个相邻的矩形&#xff0c;每个矩形的宽度是1&#xff0c;而第i&#xff08;1 ≤ i ≤ n&#xff09;个矩…

鸿蒙系统太烂,一加终于觉醒!变相承认系统太烂,魅族的吐槽一针见血

刘作虎宣布&#xff0c;一加9系列出厂预装ColorOS 11&#xff0c;终于证实了外界的猜想&#xff0c;一加终于也要放弃自己的系统&#xff0c;这已经证明了之前的氢系统已经在国内市场上彻底失败。想要收服用户&#xff0c;还是需要本土定制化的应用。不过这也显示出一加手机的决…

安卓开发toolbar设置logo_Android之ToolBar的使用

Toolbar是在 Android 5.0 开始推出的一个 Material Design 风格的导航控件 &#xff0c;Google 非常推荐大家使用 Toolbar 来作为Android客户端的导航栏&#xff0c;以此来取代之前的 Actionbar 。与 Actionbar 相比&#xff0c; Toolbar 明显要灵活的多。它不像 Actionbar 一样…

实例23:python

#题目&#xff1a;打印出如下图案&#xff08;菱形&#xff09;: * *** ***** #******* ***** *** * #先把图形分成两部分来看待&#xff0c;前四行一个规律&#xff0c;后三行一个规律&#xff0c;利用双重for循环&#xff0c;第一层控制行&#xff0c;第二层控制列。…