历史上的今天
返回首页

历史上的今天

今天是:2025年08月06日(星期三)

正在发生

2021年08月06日 | 51单片机之输入输出

2021-08-06 来源:eefocus

1. IO介绍

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

p1

P0属于双向IO,内部没有上拉电阻,作为输出时,最好外加上拉电阻。

P1、P2、P3属于准双向IO。“准”体现在输入时,必须先输出“1”,才能正确读到IO的输入情况。


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

image.png?imageView2/2/w/550

2. IO编程

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


2.1 字节寻址

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

image.png?imageView2/2/w/550

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:

LED

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


3.2 数码管。

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

一位七段共阳极数码管:

seg_single

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


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


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


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

seg

数码管显示段码如下


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。

key

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

button

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


3.4 键盘

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

p3

下面代码是这种矩阵键盘的驱动,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 蜂鸣器

蜂鸣器分为有源蜂鸣器和无源蜂鸣器两种。

有源蜂鸣器用低电平就可以触发,发出的声音频率不会发生变化。

无源蜂鸣器需要用脉冲触发,脉冲的频率决定了声音的频率。

无源蜂鸣器的驱动电路如下:

buzz

推荐阅读

史海拾趣

Good Will Instrument Co., Ltd.公司的发展小趣事

对于恒温箱控制器电路,网友可能会有多种问题,以下是一些常见问题及其详细回答:

一、恒温箱控制器电路的基本原理是什么?

回答
恒温箱控制器电路的基本原理是通过温度传感器(如热敏电阻、热电偶等)实时检测恒温箱内的温度,并将检测到的温度信号转换为电信号(如电压或电流信号)。这个电信号随后被送入控制器中进行处理,与预设的温度值进行比较。如果检测到的温度高于或低于预设值,控制器会发出指令,通过调节加热元件(如电热丝、加热管等)或制冷元件(如压缩机、半导体制冷片等)的工作状态,使恒温箱内的温度回到预设值,从而实现恒温控制。

二、恒温箱控制器电路常见的故障有哪些?

回答
恒温箱控制器电路常见的故障包括但不限于以下几种:

  1. 温度显示异常
    • 可能原因:温度传感器损坏、控制器内部电路故障、显示屏故障等。
    • 解决方法:检查并更换损坏的温度传感器、修复或更换控制器内部故障电路、更换显示屏等。
  2. 温度控制不准确
    • 可能原因:控制器参数设置错误、温度传感器位置不当、加热/制冷元件故障等。
    • 解决方法:重新校准控制器参数、调整温度传感器位置、检查并修复加热/制冷元件等。
  3. 控制器无法启动
    • 可能原因:电源故障、控制器内部保险丝熔断、电路板短路等。
    • 解决方法:检查电源是否正常、更换熔断的保险丝、修复电路板短路等。

三、如何检查恒温箱控制器电路是否正常工作?

回答
检查恒温箱控制器电路是否正常工作,可以按照以下步骤进行:

  1. 检查电源
    • 确认电源插头是否牢固插入插座,电源线是否完好无损。
    • 使用万用表测量电源电压,确保在控制器要求的范围内。
  2. 检查温度传感器
    • 使用万用表测量温度传感器的电阻值或电压值,与标准值进行比较,判断传感器是否正常。
    • 检查传感器与控制器之间的连接是否牢固可靠。
  3. 检查控制器显示
    • 观察控制器显示屏上的温度读数是否准确,有无异常显示。
  4. 检查加热/制冷元件
    • 检查加热/制冷元件是否正常工作,可以通过观察其工作状态或使用万用表测量其电流/电压值来判断。
  5. 进行功能测试
    • 设置一个预设温度值,观察恒温箱是否能准确达到并保持在预设温度。
    • 如果条件允许,可以使用更精确的温度测量设备(如高精度温度计)对恒温箱内的温度进行校验。

四、如何维护和保养恒温箱控制器电路?

回答
为了保持恒温箱控制器电路的长期稳定工作,可以进行以下维护和保养工作:

  1. 定期清洁
    • 定期清洁恒温箱内部和外部的灰尘和污垢,防止对控制器电路造成不良影响。
    • 清洁时应断开电源,并使用合适的清洁工具和清洁剂。
  2. 检查连接
    • 定期检查温度传感器、加热/制冷元件与控制器之间的连接是否牢固可靠,如有松动应及时紧固。
  3. 校准参数
    • 定期对控制器进行校准,确保温度读数准确可靠。
    • 校准时应按照控制器的使用说明书或生产厂家的建议进行操作。
  4. 更换老化部件
    • 对于已经老化或损坏的部件(如温度传感器、加热/制冷元件等),应及时进行更换。
  5. 注意使用环境
    • 恒温箱应放置在通风良好、干燥清洁的环境中,避免阳光直射和潮湿环境对控制器电路造成损害。
  6. 定期维护
    • 定期对恒温箱进行全面检查和维护,包括控制器电路、加热/制冷系统、进出料装置等部分。
    • 维护时应按照设备的操作手册和生产厂家提供的维护保养指导进行。
台湾富晶(FORTUNE)公司的发展小趣事
对于老化或损坏的元件进行更换,确保触发器的正常工作。
Holy Stone公司的发展小趣事

1999年,Holy Stone在台湾桃园龙潭设立了生产基地,开始自主生产积层陶瓷电容(MLCC)。这一举措标志着公司从单纯的代理商向集研发、生产、销售于一体的多元化企业转型。同年,公司创立了自有品牌“HEC”,并以该品牌推出了一系列多元客制化产品,行销全球。这些产品凭借其高品质和满足客户全方位需求的特点,赢得了客户的广泛信赖,进一步巩固了公司在电子元件市场的地位。

BOWEI公司的发展小趣事

Holy Stone企业股份有限公司创立于1981年,总部位于台北市。创立之初,公司凭借创办人深厚的电子技术背景,迅速在电子元件市场站稳脚跟。起初,Holy Stone主要作为专业的电子零件代理商,为客户提供专业的技术服务与解决方案。这一阶段,公司通过扎实的专业技术基础和敏锐的市场洞察力,逐步建立起稳定的客户基础,为后续的发展奠定了坚实的基础。

东晨(DC)公司的发展小趣事

在电子行业的激烈竞争中,东晨(DC)公司凭借一项革命性的技术突破——高效能低功耗的芯片设计,迅速崛起。该公司投入大量研发资源,成功开发出了一款性能卓越、能耗极低的芯片,这一创新成果为智能手机、平板电脑等移动设备提供了更长的续航时间和更快的运行速度。凭借这一技术优势,东晨(DC)公司迅速获得了市场的认可,产品销量节节攀升。

GaN Systems公司的发展小趣事

GAIA Converter Inc成立于1993年,总部位于法国波尔多附近的航空航天工业城,这里聚集了众多高科技企业和研究机构。公司自创立之初便专注于高可靠性和工业模块化电源解决方案的研发与生产。在成立初期,GAIA盖亚电源凭借对电力转换技术的深入理解,迅速开发出了一系列适用于航空、军事及高端工业应用的DC/DC转换器模块。这些产品凭借其卓越的性能和稳定的质量,在市场上赢得了初步认可。

问答坊 | AI 解惑

电感,变压器

请问下滤波电感变压器的原理和作用?,最好能发个图看看,长什么样?谢谢!…

查看全部问答>

信号链基础--运放

信号链基础--运放…

查看全部问答>

寻找RFID及嵌入式开发合作伙伴

本公司寻找有创业激情和梦想的志同道合者,发展方向是RFID及嵌入式开发…

查看全部问答>

怎样使用PB5.0的断点功能

如题,没怎么用过,这次我用的是X86的平台模拟器,在这个基础上想使用断点来跟踪程序请教高手怎么使用这个功能?…

查看全部问答>

关于液晶屏的驱动问题求助?

我有一块ARM7 S3C44B0的开发板,我最近买了一个320X240的液晶屏。 商家提供了320X240.bin的驱动,但是我不知道怎么把驱动加载到开发板的系统中。 我刚开始学这个,我想检验一下这块屏能不能正常使用。哪位高人能不能详细解释一下??…

查看全部问答>

串口通信问题求解

小弟大1受一研究生朋友影响开始学习单片机并对此方面有很大的兴趣,在院实验室找了一个师兄弄了块板子做做东西,有很多地方弄不懂还望各位大虾指点一二(已经学完C语言但是还没看过C51) 感激万分!!! 利用单片机串行口,实现和PC之间的串行通 ...…

查看全部问答>

请问做一个USB管理软件的流程?

请问做一个USB管理软件的流程?…

查看全部问答>

Cortex-M3与ARM7TDMI-S内核MCU运算性能比较

还是21IC人气旺,转一篇我在EDN的博文:http://blog.ednchina.com/htjgdw/140162/message.aspx自从STM32推出后,我对它很感兴趣,由于它采用了ARM的Cortex-M3内核,所以很想了解一下其性能和ARM7相比究竟如何?很巧的机会知道了EDNCHINA,参加了EDN ...…

查看全部问答>

电路设计缺陷,请你找找原因

下图是DIY数字电源中的部分电路,隔离的~110V整流后加在VCC端,48V有输出但电压低(占空比限止的原因)。在加整流~220V(与辅助电源共用)的电压时,瞬间Q82冒烟,后经查,CPU(F28035)烧坏,现象是VDDA对地短路。     请大家帮忙分 ...…

查看全部问答>