文章目录

  • 51单片机之输入输出(Input/Output IO)
    • 0. 题外话
    • 1. IO介绍
    • 2. IO编程
      • 2.1 字节寻址
      • 2.2 位寻址
    • 3.常用器件的驱动电路
      • 3.1 LED
      • 3.2 数码管。
      • 3.3 按键
      • 3.4 键盘
      • 3.5 蜂鸣器

51单片机之输入输出(Input/Output IO)

0. 题外话

想来这篇文章早就应该付不了,因为考试和学业的问题拖到现在,也可能是因为我本身比较懒。

1. IO介绍

51单片机总的管脚有40个,但是其中能够作为IO使用的只有32个,每8个分为一组,共4组。单片机要想实现预定功能必然要使用到各种IO口,来完成各项功能,包括点亮LED,连接按键、键盘,各种I2C、SPI设备等。51单片机,4组IO的结构略有不同,使用时应当注意。

P0属于双向IO,内部没有上拉电阻,作为输出时,最好外加上拉电阻。
P1、P2、P3属于准双向IO。“准”体现在输入时,必须先输出“1”,才能正确读到IO的输入情况。

P3口的各个IO均有复用功能:

IO 复用功能
P3^0 P3^1 串口的接收端(RXD)和发送端(TXD)
P3^2 P3^3 外部中断INT0和INT1的输入
P3^4 P3^5 定时器T0和T1的门控输入
P3^6 P3^7 当连接外部RAM或者ROM的写选通(WR)和读选通(RD)。这个不是很常用,一般当作普通IO使用。

2. IO编程

对于IO的操作无非是读输入和写输出,通过读写相应的寄存器(P0、P1、P2、P3)就可以实现。

2.1 字节寻址

字节寻址可以一次把8个IO全部访问了,使用时把Px(x=0、1、2或3)当作无符号字符变量(unsigned char)即可。

表达式 功能
P0 = temp 写temp至P0
temp = P0 读P0至temp
P0 =~ P0 IO翻转
P0 &= 0x0F 高4位置“0”,不影响低4位
P0 |= 0xF0 高4位置“1”,不影响低4位
P0 ^= 0xF0 高4位翻转,不影响低4位

2.2 位寻址

51单片机有一类特殊的变量——位变量(bit),可以用来保存“0”或者“1”。
为了读写某个IO,可以定义特殊位变量(sbit)指定某一个IO,再进行读写

#include "reg52.h"
sbit LED=P1^0;
bit temp;
void main()
{temp=LED;//确保temp为位变量(bit)LED=1;LED=0;LED=temp;
}

3.常用器件的驱动电路

3.1 LED

单片机能够提供的电流有限,一般采用这种方式驱动LED:

当P2^0=1是,LED两端电压差位0V,LED不发光。 当P2^0=1是,LED两端存在电压差,LED发光,串联电阻的作用在于限流,阻值根据电源电压和LED工作电流决定

3.2 数码管。

数码管本质是发光二极管按照一定位置排列的显示数字的器件,可分为共阴极和共阳极两类。按照数量可分为一位,两位,四位甚至八位。
一位七段共阳极数码管:

有的数码管有八段,右下角会增加一个小数点。

当驱动两位8段数码管时,按上面的方式会占用16个IO,这种方式成为静态显示。静态显示可以控制每一个数码管,但是会极大的占用IO资源,当数码管数量较多时,这种方式明显不适合。

与静态相对应的是动态显示。每一个数码管显示一段时间,然后在切换到下一个。根据人眼的视觉暂留效应,只要刷新的频率超过24Hz,在人眼中就是连续的。把每一位数码管的a,b,c,d,e,f,g,dp接在同一组IO上,再用另一组IO来控制具体显示哪一个数码管(公共端)。

下面四位共阴极数码管示例,公共端用三极管做开关:

数码管显示段码如下

unsigned char code DUMA[]={                         //共阴极显示段码,共阳极取反即可
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,  //0-9
0x77,0x7c,0x39,0x5e,0x79,0x71                       //a-f
};

3.3 按键

可以用这种最简单的方式连接在IO上,为了保证能正确读到输入,先输出“1”。如下图,当按键按下,P1^0=0, 当按键松开,P1^0=1。

但实际上,由于开关接触瞬间,电压会产生不稳定的跳变,称为抖动,如下图:

抖动的时间小于10ms,因此当我们检测到电平变化是,延时10ms即可。

3.4 键盘

通过把按键组成4x4矩阵,可以使用8个IO连接16个按键。当按键数量较多时,采用这种方式可以大大节约IO资源。

下面代码是这种矩阵键盘的驱动,delay10ms()根据具体的情况定义。

#define key_port P2//检测按键的返回值,可以检测多个按键,返回一个16位的unsigned int型变量,某一个按键按下,相应位置“1”
unsigned int KeyBoard_scan(void)
{unsigned int ms=0,value=0;key_port=0x0f;while(key_port!=0x0f){delay10ms();if(key_port!=0x0f){ key_port=0x7f;value |= (key_port^0x7f);key_port=0xbf;value |= (key_port^0xbf)<<4;key_port=0xdf;value |= (key_port^0xdf)<<8;key_port=0xef;value |= (key_port^0xef)<<12;}key_port=0x0f;}return value;
}
//检测单个按键,value参数会写回相应键值0-15,返回值表示按键按下的时间,ms计
unsigned int KeyBoard(unsigned char *value)
{unsigned int ms=0;key_port=0x0f;if(key_port!=0x0f){delay10ms();if(key_port!=0x0f){ ms=10;key_port=0X0f;switch(key_port){case(0X07):  *value=0;break;case(0X0b): *value=1;break;case(0X0d): *value=2;break;case(0X0e): *value=3;break;default: *value=0xff;}key_port=0Xf0;switch(key_port){case(0X70):  *value=*value;break;case(0Xb0):    *value=*value+4;break;case(0Xd0): *value=*value+8;break;case(0Xe0): *value=*value+12;break;default: *value=0xff;}while((key_port!=0xf0)){delay_ms_keyboard(1);ms++;}return ms;}else *value=0xff; }else *value=0xff;return 0;
}

3.5 蜂鸣器

蜂鸣器分为有源蜂鸣器和无源蜂鸣器两种。
有源蜂鸣器用低电平就可以触发,发出的声音频率不会发生变化。
无源蜂鸣器需要用脉冲触发,脉冲的频率决定了声音的频率。
无源蜂鸣器的驱动电路如下:

51单片机之输入输出相关推荐

  1. 51单片机的输入输出简介

    以下是我整理的关于学习51 单片机和使用过程中出现疑问以及32单片机通用IO口的介绍,本人才疏学浅,表达略显粗浅,若有不合理之处,望大家多多指正! 本文参考资料 在采用单片机的I/O口作为输入口或输出 ...

  2. 如何高效地使用51单片机串口输入输出

    51单片机一般使用串口的方法都是这样的 #include<reg52.h> #define uint unsigned int void UART_Init(); uint num ; / ...

  3. p1口输入输出实验c语言程序,51单片机P1口输入输出实验实验报告.doc

    51单片机P1口输入输出实验实验报告 实验一 P1口输入输出实验一 实验目的 1 掌握P1口作为I/O口时的使用方法. 2 理解读引脚和读锁存器的区别. 实验原理 由 AT89C51 组成的单片机系统 ...

  4. 51单片机c语言数字输入输出,第五章 51单片机C语言程序--输入输出接口.pdf

    四川师范大学成都学院 51单片机原理及应用 单片机输入/输出口(I/O口) 主讲教师:刘强 四川师范大学成都学院电子竞赛培训实验中心(刘强) 明德.博学.求实.创新 复习1.单片机的外观 AT89C5 ...

  5. 51单片机 - 基本的输入输出

    51单片机 - 基本的输入输出 1.引言 之前学习51单片机的时间很短,感觉很不扎实,就想在闲的时候回顾一下51单片机.说到单片机,最简单的就是输出引脚电平,还有获取引脚当前状态了(read和writ ...

  6. 51单片机入门(一):输入输出

    概述 学习任何单片机(开发板)第一步都是了解输入输出.一般是从输出开始,比如对单个位进行操作(点亮流水灯),对多个位进行操作(数码管,点阵等).至于输入,最基础的便是键盘(按键) IO的结构 初学的时 ...

  7. 51单片机入门 - I/O口直接输入输出实例

    博主福利:100G+电子设计学习资源包! http://mp.weixin.qq.com/mp/homepage?__biz=MzU3OTczMzk5Mg==&hid=7&sn=ad5 ...

  8. 51单片机IO口输入输出方式

    传统51单片机IO接口只可以作为标准双向IO接口,如果用其来驱动LED只能用灌电流的方式或是用三极管外扩驱动电路. 灌电流方式:LED正极接VCC,负极接IO口.IO为高电平是LED两极电平相同,没有 ...

  9. 51单片机好学嘛?学完51单片机学什么?

    大家好,我是无际单片机编程的徐导,很多想学单片机又担心自己学不会的兄弟们,都想问这个问题:51单片机好学嘛? 作为一个资深的老工程师,我还是要客观地回答一下这个问题. 关于的"0基础15天学 ...

最新文章

  1. matlab图形用户界面设计简介
  2. SAP QM QPV3查看Sample-Drawing Procedure
  3. Oracle 内存性能指标
  4. 3D图形学的线性代数的通俗解释。
  5. Spring Data 发布更改版本管理方案之后的第一个版本:2020.0.0
  6. 爬虫python代码-python爬虫(附源码)
  7. QT的QSplitter类的使用
  8. ueditor的配置和使用
  9. 深圳出差 第一天【原创】
  10. oracle查询结果怎么去掉重复的,怎么去除重复的查询结果
  11. vm虚拟机开启蓝屏问题
  12. KEIL经常出现 Encountered an improper argument 弹窗
  13. 科研笔记(六) 基于环境感知的室内路径规划方法
  14. 先有鸡还是先有蛋的定论
  15. petalinux(3)——创建APP
  16. 阿里云物联网平台-数据解析脚本详解
  17. 对敏捷宣言的原则进行风险评估
  18. uva1601(The morning after Helloween)解题报告
  19. 阿里巴巴:互联网架构将成企业IT发展刚需
  20. iPhone Android主题,iPhone终于可以换主题了!还能一键体验安卓系统,无需任何插件...

热门文章

  1. 微信小程序--黑马程序员
  2. 教材作者告北大教授《操作系统教程》抄袭案获胜诉
  3. 计量地理学(Quantitative Geography)的学习笔记
  4. LeetCode 128.最长连续序列
  5. redis进阶之SpringBoot整合Redis(五)
  6. 设置div背景图片填满div
  7. 打印机使用技巧:打印机的另类用法
  8. Ignorance bless you! 无知是福
  9. 【Unity Shader】Special Effects(三)Shiny 闪亮(UI)
  10. 树莓派CM4 MINI IO产品