C51编程9-数码管(显示)

最新更新时间:2022-06-23来源: eefocus关键字:C51  编程 手机看文章 扫描二维码
随时随地手机看文章

根据项目需求可以用I/O外部上拉,用来驱动数码管;也可以74HC138(38译码器)+74HC245(8路信号收发器)驱动数码管。本文会以后者为数码管驱动电路,在代码上实现数码管的显示。


驱动电路:

电路讲解:


1)数码管元件采用共阴数码管,如果需要某位数码管被点亮,位选引脚需要被拉成电平;   


2)八个数码管有8个位选引脚,8个段选引脚。为了将节省I/O口,使用74HC138将3位(CBA)选择,转换为8位二值代码,例如CBA值为000时,Y0输出低电平,其余为高电平,由于Y0连接到数码1位选引脚(图中的LED1网络标号),数码管1被选中。

3)74HC138控制的是位选引脚,而74HC245控制的是段选引脚,增强驱动能力。电路原理图中将DIR接高电平,OE接GND,使得其工作状态为An输入Bn输出。当P0输出0x00时,Bn端也会输出0x00;

代码实现:

1)数码管显示数值,有对应的编码(编码对应段选被点亮或不亮);


2)数码管编码按照一定的关系(一般为顺序0~F),存储在一维数组里面;


3)74HC245收发器,主要用来驱动数码管,根据数码管显示可以看做P0数据直接到达数码管;


4)调用一维数的元素,将编码值通过I/O口输出,控制段选信号,显示对应数值;


5)数字选择数码管,数字转换为38译码器的3路输入信号,选中某个数码管显示。


实现数码管显示函数:


void showsmg(uchar selsmg,uchar num){

  //选择显示数码管第几个,拆解为38译码器对应编码

  smg0 = selsmg&0x01;

  smg1 = (bit)((selsmg>>1)&0x01);

  smg2 = (bit)((selsmg>>2)&0x01);

  //将数码管编码(一维数组)赋值给P0口,显示对用数字

  P0 = table[num];

}

    

具体显示代码:


功能:8个(7~0)数码管,从高到底显示7~0;


/********************************************************************************

* @File name: main.c

* @Author: AdamChen

* @Version: 1.1

* @Date: 2020-08-07

* @Description: LED display 

* @contact:975805363@qq.com

********************************************************************************/

#include "reg52.h"

typedef unsigned char uchar;

typedef unsigned int uint;

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x80};

sbit smg2 = P2^4;

sbit smg1 = P2^3;

sbit smg0 = P2^2;

/*******************************************************

* Function name :delay

* Description        : 延时函数

* Parameter         :

  @ms        millisecond(毫秒)    

* Return          :None 

**********************************************************/

void delay(unsigned int ms) // ms代表需要延时的毫秒数

{

  uint x,y;

  for(x=ms;x>0;x--)

  for(y=110;y>0;y--);

}

/*******************************************************

*

* Function name :showsmg

* Description        : 数码管显示

* Parameter         :

  @selsmg      选择数码管第几个

  @num      显示数值

*        

* Return          :None 

**********************************************************/

void showsmg(uchar selsmg,uchar num){

  //选择显示数码管第几个,拆解为38译码器对应编码

  smg0 = selsmg&0x01;

  smg1 = (bit)((selsmg>>1)&0x01);

  smg2 = (bit)((selsmg>>2)&0x01);

  //将数码管编码(一维数组)赋值给P0口,显示对用数字

  P0 = table[num];

}

/*******************************************************

*

* Function name :main

* Description        : 8数码管,从高到低显示7到0。

* Parameter         :None

* Return          :None 

**********************************************************/

void main(){

  uchar i;

  while(1){

  //循环选中,8个数码管,显示7~0

    for(i=0;i<8;i++)

    {

     showsmg(i,i);

      delay(1);

    }         

  }

}

关键字:C51  编程 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic614505.html

上一篇:C51编程8-数码管(工作原理2)
下一篇:C51编程10-I/O口综合练习

推荐阅读

