扫盲教程:深入浅出讲解单片机控制单只数码管循环显示0~F
最近有好多小伙伴留言说,我发的项目很难,他们都是刚入门的,希望我写一些入门级的教程,那么今天我就从硬件和软件两个方面来给大家讲一下最基本也是十分重要的电路 单片机驱动数码管显示电路。
要弄清楚单片机控制数码管显示字符的原理我们首先要知道:三个概念
单片机:通俗的讲单片机是一种集成电路芯片,利用一些特殊工艺把许多不同功能的模块集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。单片机可以烧进程序,然后从不同的IO口输出规定的电平信号。
七段数码管(如下图):
数码管是一类价格便宜 使用简单,通过对其不同的管脚输入相对的电流,使其发亮,从而显示出数字能够显示 时间、日期、温度等所有可用数字表示的参数的器件。一般的七段数码管拥有七个发光二极管(三横四纵)用以显示十进制0至9的数字外加小数点,也可以显示英文字母 A 至 F(b、d 为小写,其他为大写)。现时大部分的七段数码管会以斜体显示。
好了,上面是单片机和数码管的概念,下面说一下单片机的工作原理:
一个单片机要想能正常工作必须满足它工作的最小系统,这个最小系统包括,电源电路,晶振电路,复位电路等,当电源电路给单片机正常供电后,在上电的一瞬间会给复位电容充电从而完成上电复位的动作。单片机复位结束后,我们把需要控制数码管显示的代码烧进单片机,这时候单片机就会根据写的代码从不同的IO口输出不同的电平,从而控制七段数码管每一段的亮灭,而达到显示不同数字的目的。
好了说了半天理论了,下面我们开始实践一下吧!
首先用PROTEUS仿真软件画好单片机最小系统和LED数码管驱动原理图:本项目中用STC89C52
把程序烧进去以后,数码管开始从0到F显示,适当调整源代码参数可以修改显示不同的数字和不同的时间间隔。
51单片机参考源代码如下:
/*单只数码管循环显示0~F 作者 科技小伟1*/
#include <reg51.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
code uint8 LED_CODE[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8E};
void delay(uint16 x)
{
uint16 i,j;
for(i = x; i > 0; i --)
for(j = 114; j > 0; j --);
}
void main()
{
uint8 i = 0;
while(1)
{
for(i = 0; i < 16; i ++) //i = (i + 1) % 16
{
P0 = LED_CODE[i];
delay(500);
}
}
}
好了以上就是单片机控制数码管显示的全部内容了,本文从软件和硬件两个角度分别讲解,如果有任何意见或者需要设计文件 欢迎留言或者私信,如果你也对单片机感兴趣,那么快点行动起来吧!我们下期再见!
「硬见小百科」单片机串行口介绍
串行口是单片机与外界进行信息交换的工具。■ 8051单片机的通信方式有两种:
并行通信:数据的各位同时发送或接收。
串行通信:数据一位一位次序发送或接收。
参看下图:
串行通信的方式包括异步通信和同步通信。
异步通信
它用一个起始位表示字符的开始,用停止位表示字符的结束。其每帧的格式如下:
在一帧格式中,先是一个起始位0,然后是8个数据位,规定低位在前,高位在后,接下来是奇偶校验位(能省略),最后是停止位1。用这种格式表示字符,则字符能一个接一个地传送。
在异步通信中,CPU与外设之间必须有两项规定,即字符格式和波特率。字符格式的规定是双方能够在对同一种0和1的串理解成同一种意义。原则上字符格式能由通信的双方自由制定,但从通用、方便的角度出发,一般还是使用一些标准为好,如采用ASCII标准。
波特率即数据传送的速率,其定义是每秒钟传送的二进制数的位数。例如,数据传送的速率是120字符/s,而每个字符如上述规定包含10数位,则传送波特率为1200波特。
同步通信
在同步通信中,每个字符要用起始位和停止位作为字符开始和结束的标志,占用了时间;所以在数据块传递时,为了提高速度,常去掉这些标志,采用同步传送。由于数据块传递开始要用同步字符来指示,同时要求由时钟来实现发送端与接收端之间的同步,故硬件较复杂。
通信方向
在串行通信中,把通信接口只能发送或接收的单向传送办法叫单工传送;而把数据在甲乙两机之间的双向传递,称之为双工传送。在双工传送方式中又分为半双工传送和全双工传送。半双工传送是两机之间不能同时进行发送和接收,任一时该,只能发或者只能收信息。
8051单片机的串行接口结构
8051单片机串行接口是一个可编程的全双工串行通信接口。它可用作异步通信方式(UART),与串行传送信息的外部设备相连接,或用于通过标准异步通信协议进行全双工的8051多机系统也能通过同步方式,使用TTL或CMOS移位寄存器来扩充I/O口。
8051单片机通过管脚RXD(P3.0,串行数据接收端)和管脚TXD(P3.1,串行数据发送端)与外界通信。SBUF是串行口缓冲寄存器,包括发送寄存器和接收寄存器。它们有相同名字和地址空间,但不会出现冲突,因为它们两个一个只能被CPU读出数据,一个只能被CPU写入数据。
▲串行口的控制与状态寄存器
串行口控制寄存器SCON
它用于定义串行口的工作方式及实施接收和发送控制。字节地址为98H,其各位定义如下表:
SM0、SM1:串行口工作方式选择位,其定义如下:
(注:其中fosc为晶体震荡器频率)
SM2:多机通信控制位。在方式0时,SM2一定要等于0。在方式1中,当(SM2)=1则只有接收到有效停止位时,RI才置1。在方式2或方式3当(SM2)=1且接收到的第九位数据RB8=0时,RI才置1。
REN:接收允许控制位。由软件置位以允许接收,又由软件清0来禁止接收。
TB8: 是要发送数据的第9位。在方式2或方式3中,要发送的第9位数据,根据需要由软件置1或清0。例如,可约定作为奇偶校验位,或在多机通信中作为区别地址帧或数据帧的标志位。
RB8:接收到的数据的第9位。在方式0中不使用RB8。在方式1中,若(SM2)=0,RB8为接收到的停止位。在方式2或方式3中,RB8为接收到的第9位数据。
TI:发送中断标志。在方式0中,第8位发送结束时,由硬件置位。在其它方式的发送停止位前,由硬件置位。TI置位既表示一帧信息发送结束,同时也是申请中断,可根据需要,用软件查询的办法获得数据已发送完毕的信息,或用中断的方式来发送下一个数据。TI必须用软件清0。
RI:接收中断标志位。在方式0,当接收完第8位数据后,由硬件置位。在其它方式中,在接收到停止位的中间时刻由硬件置位(例外情况见于SM2的说明)。RI置位表示一帧数据接收完毕,可用查询的办法获知或者用中断的办法获知。RI也必须用软件清0。
▲特殊功能寄存器PCON
PCON是为了在CHMOS的80C51单片机上实现电源控制而附加的。其中最高位是SMOD。
串行口的工作方式
8051单片机的全双工串行口可编程为4种工作方式,现分述如下:
方式0 移位寄存器输入/输出方式。
可外接移位寄存器以扩展I/O口,也能外接同步输入/输出设备。8位串行数据者是从RXD输入或输出,TXD用来输出同步脉冲。
输出 串行数据从RXD管脚输出,TXD管脚输出移位脉冲。CPU将数据写入发送寄存器时,立即启动发送,将8位数据以fos/12的固定波特率从RXD输出,低位在前,高位在后。发送完一帧数据后,发送中断标志TI由硬件置位。
输入 当串行口以方式0接收时,先置位允许接收控制位REN。此时,RXD为串行数据输入端,TXD仍为同步脉冲移位输出端。当(RI)=0和(REN)=1同时满足时,开始接收。当接收到第8位数据时,将数据移入接收寄存器,并由硬件置位RI。
下面两图分别是方式0扩展输出和输入的接线图。
<单片机串行口接线图>
方式1 波特率可变的10位异步通信接口方式 。
发送或接收一帧信息,包括1个起始位0,8个数据位和1个停止位1。
输出 当CPU执行一条指令将数据写入发送缓冲SBUF时,就启动发送。串行数据从TXD管脚输出,发送完一帧数据后,就由硬件置位TI。
输入 在(REN)=1时,串行口采样RXD管脚,当采样到1至0的跳变时,确认是开始位0,就开始接收一帧数据。只有当(RI)=0且停止位为1或者(SM2)=0时,停止位才进入RB8,8位数据才能进入接收寄存器,并由硬件置位中断标志RI;不然信息丢失。所以在方式1接收时,应先用软件清零RI和SM2标志。
方式2 固定波特率的11位UART方式。
它比方式1增加了一位可程控为1或0的第9位数据。
输出: 发送的串行数据由TXD端输出一帧信息为11位,附加的第9位来自SCON寄存器的TB8位,用软件置位或复位。它可作为多机通信中地址/数据信息的标志位,也能作为数据的奇偶校验位。当CPU执行一条数据写入SUBF的指令时,就启动发送器发送。发送一帧信息后,置位中断标志TI。
输入: 在(REN)=1时,串行口采样RXD管脚,当采样到1至0的跳变时,确认是开始位0,就开始接收一帧数据。在接收到附加的第9位数据后,当(RI)=0或者(SM2)=0时,第9位数据才进入RB8,8位数据才能进入接收寄存器,并由硬件置位中断标志RI;不然信息丢失。且不置位RI。再过一位时间后,不管上述条件时否满足,接收电路即行复位,并重新检测RXD上从1到0的跳变。
方式3 波特率可变的11位UART方式。
除波特率外,其余与方式2相同。
关于波特率选择
如前所述,在串行通信中,收发双方的数据传送率(波特率)要有一定的约定。在8051串行口的四种工作方式中,方式0和2的波特率是固定的,而方式1和3的波特率是可变的,由定时器T1的溢出率控制。
▲ 方式0
方式0的波特率固定为主振频率的1/12。
▲ 方式2
方式2的波特率由PCON中的选择位SMOD来决定,可由下式表示:
波特率=2的SMOD次方除以64再乘一个fosc,也就是当SMOD=1时,波特率为1/32fosc,当SMOD=0时,波特率为1/64fosc
▲ 方式1和方式3
定时器T1作为波特率发生器,其公式如下:
式中T1计数率取决于它工作在定时器状态还是计数器状态。当工作于定时器状态时,T1计数率为fosc/12;当工作于计数器状态时,T1计数率为外部输入频率,此频率应小于fosc/24。产生溢出所需周期与定时器T1的工作方式、T1的预置值有关。
定时器T1工作于方式0:溢出所需周期数=8192-x;
定时器T1工作于方式1:溢出所需周期数=65536-x;
定时器T1工作于方式2:溢出所需周期数=256-x。
因为方式2为自动重装入初值的8位定时器/计数器模式,所以用它来做波特率发生器最恰当。
当时钟频率选用11.0592MHZ时,取易获得标准的波特率,所以很多单片机系统选用这个看起来“怪”的晶体震荡器就是这个道理。
下表列出了定时器T1工作于方式2常用波特率及初值。
以上所有信息仅作为学习交流使用,不作为任何学习和商业标准。若您对文中任何信息有异议,欢迎随时提出,谢谢!
关于云创硬见
云创硬见是国内最具特色的电子工程师社区,融合了行业资讯、社群互动、培训学习、活动交流、设计与制造分包等服务,以开放式硬件创新技术交流和培训服务为核心,连接了超过30万工程师和产业链上下游企业,聚焦电子行业的科技创新,聚合最值得关注的产业链资源, 致力于为百万工程师和创新创业型企业打造一站式公共设计与制造服务平台。
相关问答
单片机 C语言中比如led=~led,波浪线什么意思? - carrieie 的...取反。对led来说就是原来亮的灭,原来灭的亮~在这里是按位取反的意思。按位取反是C语言位操作的一种,其操作符为~。该操作为单目操作,即只有一个操...
单片机 ,什么是串行口,什么是并行口? - 懂得时钟周期传送二进制1位,要传送一个字节至少需要8个时钟周期,串行线根数少,远程传输抗干扰能力强,成本低。两种接口都是用来传送二进制数据的接口形...
单片机 MCS-51汇编语言中的ACC.7,OV,比如执行X-Y后:如果ACC.7...[最佳回答]ACC就是A,是8位累加器,要具体对A上的每一位操作的时候,就要用ACC.*.ACC.7就是ACC的第七位,比如说A的值是11011010,那么ACC.7就等于1(第七位就是左数...
请高手指教一下, 单片机 烧坏有哪些什么原因/?>?电源.还有工作的环境.这些设备很多是用在高温或有粉尘的环境下.其次就是质量的问题了.电源.还有工作的环境.这些设备很多是用在高温或有粉尘的环境下.其...
单片机 for语句可以直接跳出吗?在单片机编程中,for循环和其他类型的循环(如while循环)通常不会提供像传统高级语言中的break语句那样的直接跳出功能。如果你需要提前结束循环,你需要使...
最便宜的 单片机 能便宜到什么程度?我用过最便宜的单片机是台湾芯睿的处理器MK6A12A。SOP-8封装,1kOTPROM,48RAM,不带A/D。用来做一些低端的小家电,比如实现某个产品的功能,检测到振动以...
单片机 为什么还在用C语言编程?答案是:C语言是最适合单片机编程的高级语言。这个问题的意思应该是:现在有很多很好用的高级语言,如java,python,VC等等,为...单片机为什么还在用C语言编程?答案...
用五一 单片机 控制led灯亮两秒灭一秒程序编写?voiddelay1s(){unsignedchari,j,k;for(i=10;i>0;i--)for(k=200;k>0;k--)for(j=250;j>0;j--...
51 单片机 ,按键控制流水灯程序,懂的进!八个LED灯与 单片机 P1口...[最佳回答]假如,你的程序在执行key_scan();是触发了两次中断导致num>20,你的显示函数将永远被跳过,你应该写成if(num>20)��{���num=0;���display();�.....
51 单片机 一键控制一个LED,每按一下按钮LED闪烁一种频率,共闪...sfdfdf11#include