本篇我们先介绍最基础的几个IO口操作。学完本篇,大家要能自己独立完成下面几个实验。

1、点亮LED

2、一个按键控制LED,按下灯亮,释放灯灭

3、两个按键控制一个LED,一个键开灯,一个键关灯

实验一

点亮LED的例子前面入门篇已经讲过了,程序写起来很简单,Keil编写程序并编译生成HEX文件,烧写进单片机的过程,也做了完整详细的介绍。

点亮LED利用了IO口输出操作。简单复习一下,最核心的两句代码是:

sbit LED = P1^0;

LED = 0;

第一句定义LED为sbit型变量,对应了P1.0口的高低电平,具体应该写哪个IO口,和实际电路有关。第二句设置LED对应的P1.0管脚输出低电平,从而点亮LED。

实验二:按键开关

讲第二个实验前,先简单介绍下常用的按键开关。下图就是最常见的按键开关,有四个引脚,图中的1、2连在一起,3、4连接在一起。按下按键时,四个引脚就全部导通了。

实验二:搭建电路

根据前面讲的IO口原理,我把按键开关一端接在P2.0端口了,另一端接到GND。因为P2.0有内部上拉电阻,我就不用自己外接了。最小系统和LED还是之前的电路不变,如下图所示。

实验二:程序实现

程序首先定义了LED和KEY,分别表示发光二极管和按键开关。如果你用的是成品开发板,或者电路和我的不一样,就定义你的电路中对应的管脚。开发板可以从电路图查看独立按键所在的管脚。

主函数刚开始时,设置KEY输出高电平,因为后面要读取KEY所在端口的电平。在程序的主循环中,读取KEY的值,这里我们直接把KEY当做一个一位变量去判断就可以了,它有值0和1。如果KEY为1,即KEY==1,说明按键没有按下,设置LED=1即熄灭。注意这里使用两个等号表示比较而不能用一个等号,那样就成赋值了。在else中,设置LED=0即点亮。于是就能实现我们需要的效果了。

#include <reg52.h>

sbit LED = P1^0;

sbit KEY = P2^0;

void main()

{

KEY = 1;

while(1) {

if(KEY == 1) {

LED = 1;

} else {

LED = 0;

}

}

}

这是我按下按键,灯亮时的情形。

实验二:程序分析

注意这里我们读取按键和开关LED的代码应该放在主循环里面,也就是不断的读取按键状态并开关灯。如果放在主循环前面,主函数写成下面这样,是不能工作的。因为单片机执行速度很快,放在循环前面只会读取按键执行一次,执行完了进入while(1)主循环,单片机就不会再读取按键的状态,这时无论如何按键,它都不会帮你开关LED了。

void main()

{

KEY = 1;

if(KEY == 1) {

LED = 1;

} else {

LED = 0;

}

}

程序简化

还要说的是,这个程序还能进一步简化。因为KEY是一个变量,在C语言中变量有真假值,非零为真,零为假。所以主循环中可以这样写(其他部分相同):

if(KEY) {

LED = 1;

} else {

LED = 0;

}

但是还可以继续简化。因为LED和KEY都是变量,可以考虑直接用KEY给LED赋值,写成下面这样就行了。

LED = KEY;

取反操作的应用

如果要实现按下按键灯灭,释放按键灯亮这样恰好相反的效果,做个很小的修改就可以了,如下所示。感叹号是逻辑取反的意思,如果是0就会变成1,如果是非0就变成0。

LED = !KEY;

实验三

实验三我只提供主要代码片段,具体的分析理解,实际电路搭建和实验,交给大家自己完成。

sbit KEY_ON = P2^0;

sbit KEY_OFF = P2^1;

while(1) {

if(KEY_ON == 0)

LED = 0;

if(KEY_OFF == 0)

LED = 1;

}

再次强调,如果想学好单片机,大家一定要自己独立做完这三个实验,切身体验单片机的工作过程,提高动手能力。如果做实验的过程中感觉很神奇,感受到动手的乐趣,就更容易学好单片机。如果你觉得这只是不想做的任务,或许你对单片机并没有什么兴趣,那样的话想学好单片机就有些困难了。因为学习从来都应该是主动的事情。

下一篇会继续讲IO口相关的实验。

=======================================================

《单片机小白学步》系列教程(原名《单片机入门指南》)介绍

