💖 作者简介:大家好,我是泽奀。🏆全栈领域新星创作者 作者周榜:81 总排名:6434 👑
📝 个人主页:weixin_52632755的博客_泽奀_CSDN博客
🎉 点赞➕评论➕收藏 == 养成习惯😊
📣 系列专栏:【51单片机】系列_泽奀的博客-CSDN博客
💬 总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🖊
✉️ 我们并非登上我们所选择的舞台,演出并非我们所选择的剧本。
💬本系列哔哩哔哩江科大51单片机的视频为主以及自己的总结梳理📚
目录
- 轻触按键:相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。
- 英文:independent press button
- 了解:独立按键具有四个"头",独立按键主要有四个部分:1、底座,2、金属弹片(这个金属弹片是鼓起来的,当你按下去的时候它会变平,松手的时候又会鼓起来的),3、就是按键的头,4、就是金属的盖子。那么在相同的两个引脚当中其实它就是内部连接起来的金属片,无论你按不按下去,它前后的两个引脚都是连接起来的。就是始终都是具有导通性质的,向外具有两个接触的点。按下的时候四个引脚全部都是连接的,松手的时候两边分别连接,之间是断开的。
- 如下图实物所示:

- 这里总共有四个独立按键,它们公共的一段都接到了GND电源的负极,另一端引出了四个编号是连接到单片机板子中的MCU上面,还有一段是接到了IO口上。如下图所示:
- 那我们就知道了单片机上电的时候所有的IO口默认都是高电平,那么就是当是如果按键没有按下的时候那么这个IO口保证的就是高电平,按下的话那么这个IO口就变成低电平了。寄存器会检测IO口的电平,然后在读回来这个寄存器当中。如果按键松开"我"因该去读取这个寄存器那么它其实就是一个高电平默认为1的一个高电平,反之。那么根据这个现象我们可以得知我们的独立按键是不是被按下了。
#include <REGX52.H>
int main(void)
{
while(1)
{
if(P3_1==0 || P3_0==0) //如果K1按键或K2按键按下
{
P2_0=0; //LED1输出0,点亮
}
else
{
P2_0=1; //LED1输出1,熄灭
}
}
}
注意:独立按键K1按键与K2按键按键网络编号是相反的,K1=P3_1、K2=P3_0。

算术运算符:加减没什么好说的,乘法和除法注意一下符号!以及除法是取整的不是四舍五入按照数学的运算来的,比方举个例子:五除以二,按照数学的方式是:2.5,在C语言当中是2取最小整数,当然这是int数据类型当中是这个样子。也有单精度浮点型(float)和双精度浮点型(double)它们依旧是等于2.5的。那么取余(%)是什么意思呢?其实很简单就是还是以五除以二的话在小学当中是2...1,那么这个其实就是5%2=1了。再比方说102/10 = 10...2 那么102%10 = 2,所以除号与取余就是这个意思了。赋值就是把右边得出的值或者说是结果赋值到你左边的这个变量。
判断运算符:这个没什么好说的,就是在表达式的值经常有判断表达式,如果你的表达式的值为真,那么就执行表达式里面大括号(作用域)里面的内容。在这里注意下等于的判断表达式的符号。
逻辑运算符:假设 a = 1,b = 0;
- && 称为逻辑与运算符。如果两个操作数都非零,则条件为真。(A && B) 为假。
- || 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真 (A || B) 为真。
- ! 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。!(A && B) 为真。
位运算:
- 按位与操作,按二进制位进行"与"运算。运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
按位或运算符,按二进制位进行"或"运算。运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;
异或运算符,按二进制位进行"异或"运算。运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;
取反运算符,按二进制位进行"取反"运算。运算规则:~0001 = 1110;
<< 二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)
>> 二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。
这些语句都是单片机以及变成语言比较重要的语句!像这个判断语句if以及switch语句,以及while和for的循环语句在单片机中都是很重要的。这些都是必须要掌握的知识点!大家可以多上手代码,熟练掌握这些判断语句和循环语句。任何复杂的程序都可以由顺序、选择、循环来进行程序代码的实现,上面的代码就是典型的if—else的语句。
#include <REGX52.H>
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
int main(void)
{
while(1)
{
if(P3_1==0) //如果K1按键按下
{
Delay(20); //延时消抖
while(P3_1==0); //松手检测
Delay(20); //延时消抖
P2_0=~P2_0; //LED1取反
}
}
}
- 对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。
在按键闭合的时候会产生一些抖动,没有按键按下的话它就是一个高电平(1)(单片机上电的时候所有的IO口默认都是高电平)。在我们按下按键的时候它就会变成(0),并且由于它的是机械触电会弹开,然后上下抖动几下,然后才会稳定的变成(0)。抖动的时间上面图中也表示的是(5~10)ms。当抖动消失的时候进入了一个稳定的低电平(0),这个持续时间是看你手什么时候松开这个按键。在松手的时候也会产生抖动,它也不会突然变成高电平(1),也会抖动产生时间为(5~10)ms。最后,松手。
按键的消抖有两种方法:
- 加个线,把这个线通过这些电路里面进行一些触发器等等,通过一些电路来进行操作,把这个抖动进行一些过冲,然后再给我们单片机进行点上。比较麻烦!
- 通过软件来进行一个延迟函数,把这个消抖进行操作!
#include <REGX52.H>
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
int main(void)
{
unsigned char LEDNum = 0;
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++;
P2=~LEDNum;
}
}
}
- 这里用 unsigned char 类型是因为:无符号字符型(所占1字节 = 8bit位)刚好对应着8位二进制的数据,那这八位二进制的正好这个P2口和这个寄存器51单片机保持一致。
- 注意:P2口上电之后和单片机的IO上电一样都是默认的是高电平! 1111 1111
- LEDNum取反给P2的话,其实变量取反给P2的值上它是并不会改变这个变量的值。它的值还是没有取反的值。在等号右边的话,它并不会改变LEDNum的值。其实就是取反当中你取反的值是右值就不会被改变。
#include <REGX52.H>
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
int main(void)
{
unsigned char LEDNum = 0;//进行初始化
P2 = 0xFE;
while(1)
{
if(P3_1 == 0) //如果当独立按键K1按下的话 —— LED灯移位
{
Delay(20); //按键消抖
while(P3_1 == 0); //检测松手
Delay(20); //按键消抖
LEDNum++; //自增++
if(LEDNum>=8)
{
LEDNum=0;
}
P2 = ~(0x01<<LEDNum);
}
if(P3_0 == 0) //第二种情况:如果当独立按键K2按下的话 —— LED灯移位
{
Delay(20); //按键消抖
while(P3_0 == 0); //检测松手
Delay(20); //按键消抖
if(LEDNum == 0)
{
LEDNum=7;
}
else
{
LEDNum--;//自减--
}
P2 = ~(0x01<<LEDNum);
}
}
}
- P2口当中的P一定是要大写的,标识符一定要严格区分大小写!
- 当你在定义一个局部变量的时候一定要注意赋值初始值,在全局变量定义的话默认为0!
- 这里的K1和K2是接错了,K1 = P3_1;K2 = P3_0;K3 = P3_2;K4 = P3_3;
当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少
我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
我有一个名为posts的模型,它有很多附件。附件模型使用回形针。我制作了一个用于创建附件的独立模型,效果很好,这是此处说明的View(https://github.com/thoughtbot/paperclip):@attachment,:html=>{:multipart=>true}do|form|%>posts中的嵌套表单如下所示:prohibitedthispostfrombeingsaved:@attachment,:html=>{:multipart=>true}do|at_form|%>附件记录已创建,但它是空的。文件未上传。同时,帖子已成功创建...有什么想法吗?
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
在我的Character模型中,我添加了:字符.rbbefore_savedoself.profile_picture_url=asset_path('icon.png')end但是,对于数据库中已存在的所有角色,它们的profile_picture_url为nil。因此,我想进入控制台并遍历所有这些并进行设置。在我试过的控制台中:Character.find_eachdo|c|c.profile_picture_url=asset_path('icon.png')end但这给出了错误:NoMethodError:undefinedmethod`asset_path'formain:O
当我进入Rails控制台时,我已将pry设置为加载代替irb。我找不到该页面或不记得如何将其恢复为默认行为,因为它似乎干扰了我的Rubymine调试器。有什么建议吗? 最佳答案 我刚发现问题,pry-railsgem。忘记了它的目的是让“railsconsole”打开pry。 关于ruby-on-rails-带有Pry的Rails控制台,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/question
我正在尝试将$stdout设置为临时写入一个文件,然后返回到一个文件。test.rb:old_stdout=$stdout$stdout.reopen("mytestfile.out",'w+')puts"thisgoesinmytestfile"$stdout=old_stdoutputs"thisshouldbeontheconsole"$stdout.reopen("mytestfile1.out",'w+')puts"thisgoesinmytestfile1:"$stdout=old_stdoutputs"thisshouldbebackontheconsole"这是输出。r
我在思考流量控制的最佳实践。我应该走哪条路?1)不要检查任何东西并让程序失败(更清晰的代码,自然的错误消息):defself.fetch(feed_id)feed=Feed.find(feed_id)feed.fetchend2)通过返回nil静默失败(但是,“CleanCode”说,你永远不应该返回null):defself.fetch(feed_id)returnunlessfeed_idfeed=Feed.find(feed_id)returnunlessfeedfeed.fetchend3)抛出异常(因为不按id查找feed是异常的):defself.fetch(feed_id
我真的只是不确定这意味着什么或我应该做什么才能让网页在我的本地主机上运行。现在它只是显示一个错误,上面写着“我们很抱歉,但出了点问题。”当我运行railsserver并在chrome中打开localhost:3000时。这是控制台输出:StartedGET"/users/sign_in"for127.0.0.1at2013-07-0512:07:07-0400ProcessingbyDevise::SessionsController#newasHTMLCompleted500InternalServerErrorin55msNoMethodError(undefinedmethod`