龙空技术网

零成本学习之单片机开发之(2)GPIO输入输出

跟我学单片机 382

前言:

而今姐妹们对“php开发1200”大概比较关怀,姐妹们都想要学习一些“php开发1200”的相关知识。那么小编在网上汇集了一些对于“php开发1200””的相关文章,希望各位老铁们能喜欢,姐妹们一起来学习一下吧!

从今天开始给大家逐步讲解单片机编程,有兴趣的小伙伴们,可以关注本课程,完全免费

本人从事从2004年大学毕业开始从事开发工作,先后做过单片机开发、ucOSII开发、手机开发、android APP开发、PHP开发、微信小程序开发,目前从事物联网开发。我本人并非学计算机的,除了学校上课之外,基本上这些开发都是自学的。边学习边工作,基本上以学以致用为目的,用到什么学习什么。

深深体会到自学的艰辛,尤其是最初入门的时候,那道砍迈过去后面再学习基本上就简单多了,所谓触类旁通,举一反三。但是前面打基础的时候是非常费力的,看到很多评论说C语言指针太难了,后来就放弃了。其实那是没有找到好的学习方法,没有人指导。只要有人带一带指点一下,问题很快就能解决。

相比于国外的开源学习氛围,我认为我们做的还远远不够,我们的编程大师还非常少,像ucLinux、ucOSII、FreeRtos等等非常有名的嵌入式操作系统,商业的更不用说了,太多了。我们在软件方面一直都是落后的状态,当然近几年我们自己也有不少好的作品。比如,Huawei LiteOS、Alios Things、djyos、RT-Thread、SylixOS等。一直想为学习单片机的同学做点什么,今年相对来说会轻松一些,利用闲暇时间,给大家分享一些案例、学习方法和心得。本课系列课程主要针对初学者、单片机学习爱好者、学习中遇到困难者,有什么不清楚的地方可以留言讨论。

首先、进行原理图设计

以上一节课的原理图为基础,添加两个电阻,一个LED和一个开关。

1.放置LED和限流电阻,作为GPIO输出指示

2.放置按键开关和上拉电阻,作为GPIO输入,原理图如下所示

注意:从原件库放置原件的方法为,在原理图的空白处,单击鼠标右键->放置原件->弹出工程中出现过的原件列表,如下图所示:

如果,需要新的元件,则点击from libraries,进入元件库,选择所需要的元件。

放置黄色LED,选择Optoelectronics->LEDs->LED-Yellow,选择黄色LED,点击确定。

放置黄色LED

放置按键开关,打开元件库,选择Switches&Relays->switches->SW-SPST,选择单刀单掷开关,点击确定。

同样的方法,放置电阻。原理图就设计完成了

第二、进行程序设计

直接上代码,程序比较简单,注释在代码里面有注释,不清楚的可以仔细思考,然后运行调试一下,应该就可以搞明白了。如果有疑问,也可以给我留言。

#include <reg51.h>

#include <INTRINS.H>

#include <STDIO.H>

#define UP 1

#define DOWN 0

typedef unsigned char uint8_t;

typedef unsigned int uint16_t;

sbit LED1 = P0^0;

sbit KEY = P0^7;

void main(void)

{

uint8_t keystatus=UP,keyevent=UP;

// Initialize serial interface

SCON = 0xDA; // SCON: mode 1, 8-bit UART, enable rcvr */

TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit reload */

TH1 = 0xFD; // TH1: reload value for 1200 baud @ 12MHz */

TR1 = 1; // TR1: timer 1 run */

TI = 1; // TI: set TI to send first char of UART */

while(1)//主循环

{

//只有在按键状态有效变化的的时候

//才从串口中输出一次按键状态信息

if(keystatus!=keyevent)

{

keystatus=keyevent;

if(keystatus==UP)

printf("Key Released\n");

else

printf("Key Pressd\n");

}

//只有在按键状态是不按下时才进行

//按键检测,减少按键是的延时

if((!KEY)&&(keystatus==UP))

{

uint8_t i=0;

while(++i); //按键检测延时

if(!KEY)

keyevent=DOWN;

}else if(KEY)

{

keyevent=UP;

}

//LED 输出按键状态

LED1= keystatus;

}

}

最后、总结回顾

1.这次GPIO采用的是51单片机默认的准双向配置模式,这种模式的特点是可以直接作为输入来说,用作输出时,高电平驱动能力很弱,低电平吸收电流能力一般可以达到20mA,完全可以驱动LED,因此原理图设计中也是采用低电平驱动的方式,就是为了简化程序设计。

2.按键检测,需要主要的是机械按键按下接触的时候是有杂波,为了避免杂波带来的按键状态不稳定,通常采用20mS延时检测的方式来提高按键状态的稳定性。程序中进行了用while循环进行了简化。

3.避免重复检测按键,通过判断当前按键状态,如果是按键未按下时,则进行按键检测,如果按键没有释放,则不会进行按键检测。

4.避免重复输出按键状态信息,通过判断按键状态变化,只有在按键状态变化的时候输出一次按键信息,避免虚拟串口被刷屏。

本次课程就结束了,如果有什么疑问欢迎留言。本次的原理图和代码,请私信20002,系统自动回复下载链接。

标签: #php开发1200