17组+图文教程+Arduino中内置的ShiftIn函数与74HC165芯片的配合使用

17组+图文教程+Arduino中内置的ShiftIn函数与74HC165芯片的配合使用,第1张

一、ShiftIn()函数

      将一个数据的一个字节一位一位的移入。从最高有效位(最左边)或最低有效位(最右边)开始。对于每个位,先拉高时钟电平,再从数据传输线中读取一位,再将时钟线拉低。

        注意:这是一个软件实现;Arduino提供了一个硬件实现的SPI库,它速度更快但只在特定脚有效。

  shiftIn(dataPin,clockPin,bitOrder)

  dataPin:输出每一位数据的引脚(int)

  clockPin:时钟脚,当dataPin有值时此引脚电平变化(int)

  bitOrder:输出位的顺序,最高位优先或最低位优先

二、74HC165概述

      74HC165是一款高速CMOS器件,74HC165遵循JEDEC标准no7A。74HC165引脚兼容低功耗肖特基TTL(LSTTL)系列。
      74HC165是8位并行读取或串行输入移位寄存器,可在末级得到互斥的串行输出(Q7和Q7),当并行读取(PL)输入为低时,从D0到D7口输入的并行数据将被异步地读取进寄存器内。而当PL为高时,数据将从DS输入端串行进入寄存器,在每个时钟脉冲的上升沿向右移动一位(Q0→Q1→Q2,等等)。利用这种特性,只要把Q7输出绑定到下一级的DS输入,即可实现并转串扩展。
      74HC165的时钟输入是一个“门控或”结构,允许其中一个输入端作为低有效时钟使能(CE)输入。CP和CE的引脚分配是独立的并且在必要时,为了布线的方便可以互换。只有在CP为高时,才允许CE由低转高。在PL上升沿来临之前,不论是CP还是CE,都应当置高,以防止数据在PL的活动状态发生位移。
      SH/LD为低,并口数据存入8个位寄存器中。8个位寄存器分别为Q0、Q1、Q2、Q3、Q4、Q5、Q6、Q7。此时Q7里已经有值,可以直接读取了所以,逻辑可以是这样:

      读取Q7的数据,然后IN_CLK_LOW;IN_CLK_HIGH;制造一次上升沿,执行移位 *** 作,使Q6的值移位到Q7中。SH/LD为高,允许移位。一个时钟脉冲,QH向外输出一位数据,同时,从SER采集一位数据补充8位寄存器。

        如上级联情况,右边74HC165的SER悬空,采集数据为0。

        左边74HC165,一个脉冲,QH输出一位数据,同时,从SER采集一位数据补充低位。相当于如下:
开始前:

H1-G1-F1-E1-D1-C1-B1-A1H2-G2-F2-E2-D2-C2-B2-A2

开始传输:

1、1G-1F-1E-1D-1C-1B-1A-2H2G-2F-2E-2D-2C-2B-2A-0

2、1F-1E-1D-1C-1B-1A-2H-2G2F-2E-2D-2C-2B-2A-0-0

3、1E-1D-1C-1B-1A-2H-2G-2F2E-2D-2C-2B-2A-0-0-0

        ……

14、B2-A2-0-0-0-0-0-00-0-0-0-0-0-0-0

15、A2-0-0-0-0-0-0-00-0-0-0-0-0-0-0

16、0-0-0-0-0-0-0-00-0-0-0-0-0-0-0

这样,就把2个级联的74HC165的并口数据,全部以串口形式传输给了MCU。

三、实验

//定义你的PIN在哪儿

intlatchPin=8;

intdataPin=9;

intclockPin=7;

// 定义变量来保存数据 //移位寄存器//从一个非零数字开始可以帮助//故障排除byteswitchVar1=72;//01001000

void setup(){

//启动串行Serialbegin(9600);

//定义引脚模式pinMode(latchPin,OUTPUT);pinMode(clockPin,OUTPUT);pinMode(dataPin,INPUT);

}

void loop(){

//将其设置为1以收集并行数据digitalWrite(latchPin,1);

//将其设置为1以收集并行数据,等待

  delayMicroseconds(20);//设置为0以串行传输数据 digitalWrite(latchPin,0);

//移位寄存器为串行模式

  //将每个移位寄存器收集到一个字节

  //附在芯片上的寄存器最先出现。

switchVar1=shiftIn(dataPin,clockPin);

//打印结果

//(7, 6, 5等)将被丢弃 //具有高输入的第一个引脚

Serialprintln(switchVar1,BIN);

Serialprintln("-------------------");//因此,所有这些引脚都可以跟上 delay(500);

}

