【SOC基础】单片机学习案例汇总 Part2:蜂鸣器、数码管显示

news2024/11/18 7:25:27

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨
📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】
📢:文章若有幸对你有帮助,可点赞 👍 收藏 ⭐不迷路🙉
📢:内容若有错误,敬请留言 📝指正!原创文,转载请注明出处

文章目录

  • 一、蜂鸣器
    • 蜂鸣器的介绍
    • 代码示例
  • 二、数码管显示
    • 2.1 数码管介绍:


一、蜂鸣器

蜂鸣器的介绍

蜂鸣器是一体化结构的电子讯响器,采用直流电压供电。
蜂鸣器发声条件:
1.需要使用驱动芯片。驱动蜂鸣器需要约30mA,因此无法使用IO口直接控制蜂鸣器,需要通过三极管把电流放大后再驱动蜂鸣器。又或者使用像图中的方法,不使用三极管进行电流放大,而是使用ULN2003芯片来驱动,P25输出高电平,BEEP则输出低电平;当P25输出低电平,BEEP则输出高电平,通过连续性的脉冲信号不断改变高低电平控制声音的发出。
2.需要脉冲。开发板上使用的是无源蜂鸣器,它需要一定频率的脉冲(高低电平)才会发声,因此需要让P25脚以一定频率不断输出高低电平信号才能控制蜂鸣器发出声音。并且脉冲频率要求处于1.5-5KHz这一范围内。
蜂鸣器的电路图:51单片机上面的蜂鸣器是由P2.5管脚进行控制的
在这里插入图片描述

代码示例

蜂鸣器实验:下载程序后蜂鸣器发出声音,一段时间后关闭

  #include <REGX52.H>
    typedef unsigned char u8;
    typedef unsigned int  u16;
    sbit BEER =P2^5;
    void delay_10us(u16 num)
    {
        while(num--);
    }
    void main()
    {
        u16 i=2000;
        while1{
            while(i--)
            {
                BEER=!BEER;
                delay_10us(100);
            }
            BEER=0;
        }
    }

二、数码管显示

2.1 数码管介绍:

数码管是显示器件,用来显示数字。由发光二极管组成,因此也称LED数码管。

数码管的分类:
1.按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多一个小数点(DP),这个小数点可以更精确的表示数码管想要显示的内容。
2.单个(1位)、联排(2位、4位、8位)。
3.按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。
在这里插入图片描述

数码管显示的工作原理
(1)亮灭原理(其实就是内部的照明LED)
(2)显示数字(甚至文字)原理:利用内部的LED的亮和灭让外部的组成数字的笔画显示或者不显示,人看到的就是不同的数字。

共阳极和共阴极数码管
(1)驱动方法的差异。一个数码管内部的8颗LED是独立驱动的。如果8颗LED的正极接在一起接到VCC上(负极分别接到单片机的不同引脚),这种接法就叫共阳极。反之如果8颗LED负极接在一起然后接到GND(正极就分别接到单片机的不同引脚)就叫共阴极。两种接法都可以驱动数码管显示,但是用来显示的单片机程序不同(共阳极时单片机0是亮,共阴极时单片机的1是亮)。
(2)驱动电流需求差异。
按照共阳极接法,单片机可以直接驱动显示;
按照共阴极接法,单片机不能直接驱动。因为IO口提供的电流大小不够驱动LED显示,因此需要外部电路提供一个能驱动大电流的芯片来解决。

静态和动态数码管
(1)用途差异
(2)电路接法差异

验证原理图中数码管段号是否正确
(1)数码管的8段实际是8个LED,分别对应IO端口P0的8个引脚(P0.0、P0.1····P0.7),那么谁对应谁呢?
(2)理论上可以分析原理图和接线方法去推测这个对应关系(数码管的段码),但是实际上理论分析的经常不对。
(3)实战中一般都是自己写代码去测试的。
P0 = 0xfe; // 11111110 P0.0输出0 实测对应a
P0 = 0xfd; // 11111101 P0.1输出0 实测对应b
P0 = 0xfb; // 11111011 P0.2输出0 实测对应c
P0 = 0xf7; // 11110111 P0.3输出0 实测对应d
P0 = 0xef; // 11101111 P0.4输出0 实测对应e
P0 = 0xdf; // 11011111 P0.5输出0 实测对应f
P0 = 0xbf; // 10111111 P0.6输出0 实测对应g
P0 = 0x7f; // 01111111 P0.7输出0 实测对应dp
注意:P0端口的8个二进制位中,高位对应P0.7,而低位对应P0.0
思考:数码管如何显示数字?
(1)数码管显示数字,其实就是让数码管亮相应的几个段。其实就是让IO端口的相应引脚输出0(其余引脚输出1),对应一个8位的二进制数。
(2)结论就是:P0端口输出一个合适的字节数,数码管就会显示相应的数字。每个数字都会有一个对应的8位二进制数,关键就是要得到这8位二进制数。

静态数码管显示数字
数字编码(段码)的获取
要显示的数字 数码管亮的LED 段码二进制 十六进制
0 abcdef 11000000 0 0xC0
1 bc 11111001 0xf9
2 abdeg 10100100 0xA4
3 abcdgh 10110000 0 0xb0
4 bcfg 10011001 0x99
5 acdfg 10010010 0x92
6 acdefg 10000010 0x82
7 abc 11111000 0xf8
8 abcdefg 10000000 0x80
9 abcdfg 10010000 0x90
A abcefg 10001000 0x88
b cdefg 10000011 0x83
C adef 11000110 0 0xc6
d bcdeg 10100001 0xA1
E adefg 10000110 0 0x86
F aefg 10001110 0 0x8e

结论
(1)不同的数码管数字编码(段码)表完全可能不同
(2)同一个数码管接线方式不同编码表可能完全不同
(3)硬件确定后可通过调试的方法来实验确定编码表
让数码管依次显示0到f
笨办法:分状态
升级方法:使用数组

动态数码管
静态数码管驱动方式的缺陷
(1)优势是驱动简单直接,好编程
(2)缺陷是每个数码管需要1个端口,单片机的端口不够用
解决办法:使用动态方式驱动多个数码管

什么是动态数码管
动态数码管还是原来的数码管(共阳极或共阴极均可),但不同的是动态数码管利用了人眼的视觉暂留。动态数码管有2端:COM端和段码端;段码一侧还是接一个单片机端口;COM(共极)接单片机一个IO口,多个联排数码管的COM共同接一个IO端口
分析对比静态和动态数码管,发现本质区别是:静态数码管中只要给了段码数码管就一定工作(显示只取决于段码端),动态数码管中段码端给了段码值后还需要COM端配合才能点亮数码管。
在这里插入图片描述
动态数码管如何工作?
(1)在某一特定时间段中,联排数码管中只有一个数码管在工作,其他均不工作。
(2)COM端选择哪个数码管工作,段码端输出这个数码管要显式的数字的段码;然后延时人眼无法感知到的时间;COM端选择下一个数码管工作,同时段码端改输出这个数码管要显示的数字的段码;延时;COM端选择下一个数码管工作······
(3)快速切换工作的数码管,则人看到的是所有的数码管都在亮(其实亮度是比静态驱动低的)。
搞清楚2点:

1、宏观上所有的数码管都是同时亮的,所以多个数码管可以合在一起来显示,因此使人以为所有数码管在同时工作(譬如同时显示12345678)
2、微观上数码管是依次亮的,我们可以给不同的数码管送不同的段码,所以不同的数码管可以显示不同的数字。所以相当于8个数码管的显示是独立的。
动态数码管显示编程实战1
目标:先实验得出数码管的段码表
(1)接线确定:段码端接P0,COM端接P2端口
(2)COM端选择一个数码管亮:P2.0-P2.7随便选1个输出0,其余输出1
(3)段码端给不同的值来测试得到段码表
动态数码管显示编程实战2
目标:8个联排数码管一起显示12345678
编程思路:先选中第1数码管,然后段码端送1的段码,然后延时一会儿;然后切换选中第2数码管,然后段码端送2的段码,然后延时一会儿;····直到第8个数码管显示完为一个周期;死循环这个周期。
实验结论:
1、延时时间太长,数字会闪动。
2、把时间改短后发现有3个问题:第一个是亮的不够亮,第二个是暗的不够暗,第三个是其中一个数字(1)显示明显有问题。 解决方案就是在每个数码管亮完要切换下一个数码管时消隐。
对程序第一步改良:把段码放在数组中去查数组。
第二步改良:COM选择码也可以放到数组中去

38译码器介绍
(1)38译码器的作用:用3个IO口来控制8路输出。
(2)用38译码器驱动数码管的意义:原来不用38译码器时,8个动态数码管一共使用2个IO端口(16个引脚),现在使用了38译码器后,我们可以用38译码器的3路输入来控制数码管的8路位码,这样总共只需要3+8=11个IO引脚就可以来驱动8个动态数码管了,省了5个IO口。

74LS138的数据手册
(1)重点看懂真值表
(2)G1和G2A G2B三个是使能引脚
(3)ABC是编码端,Y0-Y7是输出端
1.7.9.使用38译码器驱动动态数码管
1.7.9.1、接线方式确定
(1)J15和J16连接起来
(2)ABC分别接P1.0、P1.1、P1.2三个
1.7.9.2、实验测定编码表
(1)按照接线图分析,P1.0=0并且P1.1=0并且P1.2等于0时Y0为低对应第1个数码管亮;P1.0=1并且P1.1=0并且P1.2等于0时Y1为低对应第2个
总结
(1)C语言的不同特性用在不同地方,可以简化编程
(2)C语言数组从0开始,注意不能越界,这个很重要

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1155663.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FreeRTOS深入教程(队列内部机制和源码分析)

文章目录 前言一、队列结构体分析二、创建队列三、读写队列源码分析1.读队列源码分析2.写队列源码分析 总结 前言 本篇文章主要来为大家分析队列的内部机制和源码实现。 一、队列结构体分析 在FreeRTOS中队列会使用一个结构体来表示&#xff1a; 1.int8_t * pcHead 和 int…

MySQL数据库的存储引擎,底层存储结构,事物隔离级别,索引,日志等

存储引擎 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表而不是基于库的&#xff0c;所以存储引擎也可以被称为表引擎。 默认存储引擎是InnoDB。 InnoDB 在 MySQL 5.5 之后&#xff0c;InnoDB 是默认的 MySQL 引擎。 1.支持事务 2.行级锁…

YOLOv5/YOLOv7改进: AIFI (尺度内特征交互)助力YOLO | YOLO终结者?RT-DETR一探究竟

💡💡💡本文全网首发独家改进: AIFI (尺度内特征交互)助力YOLO ,提升尺度内和尺度间特征交互能力,同时降低多个尺度的特征之间进行注意力运算,计算消耗较大等问题 推荐指数:五星 AIFI | 亲测在多个数据集能够实现涨点 💡💡💡Yolov5/Yolov7魔术师,独家首…

Windows11无法打开Photoshop CC 2017问题解决

情况描述&#xff1a; Windows11上&#xff0c;双击Photoshop CC 2017没反应 解决办法&#xff1a; 此时需要启动Windows的“事件查看器”来确认问题出在哪里。可以直接通过开始菜单搜索启动&#xff0c;也可以通过右键点击“此电脑”->“管理”&#xff0c;然后找到事件查…

解密杭州亚运背后科技:核心系统100%上云,20多项全球首创智能应用

10月31日&#xff0c;2023杭州云栖大会&#xff0c;杭州亚运会信息技术中心执行指挥长、杭州亚组委广播电视和信息技术部副部长张鸽以《科技创新在亚运舞台精彩绽放》为主题&#xff0c;分享了杭州亚运会的智能亚运实践。 杭州亚运会打造了史上首个全覆盖的数字化服务体系&…

港府Web3宣言周年思考:合规困境中的“隐患”

出品&#xff5c;欧科云链研究院 作者&#xff5c;毕良寰 距离《有关虚拟资产在港发展的政策宣言》已过去一年&#xff0c;我们欧科云链研究院在分析全球几个主要国家和地区对Web3的监管政策及态度后&#xff0c;对港府的雄心壮志充满期待。然而&#xff0c;由于近期一些庞氏骗…

学习redis之前的泛泛而谈(特性介绍,应用场景,Ubuntu安装与通用命令介绍)

文章目录 前言关于分布式系统Redis特性Redis应用场景Redis5安装redis命令最核心的两个命令&#xff1a;get和setkeysexitsdelexpirettlredis中key的过期策略type redis数据类型的内部实现方式redis的单线程 前言 redis最重要的概念&#xff1a;在内存中存储数据 为什么要设计一…

MySQL(4):运算符

算术运算符 算术运算符主要用于数学运算&#xff0c;其可以连接运算符前后的两个数值或表达式&#xff0c;对数值或表达式进行加&#xff08;&#xff09;、减&#xff08;-&#xff09;、乘&#xff08;*&#xff09;、除&#xff08;/&#xff09;和取模&#xff08;%&#…

在uni-app中使用ECharts - 配置四种不同的图表