本系列教程从最基本的入门知识开始,逐步深入介绍单片机系统设计,内容包括:
1、入门篇:单片机等基本概念、各种电子设计基本知识
2、思想篇:单片机/计算机系统设计的工程思想
3、学习篇:单片机学习过程、方法和技巧,以51单片机为例介绍,并推广到其他单片机
4、应用篇:遵循规范的工程方法,设计单片机系统实例(计划设计的系统有:计算器、电子表、密码锁、简易手机,具体看有没有时间再确定)
5、原理篇:从模拟电路、数字电路开始,逐步深入介绍单片机/计算机系统原理,并自行设计简易的CPU(由于个人水平有限,这部分没有把握写好,具体内容视情况而定)

教程特点

1、技术知识点全面,从入门到精通

包含了各种基本知识,尤其是对单片机基本概念的介绍、为什么要用单片机等,在很多同类书籍教程中都被忽略了。同时也包含了一些深入的知识,包括原理篇考虑对单片机的基本原理进行介绍,有助于深入理解单片机。

本系列教程以51单片机为例进行介绍。通过51介绍完单片机的基本知识,我会再把430进行简要介绍,尤其是对比两者之间的优缺点,让大家很快感受到430的巨大优势,而学习51正好为快速了解430打下了坚实的基础。

2、除了单片机知识,还有思想、方法、技巧的介绍

本系列教程中,介绍单片机各种模块编程知识的主要是学习篇,而学习篇只是整个教程的一部分。在学习篇中我会贯穿各种方法技巧,如何理解一些模块功能,怎么看时序图,严格遵守工程思想进行编程,程序发生了错误怎么调试等等。而在思想篇中会总体介绍很多重要的思想,为后面的学习做好准备工作。

3、知识先后顺序的设计

单片机学习过程中,涉及大量的知识,而且很多知识之间相互依赖,关联很强。

本系列教程对知识的先后顺序进行比较明确的规划,尽最大可能符合人的认知过程。但是实际规划时发现,无论怎么调整知识的顺序,总有一些知识之间相互依赖,关系复杂。例如开始讲IO口的时候肯定会提到寄存器,而寄存器这个词的理解,需要深厚的背景知识。但是这些背景知识在没有进行实践的时候也很难理解。

初学者常常就会在这样的地方感觉疑惑不解,不知所措。而每次遇到类似这样的知识,我会向初学者指出,应该如何对待。这个知识是应该自己去学习补充,还是等到学完原理篇再做理解,而现在又应该怎么去看待这个名词。

另外,在整个教程的学习前,需要掌握一定的C语言等基础知识,具体可参考教程第〇篇《序》中的相关说明
http://www.hainter.com/mcu-primer-0

4、语言通俗易懂

本系列教程力求语言通俗易懂,而不会用一堆新手不懂的词语去解释另一个不懂的词语。但是受限于个人语言表达能力,可能有些地方表述的比较繁琐,或者不清楚,希望大家能够帮忙指出。

《单片机小白学步》交流群

欢迎单片机爱好者加入《单片机小白学步》交流群。此群目标:

1、较高质量的单片机等技术的学习交流群
2、为《单片机小白学步》读者及时提供更新通知
3、结交爱好思考学习,对技术感兴趣,志同道合的朋友

加群原则是宁可少加人,也要保证质量(不懂技术没关系,关键是有一颗不怕困难、热爱学习的心)。有空的时候我会重点在里面回答一些技术问题。也鼓励大家相互讨论和促进~群里主要话题为单片机相关,但是也可以讨论各种想法等内容,爱学习爱思考的也可以加。群号:124083011,请正确回答问题后进入,也希望帮忙推荐周围合适的人加群。

其他问题

如果觉得我写的对你有帮助,欢迎多多反馈,包括写的不正确、不合理、不太明白都可以指出来,这样方便我对其进行完善。

更多可参见:《如何以学习单片机为契机,逐步成为优秀的工程师》
http://www.hainter.com/mcu-engineer

本系列教程首发于我的个人主页,欢迎访问(由于是国外服务器,速度稍微有点慢):
http://www.hainter.com/category/hacker/mcu-primer

同时会将其转发到CSDN、电子发烧友等站点,欢迎关注。
CSDN专栏网址 http://blog.csdn.net/column/details/mcu-introduction.html
电子发烧友论坛 http://bbs.elecfans.com/zhuti_mcu_1.html

本文首发自我的个人主页,转载请注明来源:http://www.hainter.com/mcu-primer-21

单片机小白学步系列(二十一) IO口:基本的LED和按键操作相关推荐

  1. 单片机小白学步系列(二十三) IO口原理知识补充:双向IO口、互补推挽、高阻态

    由于之前考虑不周,本篇在IO口原理知识的基础上,进一步补充一些知识. ================================================= 双向IO口的输出:互补推挽 在 ...

  2. 单片机小白学步系列(二十) IO口原理

    IO口操作是单片机实践中最基本最重要的一个知识,本篇花了比较长的篇幅介绍IO口的原理.也是查阅了不少资料,确保内容正确无误,花了很长时间写的.IO口原理原本需要涉及很多深入的知识,而这里尽最大可能做了 ...

  3. 单片机小白学步系列(十二) Proteus仿真软件简介

    Proteus软件是英国Labcenter electronics公司出版的EDA工具软件.常用于单片机等数字电路仿真,分为ISIS和ARES两个程序,前者用于仿真,后者用于设计PCB.我们常使用IS ...

  4. 单片机小白学步系列(二)爱上单片机的一万个理由

    到现在为止,相信大家对单片机已经有了一个基本概念,但是我们为什么要学习单片机呢?我们需要找到爱上单片机的一万个理由. 单片机在生活中应用非常广泛.各种家电,如洗衣机,电冰箱,电饭煲,电子称,等等,往往 ...

  5. 单片机小白学步系列(十三) 点亮第一个LED——好的開始,成功的一半

    前面介绍了非常多概念知识.做了非常多准备工作,从这一节開始,我们正式開始单片机的学习.我们将使用单片机完毕一项非常easy的工作:点亮一个发光二极管(即LED:Light-Emitting Diode ...

  6. 单片机小白学步系列(十七) 单片机/计算机系统概述:核心模块

    前面已经介绍了模块化设计的特点和巨大优势.在我们的实验板中,单片机是其中最核心的一个模块:而对于单片机来说,又是由更多的子模块组合而成.本文主要对单片机/计算机系统中最核心的几个模块进行简要介绍. 为 ...

  7. 单片机小白学步系列(十五) 单片机程序下载失败总结

    前面介绍了点亮第一个LED的全过程,很多人可能很幸运的点亮了LED,然而也很可能不少人非常不幸没有把程序下载进去.初学者常会遇到程序无法下载的情况,很多人在尝试多次未果后比较受打击,因此放弃了学习,实 ...

  8. 单片机小白学步系列(九) 用万用焊板搭建实验电路

    这一篇我们继续上篇的话题,讲解自己搭建电路的另一种方法:用万用焊板搭建电路.在此之前,先普及几点基础知识. 1.电路板 首先我们了解下电路板.前面介绍了面包板可以搭建电路,但是在实际制作出来的电子设备 ...

  9. 单片机小白学步系列(七) 准备实验板——萝卜青菜,各有所爱

    单片机的学习,最重要的一点就是多实践.站在岸上学不会游泳.没有实践,恐怕永远也学不好单片机.我将和大家一起,选择一款适合自己的单片机实验板. 我们主要有三个可选方案: 1.自己动手搭建学习板: 2.购 ...

最新文章

  1. 知乎热议:985计算机视觉研究生找不到工作?
  2. java dolayout,Component
  3. 同软件多个线程设置不同ip_5-13网络编程(附带多线程死锁,线程通信)
  4. 支持向量机原理(一)线性支持向量机
  5. 短视频风口创业不容易,您信吗?
  6. dede织梦背景经常使用标签
  7. Shell编程关于Sha-Bang(#!)
  8. 关于ORA-04021解决办法(timeout occurred while waiting to lock object)
  9. C++使用流进行输入输出
  10. String(min)
  11. 本科,程序员,北京工作两年多,税后12k,出路在哪里?
  12. python下pymysql的问题
  13. 在宿舍如何使用IPv6免费上网(非第三方软件)
  14. springboot 集成 RabbitMQ confirm 确认模式和 return 回退模式以及Consumer Ack模式
  15. 安装Power BI Desktop在线报错关于windows10家庭版更新中遇到的 “你的设备中缺少重要的安全和质量修复”问题
  16. 【知识产权之专利权】不定项选择题和判断题题库
  17. 使用python在雅虎财经提取数据的创捷有效边界
  18. 商汤科技研究院招聘见习算法研究员
  19. Python编程实现计算存款利息
  20. p1171: 蜗牛爬井

热门文章

  1. 通过Java Api与HBase交互(转)
  2. [翻译]Windows Vista的秘密#11: 删除不可删除的东西
  3. left join on用法_MySQL 多表查询 quot;Joinquot;+“case when”语句总结
  4. 结合html和css制作页面的布局结构,CSS Div网页布局中的结构与表现
  5. ajax each html 太多,HTML5学习小记二ajax,window.orientation,prototype.forEach
  6. 京东java社招面试6_2020最新京东java面试题分享,京东社招
  7. 深度学习之基于DCGAN实现手写数字生成
  8. PAT_B_1034_Java(20分)
  9. PAT_B_1027_Java(20分)
  10. 信息竞赛进阶指南--归并排序求逆序对