C51语言中断函数结构,C51中断函数的写法
1、一、中断允许控制CPU 对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE 控制的。EX0(IE.0),外部中断 0 允许位;ET0(IE.1),定时/计数器 T0 中断允许位;EX1(IE.2),外部中断 0 允许位;ET1(IE.3),定时/计数器 T1 中断允许位;ES(IE.4),串行口中断允许位;EA (IE.7), CPU 中断允许(总允许)位。80C51 单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD 用于设置其工作方式;TCON 用于控制其启动和中断申请。一、工作方式寄存器 TMOD工作方式寄存器 TMOD 用于设置定时/计数器的工作方式,低四位用于。2、 T0,高四位用于 T1。其格
发表于 2022-07-01
C51最小单片机系统
1.芯片部分其中P1是给烧写器留的接口,J3和J4是留的排插,用于拓展模块,比如万年历,温度照度传感器,语音播报等。2.独立键盘部分这里参考我的STC12C5A60S2的数据手册,P0口已经有内部上拉电阻,所以外部不需要再接电阻,直接接地。3.稳压电路9V直流进5V直流出4.蜂鸣器部分选用封装时候注意8550和8050的一三脚别搞错 选TO-220封装。5.LED部分只留了两个灯,足够用,不够的可以用其他空的IO口照着这个画。电阻560欧姆灯的亮度会比较亮,可以选更大的阻值 10K 20K都可。6.晶振部分选用11.0592M的晶振,这个频率的晶振用于串口通信合适,波特率误差最小。7.复位按键部分C3是电解电容,有正负,耐压最好在2
发表于 2022-07-01
<font color='red'>C51</font>最小单片机系统
C51 DS1302芯片+lcd12864 显示时间
1.原理图1302芯片部分lcd12864部分2.代码部分config.h#ifndef __CONFIG_H#define __CONFIG_H#include <reg51.h>#include "lcd12864.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned int#endiflcd12864.c#include"lcd12864.h" void lcdinit(void) //初始化LCD{ write(0,0x30); //功能设定 write(0,0x0c
发表于 2022-07-01
<font color='red'>C51</font> DS1302芯片+lcd12864 显示时间
C51单片机 写一个外部中断(入门单片机)
代码部分void main(){ /*---------------EA,IT,EX必须写-------------*/ EA=1; //开启总中断 IT1=1; //中断触发模式 //=0为低电平触发,=1为下降沿触发 EX1=1; //外部中断允许位 while(1) { led1=0; }}void int1() interrupt 0{ led=~led1;}解释:1.外部中断(按键中断)最最重要的部分就是EA,IT,EX三条语句,这三条是必不可少的。2.EA是中断总开关,类似家里电闸的总闸,总闸下面有外部中断,内部中断,串口中断,AD中断等,相当于家里各个房间的分闸,EA=1就是把总闸
发表于 2022-07-01
<font color='red'>C51</font>单片机 写一个外部中断(入门单片机)
对于c51外部中断和程序调用的理解
首先介绍一下C51外部中断的基本概念中断的优点:1、实时处理。需要CPU立即做出相应或处理。2、异常处理。运行过程中,出现断电、程序出错等问题,就需要CPU对故障源进行处理。3、提高效率。采用中断技术可以大大提高CPU的运行效率。中断源:C51单片机有5个中断源(2个外部中断、2个定时器中断和一个串口中断)。对中断的配置操作,主要通过控制三个寄存器就可以(中断允许寄存器IE)、定时器控制寄存器(TCON)和中断优先级寄存器(IP)。即通过控制EA EX IT 的直接赋值,即可调用中断服务程序注:中断服务程序与while(1)中的程序调用是不一样的中断服务函数:在CPU接收到中断后,会执行相应中断的中断服务函数。而C51的中断服务函数
发表于 2022-06-29
对于<font color='red'>c51</font>外部中断和程序调用的理解
C51单片机的外部中断设计1s定时器
51单片机给我们提供了2个计时器中断,分别是计时器0和计时器1,他们对应的优先级分别是1和3,开启计时器并允许其中断后,计时器会从给定的初始值开始,每个指令周期加1,直到加到65535,再加一时计时器溢出,计时器此时会进入中断,并执行中断服务函数。虽然书上讲的很清楚了,但实际使用还是有些许差别,我自己是这样理解的65536-50000的由来假设我使用的单片机的晶振为12MHZ,其机器周期是1us,即每1us产生一次计数如果设计一个1s的定时器,理论上是需要1*10^6个机器周期,但定时器T0只能对机器周期能进行最大65536次计数,很明显已经超过了,并不能直接采用T0的默认值转下思维模式,取个65535之内的整数值,经过简单倍数关系
发表于 2022-06-29
用<font color='red'>C51</font>单片机的外部中断设计1s定时器
小广播
实战 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved