51单片机-同时显示不同的数字

发布者:SparklingSun最新更新时间:2021-08-18 来源: eefocus关键字:51单片机  数码管 手机看文章 扫描二维码
随时随地手机看文章

在上一讲的代码中几个数码管只能同时显示相同的数字和字母,这一讲我们实现同时3个数码管点亮但每个数码管显示的数字都不一样,所以我们做一个用来显示一个变量一秒后自加1的显示效果。

例如,此时时间过去了162秒

2.png

1.取余


先定义一个8位的变量Second,最多能计到255秒,所以我们只用到3个数码管而已,这3个数码管的显示只能显示0~9。


这里我们首先来了解一下取余。


162%10=2;


(162/10)%10=6;


(162/100)%10=1;


大家要知道Second是unsigned char无符号整型变量,比如当Second等于169时,(Second/10)是等于16的,后面的小数直接舍去,就算小数是9也照样舍去,没有四舍五入的说法。


到这里我们也就不难理解,当Second为162时,分别让3个数码管显示各自的位数,数码管2显示百位数1,数码管1显示十位数6,数码管0显示个位数2。


2.代码分析


首先要同时点亮3个数码管就必须让三八译码器的IO0~IO2轮流快速输出低电平,然后在数码管0被点亮的瞬间之后P0被赋值为LedChar[Second%10],这样数码管0就显示了这个变量的个位数。


然后又到了数码管1被点亮,马上P0被赋值为LedChar[(Second/10)%10],数码管1显示了这个变量的十位数。


接着就是到了数码管2被点亮,马上P0被赋值为LedChar[(Second/100)%10],数码管2显示了这个变量的百位数。


大家要有一个意识,那就是随着每次IO0,IO1,IO2输出低电平之后的瞬间,P0都会改变它8个IO端口输出状态以显示不同的数字。


3.代码


#include  

sbit ADDR2 = P1^2;

sbit ADDR1 = P1^1;

sbit ADDR0 = P1^0;

sbit ENLED = P1^4;

sbit ADDR3 = P1^3;

 