byteshiftIn(intmyDataPin,intmyClockPin){

inti;

inttemp=0;

intpinState;

bytemyDataIn=0;

pinMode(myClockPin,OUTPUT);pinMode(myDataPin,INPUT);  for(i=7;i>=0;i--)

{

digitalWrite(myClockPin,0);

delayMicroseconds(02);

temp=

digitalRead(myDataPin);

if(temp){

pinState=1;

//把比特设置为0

myDataIn=myDataIn|(1<<i);

}

else{

//关掉--只需要调试

pinState=0;

}

//调试打印语句

//串行打印(PopStand);

//串行打印(“”);

digitalWrite(myClockPin,1);

}

//调试打印语句空格

  returnmyDataIn;

}

学习Arduino和学习单片机的方法几乎相同。但是学习Arduino更像是学习自动挡汽车驾驶,传统单片机更像是手动挡汽车。自动档汽车的学习主要是上路实践的注意事项,手动挡汽车的学习更重要的是挂挡摘档避免熄火等基础 *** 作,熟练后考虑上路实践注意事项。但是自动档汽车学习你最好要明白手动挂摘档是怎么一回事,对自动挡汽车才能更好理解,只是不必花费主要时间精力去熟练这些基础 *** 作。
可见Arduino像自动挡一样越过了很多底层 *** 作,比如寄存器映射,库函数创建封装,电源拓扑结构的选择等。工作时阅读芯片数据表的寄存器定义章节可以仅简单看一下而已。精通使用Arduino实际上要求你有过系统的电子学专业学习经历,通览电子信息工程各门课程,并且有过C语言学习经历,当然不必要达到很高的分数,好比自动挡汽车学挂挡和离合一样。学习Arduino更加强调实际应用,也就是学校里的高年级学科,比如信号处理,通信工程,EDA中的PCB设计等。淡化低年级基础课程比如模电数电等,这倒不是说基础学科没用,模电数电对于芯片设计和制造等集成电路产业很重要,对于应用芯片来进行终端产品开发的意义就不大了。
以往学习单片机,最终目的是什么不用考虑,先学会单片机的硬件方案设计,软件驱动设计就要学很久,学完也不知道要做什么,可能这款单片机就快淘汰了。然后又学新的芯片,M3完了M0,M0完了F4,会的越来越多,经历却很单调。
学习Arduino不是这样,Arduino直接给你提供了几十种硬件平台和软件驱动,主流内核和方案都有,语言学起来很简单。你独立开发时要考虑最严峻的问题是:
1。现在软硬件环境都现成了,我要用它来做什么???
2。我做出的产品如何运营?靠什么盈利,定价多少,以何种方式出售?
如果你是工程师,在一家公司,团队开发项目,你面临的最严峻的问题是
1。数十种Arduino我要选取哪一种,是否能实现项目的要求功能,是否可以熟练的找到开放资料,比如工程文件?硬件工程师是否可以根据开放资料按需要进行PCB修改?软件工程师是否可以写出数据采集或信号处理或组网方面的程序?
2。如何说服领导采用这种自动挡的方法去开发?同时老板又不会因此而降低我们待遇?
3。如何改变现在出力不出功的公司文化。轻轻松松搞开发而不是像苦力一样却碌碌无为。
客户只在意最终实现的效果,却不在乎你盒子里用的是哪种系统,客户只在意结果。但现实是,很多公司只为员工的过程买单,客户却只为公司的结果买单。多数时候员工让领导看到的过程都是徒劳却充满表现色彩的。

前几天发了一篇关于 使用STM32F103C8T6开发板来做一架空心杯小四轴穿越机 的文章。

在很早之前写过 简易蓝牙迷你四轴无人机制作教程资料参考 。

其实当时的用Arduino制作MWC小四轴算是失败的。因为很多软件上的一些配置与硬件上的整体配合,并不是我当时看的一些教程说的那样简单。当然,也因为当时的我想的太简单了,所以失败了。

就在我成功使用STM32F103C8T6成功完成了一架小四轴之后,我再次尝试用Arduino制作MWC小四轴。

参考

空心杯驱动部分可以参考 使用STM32F103C8T6开发板来做一架空心杯小四轴穿越机

我把我修改过配置的程序上传了

程序烧录这块主要是要注意的配置有

修改完配置后,一定需要先卸桨,然后打开 MultiWiiConf 进行调试与配置,摆动飞行器观察方向是否一致,连接遥控器,查看通道映射是否正确。

电池的话需要选择航模专用的电池,我之前的话不懂,一直用普通mp4拆下来的电池,结果根本都带不动,电机一转,Arduino就断电重启了。电池不是容量越大越好,这需要跟机子整体重量进行配合。容量大,电池重,可能飞行时的幅度变动太大,机子会晃动,会造成失控的可能。

5V 升压不一定需要,这根据电机的情况进行配合。我这使用的是8520电机,之前制作的时候使用的720电机。一开始没加5V 升压模块,在使用8520电机时发现,只要一加大油门,Arduino就断电重启了。使用Arduino我是接5v供电,电机是直接电池取电的。

加电容一部分也是一个心理安慰吧,个人感觉上是需要加的。实际上可以不需要。

在选购电机的时候,需要注意一下电机的驱动电压。我所使用的8520电机有两个驱动电压版本,一个是37V的,一个是74V的。文章中使用的是37V的版本。

桨叶一定要注意尺寸。一个是轴距,一个是孔距。轴距太大,可能桨叶会碰撞,太小可能动力不足。孔距太小,插不进电机上,太大又没法固定。

1、由于scratch软件和arduino连接需要使用s4A软件,在浏览器中搜索S4A,然后找到官网,下载软件。点击我接受,下一步。

2、在浏览中选择需要安装的盘的位置,然后选中要安装在哪个文件夹中,点击安装,直到开始安装程序。

3、安装完成之后打开软件,如下图所示,有scratch软件所有的模块信息,右侧又增加了arduino单片机的显示信息。为了要连接arduino需要先关闭软件。

4、打开arduino单片机程序编写界面,点击打开选项,找到arduino连接scratch的固件程序,连接arduino单片机,配置端口,下载程序到单片机。

5、下载成功后再打开s4A软件,显示你当前连接的单片机的端口状态,以及数据信息。说明单片机和scratch连接成功。

6、试着连接电路,写个简单的小程序来运行试试。首先在界面,拖动需要的各个模块,按照积木形式排成程序。如图所示。然后将连接好的电路,单片机连接电脑,连接scratch软件。

7、点击软件右侧小绿旗开始运行程序。可以看到通过scratch图形化界面编写的小程序,控制单片机上的端口,执行让灯亮灭的 *** 作,至此实验完成。

下,LED熄灭)
一、成果展示
在这里插入描述
二、实现方法与解析
首先,让我们按图连接电路:在这里插入描述
代码如下
OK,that’s over
打开CSDN,阅读体验更佳
Arduino 用两个按键分别控制两个LED灯点亮_ling3ye的博客_用
按一下,亮,再按一下灭,走起 先说明一下4脚按键开关的工作原理 示例效果 BOM表 Arduino Uno 1 LED 2(各什么颜色你喜欢就好) 4脚按键开关 2 面包板 1 跳线若干 接线图 程序源码 本程序能分别通过按键控制LED灯的亮
继续访问
热门推荐 学习总结——按下按键灯亮,再次按下按键,灯灭
按键控制灯的亮灭1 主要实现按键控制灯的亮灭,按键按下,灯亮,再次按下,灯灭,主要对实现的逻辑进行控制,逻辑清晰,很简单,实现的方法有两种,方法1:将按键按下的值赋值给一个变量,变量除以2的值的是基数或者偶数来确定灯亮还是灯灭,程序中设置的是变量的值除以2为0时,灯亮;变量的值除以2为1时,灯灭;程序如下:int keypin=0; int ledpin=4; int val; int i;void
继续访问
arduino按钮控制led,按一次亮,再按灭
//按一下亮,再按不亮 int ledpin=11;//灯接口 int anniupin=7;//按钮接口 boolean change=false; void setup() { Serialbegin(9600);//可以不用加 pinMode(ledpin,OUTPUT);//灯输出端口 pinMode(anniupin,INPUT);//按钮输入端口 } void loop() { while(digitalRead(anniupin)==HIGH)// { delay
继续访问
Button2:Arduino库,简化了按钮的使用。 它允许您使用回调函数来跟踪单,双,三和长点击。 它还可以消除抖动
Button2:Arduino库,简化了按钮的使用。 它允许您使用回调函数来跟踪单,双,三和长点击。 它还可以消除抖动
Arduino实现按一下开灯,按一下关灯
arduino按键控制LED 灯(按一下切换一次状态)
物联网实验一 2021324 arduino按键控制LED 灯(按一下切换一次状态) #define led 13 //定义led灯为13引脚 #define button 3 //定义button键盘为3引脚 bool b1=false; int i; void keyScan() { if(digitalRead(button)==HIGH) { delay(5); if(digitalRead(button)==HIGH) { b1=!b1; while(digitalRead(butt
继续访问
Arduino 按一下按键灯全亮,再按一下灯全不亮 + Arduino模拟电路图
Arduino 按一下按键灯全亮,再按一下灯全不亮 + Arduino电路图 在 《Arduino 按一下按键灯全亮,再按一下灯全不亮》中 作者只提供了相应的代码 为了方便初学者更深刻的了解代码的运行原理 这里附上相应的Arduino模拟电路图。 这里为初学者提供相应的Arduino模拟电路图 附原文连接:>实际上是串口读入字符串,再转换为int型数据。
[C++] 纯文本查看 复制代码代码001002003004005006007008009while(Serialavailable() > 0) { intinChar = Serialread(); if(isDigit(inChar)) {inString += (char)inChar;}i=inStringtoInt();}}


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

原文地址: https://www.outofmemory.cn/dianzi/13284803.html

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

发表评论

登录后才能评论

评论列表(0条)

保存