&#x1f468;‍&#x1f9b0;博主&#xff1a;小猫娃来啦 &#x1f468;‍&#x1f9b0;文章核心&#xff1a;在uni-app中使用ECharts - 配置四种不同的图表 文章目录 前言安装ECharts插件引入ECharts库创建Charts实例和图表容器配置和渲染图表配置柱状图配置折线图配置饼图配…

详解final, abstract, interface关键字

一.final关键字 1.final关键字介绍 ——final关键字可以去修饰类、方法、属性和局部变量 2.final关键字的作用 1&#xff09;final修饰类&#xff0c;这个类不能被其他类继承 2&#xff09;final修饰方法&#xff0c;方法不能被重写 3&#xff09;final修饰属性&#xff0c;属…

通过shiro框架记录用户登录,登出及浏览器关闭日志

背景&#xff1a; 公司项目之前使用websocket记录用户登录登出日志及浏览器关闭记录用户登出日志&#xff0c;测试发现仍然存在问题&#xff0c; 问题一&#xff1a;当浏览器每次刷新时websocket其实是会断开重新连接的&#xff0c;因此刷新一下就触发记录登出的日志&#xff0…

41.排序练习题(王道2023数据结构第8章综合练习)

试题1&#xff08;王道8.3.3节综合练习2&#xff09;&#xff1a; 编写双向冒泡排序算法&#xff0c;在正反两个方向交替扫描。即第一趟把关键字最大的元素放在序列的最后面&#xff0c;第二趟把关键字最小的元素放在序列最前面&#xff0c;如此反复。 首先实现冒泡排序&…

FIFO 位宽转换

从8位转32位 module tb_fifo();reg clk,rst; initial beginclk0;forever #4.545 clk~clk; end initial beginrst1;#9.09 rst0; endreg [31:0] cnts; always (posedge clk or posedge rst) beginif(rst)begincnts < 32d0;endelsebegincnts < cnts 1b1;end endreg […

美国白宫发布总统令:鼓励AI以安全、可靠的方式发展

美国华盛顿时间10月30日&#xff0c;美国白宫官网发布了&#xff0c;关于发展安全、可靠和值得信赖的AI&#xff08;人工智能&#xff09;的拜登总统行政令。 白宫表示&#xff0c;该行政令为AI安全和保障制定了新标准&#xff0c;保护了用户的数据隐私&#xff0c;促进公平和…

英语——歌曲篇——only you

《only you》(只有你)赏析 很多人都听过The Platters(派特斯乐队)演唱的《only you》(只有你)这首歌曲&#xff0c;尤其是看过在周星驰和罗家英在《大话西游》里面演绎的"无厘头"版本后。 不过&#xff0c;又有几人知道&#xff0c;这首歌曲原来是经典浪漫影片《罗马…

C语言_常用数据类型地址的理解

常用基本数据类型&#xff1a; #include <stdio.h> #include <stdlib.h> #include <stdint.h>int main(){printf("基本数据类型:\n");printf("char: %d\n", sizeof(char));printf("int: %d\n", sizeof(int));printf("do…

1.6 基本安全设计准则

思维导图&#xff1a; 1.6 基本安全设计准则笔记 目标&#xff1a;理解和遵循一套广泛认可的安全设计准则&#xff0c;以指导保护机制的开发。 主要准则&#xff1a; 机制的经济性&#xff1a;安全机制应设计得简单、短小&#xff0c;便于测试和验证&#xff0c;减少漏洞和降…

linux系统的环境变量-搞清环境变量到底是什么

环境变量 引例环境变量常见的环境变量echoexportenvunsetset 通过代码获取环境变量使用第三个参数获取使用全局变量enviorn获取环境变量通过系统调用获取环境变量 环境变量具有全局属性main函数前两个参数的作用 引例 在linux系统中&#xff0c;我们使用ls命令&#xff0c;直接…

Python 算法高级篇:深度优先搜索和广度优先搜索的高级应用

Python 算法高级篇&#xff1a;深度优先搜索和广度优先搜索的高级应用 引言 1. 深度优先搜索&#xff08; DFS &#xff09;回顾2. 广度优先搜索&#xff08; BFS &#xff09;回顾3. 拓扑排序4. 连通性检测5. 最短路径问题6. 案例分析&#xff1a;社交网络分析7. 总结 引言 深…

剑指 Offer || 084.全排列||

题目 给定一个可包含重复数字的整数集合 nums &#xff0c;按任意顺序 返回它所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2] 输出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]]示例 2&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1…