unsigned char code LedChar[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//数码管状态值初始化

 

void main()

{  

    unsigned int i=0,x;

    unsigned char Second=0;//定义一个一秒之后自增1的变量

    ADDR3 = 1;//使能三八译码器

    ENLED = 0;// 

   

    while(1)

    {    

        for(x=0;x<20627;x++)//软件调试得出这个循环耗时1秒

        { 

            P0=0xFF;//P0端口状态全部熄灭数码管里的LED达到刷新作用

            switch(i)

            {

                case 0:

                ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;P0=LedChar[Second%10];       i++;break;

       

                case 1:

                ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;P0=LedChar[(Second/10)%10];  i++;break;     

       

                case 2:

                ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;P0=LedChar[(Second/100)%10]; i=0;break;  

            }  

        } 

        Second++;//一秒之后变量自加1 

    }

}


4.代码实现原理


我们知道for循环的持续时间为1秒,我们拆开代码分析就像这样


第一次for循环执行的内容为


P0=0xFF;

ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;P0=LedChar[Second%10];i++;

第二次for循环执行的内容为


P0=0xFF;

ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;P0=LedChar[(Second/10)%10];i++;

第三次for循环执行的内容为


P0=0xFF;

ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;P0=LedChar[(Second/100)%10];i=0;

一直循环下去,也就达到了三八译码器IO0~IO2轮流快速地切换输出低电平了,也就做到同时点亮的作用,直到for循环持续的时间结束就“Second++;”但这条语句执行地很快于是又重新for循环了,但是Second却改变了数字,LedChar[Second%10]也就不是之前的状态值了。


关键字:51单片机  数码管 引用地址:51单片机-同时显示不同的数字

上一篇:51单片机-多个数码管显示
下一篇:51单片机-高位不显示0

推荐阅读最新更新时间:2024-11-17 10:23

关于51单片机的地址空间溢出以及解决方法的个人看法(proteus无法仿真)
在51单片机程序编写中,当变量过多而且数据类型过大的话,容易在编译的时候出现以下的问题,具体表现为: *** ERROR L107: ADDRESS SPACE OVERFLOW SPACE: DATA SEGMENT: _DATA_GROUP_ LENGTH: 0019H Program Size: data=130.0 xdata=7 code=3267 Target not created. 这样子也就是所谓的编译失败,不能生成HEX文件,更加无法烧写到程序中去,那么如何解决这个问题呢,我在网上找到了解法,网上的具体步骤如下: 1.先点击这个图标 2.在其中的memory model 将small改成
[单片机]
关于<font color='red'>51单片机</font>的地址空间溢出以及解决方法的个人看法(proteus无法仿真)
51单片机学习(二)74HC595模块实现点阵屏
引言: 74HC595是一个实现串行转并行功能的芯片,这也是我们51单片机学习接触到的第一个通过控制时序线完成数据输入输出的芯片,这样的芯片在以后会遇到很多,像是完成数据存储的EEPROM需要用到的I2C协议,还有完成计时功能的时钟DS1302,他们在与主机进行交互时必然需要数据的输入和读取,所以我们在输入读取时就需要控制几根由引脚控制的总线,通过控制这些总线的电平变化,我们就可以完成数据输入和读取。这些都是我自己的理解,有错误的地方希望可以得到指正。 在此之前我先讲一下在学习这些模块中需要理解的一些知识: 总线:一般的我们会有几根时钟线,其中一根数据时钟线负责暂时存放一位数据,一根输入时钟线能将数据时钟线的数据发送到
[单片机]
<font color='red'>51单片机</font>学习(二)74HC595模块实现点阵屏
mcs51单片机加法指令(4条)有例子
算术运算 指令 共有24条,算术运算主要是执行加、减、乘、除法四则运算。另外MCS-51指令系统中有相当一部分是进行加、减1操作,BCD码的运算和调整,我们都归类为运算指令。虽然MCS-51单片机的算术逻辑单元ALU仅能对8位无符号整数进行运算,但利用进位标志C,则可进行多字节无符号整数的运算。同时利用溢出标志,还可以对带符号数进行补码运算。需要指出的是,除加、减1指令外,这类指令大多数都会对PSW(程序状态字)有影响。这在使用中应特别注意。 . 加法指令(4条) 这4条指令的作用是把立即数,直接地址、工作寄存器及间接地址内容与累加器A的内容相加,运算结果存在A中。 ADD A,#data ;(A)+#data→(A) 累加器
[单片机]
自动定量水温控制器设计方案
  1.方案的总体设计与论证   1.1 液位传感器的选择   自制传感器是利用金属导体与水本身的导电特性而制成的。它可以认为的将它防止任何位置都能采集到数据,不存在盲区的问题,而且非常利于对装置的扩展。并且成本比较低。   1.2 温度传感器的选择   DS18B20是把温度信号直接转化成串行的数字信号的一种传感器,并且它的电源和数据线可以直接与单片机的电源及单片机的I/O口相连,使用方便,并且成本比较低。   1.3 水泵与电磁阀比较与选择   对于水泵的选择,由于装置容积较小,要求精度较高,所以采用功率相对较低,既可进行变压变速调节,又可以实现微调的直流水泵。另外,电磁阀的选择与直流水泵一致,同样选择直流控制,
[单片机]
自动定量水温控制器设计方案
单片机之利用按键来使数码管上两位示数增加
#include reg52.h #include ./delay/delay.h sbit seg_select = P2^1; sbit bit_select = P2^0; sbit key1 = P1^0; #define SEGPORT P0 unsigned char segdata = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char bitdata = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char TempData ; void displ
[单片机]
51单片机-矩阵键盘模块-长短按键&数码管显示-编程模板
1.视频 bilibili视频地址: https://www.bilibili.com/video/av90715834 51单片机-矩阵键盘模块-长短按键&数码管显示-模块化编程模版 2.文件 代码文件下载地址: https://download.csdn.net/download/weixin_43130546/12180191 3.说明 此段代码体现了模块化编程思想,具有很好的可移植性。 用到的知识点包括:矩阵键盘扫描,长短按键,按键动作识别;数码管动态扫描,数码管高位不显示;LED;BUZZER;片内片外RAM。 89C52: 有 8K FLASH(存程序.hex文件的地方 ); 有512BRA
[单片机]
c51单片机中断函数
以串口中断为例: 如: void serial() interrupt 4 { } 和 void serial_uart() interrupt 4 { } 两个函数的功能都是定义串口中断函数。函数名字不一样不重要,重要的是函数名字后面的interrupt 4(中断向量表地址)要正确。
[单片机]
图形点阵式液晶显示模块与51单片机的接口设计
引 言 液晶作为一种显示器件,以其特有的优势正广泛应用于仪器、仪表、电子设备等低功耗产品中。以往的测控仪器的显示部分大都采用LED式液晶显示屏进行参数设定和结果显示,其显示信息量少、形式单一、人机交互性差、操作人员要求较高。而液晶显示器(LCD)具有功耗低、体积小、质量轻、超薄和可编程驱动等其他显示方式无法比拟的优点,不仅可以显示数字、字符,还可以显示各种图形、曲线、及汉字,并且可实现屏幕上下左右滚动、动画、闪烁、文本特征显示等功能;人机界面更加友好,使用操作也更加灵活、方便,使其日益成为智能仪器仪表和测试设备的首选显示器件。本文在介绍以ST7920为驱动器的WGM-12832液晶显示模块的引脚、结构、功能的基础上,详述了与AT
[应用]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved