51单片机-数码管

合集下载

手把手教学51单片机 - 第四节 动态数码管,用6位数码管做一个时钟

手把手教学51单片机 - 第四节 动态数码管,用6位数码管做一个时钟

手把手教学51单片机| 第四节动态数码管,用6位数码管做一个时钟1.利用定时器做一个流水灯的程序//流水灯从上到下一次点亮,然后让全部灯闪烁两次,依次循环#include #define uchar unsigned char #define uint unsigned int uchar temp,a;void Time0_delay(); void main() { temp=0xfe; P1=temp; while(1) { Time0_delay(); temp=_crol_(temp,1); P1=temp; if(temp==0x7f) { for(a=0;a#define uchar unsigned char #define uint unsigned int uint n; uint sec, min, hour; sbit dula=P2^6; sbit wela=P2^7;uchar code table_dula[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f};uint time[6]={0,0,0,0,0,0}; void reset()//初始化函数{ sec=0;//自定义时间min=0; hour=0; TMOD=0x01; EA=1; ET0=1; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1; }void delay(uint z) { uchar x,y; for(x=z;x>0;x--) for(y=50;y>0;y--); }void main() { reset(); while(1) { //h 十位dula=1; P0=table_dula[time[0]]; dula=0; P0=0xff; wela=1; P0=0xfe; wela=0; delay(1); //h 个位dula=1; P0=table_dula[time[1]]; dula=0; P0=0xff; wela=1; P0=0xfd; wela=0; delay(1); //min 十位dula=1; P0=table_dula[time[2]]; dula=0; P0=0xff; wela=1; P0=0xfb; wela=0; delay(1); //min 个位dula=1; P0=table_dula[time[3]]; dula=0; P0=0xff; wela=1; P0=0xf7; wela=0; delay(1); //sec 十位dula=1; P0=table_dula[time[4]]; dula=0; P0=0xff; wela=1; P0=0xef; wela=0; delay(1); //sec 个位dula=1; P0=table_dula[time[5]]; dula=0; P0=0xff; wela=1; P0=0xdf; wela=0; delay(1); } }void Time_0() interrupt 1 { n++; if(n==20) { n=0; sec++; if(sec==60) { sec=0; min++; if(min==60) { min=0; hour++; if(hour==24) { sec=0;min=0;hour=0; } } } } time[0]=hour/10; time[1]=hour%10; time[2]=min/10; time[3]=min%10; time[4]=sec/10; time[5]=sec%10; TH0=(65536-50000)/256; TL0=(65536-50000)%256; }。

51单片机-八段数码管显示

51单片机-八段数码管显示

实验一八段数码管显示1、实验目的:(1)了解数码管动态显示的原理。

(2)了解74LS164扩展端口的方法。

2、实验要求:利用实验仪提供的显示电路,动态显示一行数据.3、实验电路图LED1LED2LED3LED4LED5LED64、实验器材:(1)超想-3000TB综合实验仪 1 台(2)超想3000仿真器 1 台(3)计算机 1 台5、实验连线无 6、实验说明:(1)本实验仪提供了8段码LED 显示电路,学生只要按地址输出相应数据,就可以实现对显示器的控制。

显示共有6位,用动态方式显示。

8段数码管是由8155的PB0、PB1经74LS164“串转并”后输出得到。

6位位码由8155的PA0口输出,经Ua2003反向驱动后,选择相应显示位。

74LS164是串行输入并行输出转换电路,串行输入的数据位由8155的PB0控制,时钟位由8155的PB1控制输出。

写程序时,只要向数据位地址输出数据,然后向时钟位地址输出一高一低两个电平就可以将数据位移到74LS164中,并且实现移位。

向显示位选通地址输出高电平就可以点亮相应的显示位。

本实验仪中数据位输出地址为0e102H ,时钟位输出地址为0e102H ,位选通输出地址为 0e101H 。

本实验涉及到了8155 I0/RAM 扩展芯片的工作原理以及74LS164器件的工作原理。

(2)七段数码管的字型代码表显示字形g f e d c b a 段码 0 0 1 1 1 1 1 1 3fh 1 0 0 0 0 1 1 0 06h 2 1 0 1 1 0 1 16bh 3 1 0 0 1 1 1 1 4fh 4 1 1 0 0 1 1 0 66h 5 1 1 0 1 1 0 1 6dh 6 1 1 1 1 1 0 1 7dh 7 0 0 0 0 1 1 1 07h 8 1 1 1 1 1 1 1 7fh 9 1 1 0 1 1 1 1 6fh A 1 1 1 0 1 1 1 77h B 1 1 1 1 1 0 0 7ch C 0 1 1 1 0 0 1 39h D 1 0 1 1 1 1 05ehE 1 1 1 1 0 0 1 79h F1111 71hab c def g dp7、程序框图8、实验步骤1.将KEIL仿真器上40芯排线一端和实验箱上51CPU板上的40芯排针连接起来,将仿真器连接的USB或串口线与PC机对应的USB或串口连接起来,打开实验箱电源。

51单片机键盘数码管显示(带程序)

51单片机键盘数码管显示(带程序)

期中大作业学院:物理与电子信息工程学院课题:【利用8255和51单片机实现数码管显示按键数值的程序】要求:【4*4矩阵键盘,按0到15,数码管上分别显示0~9,A~F】芯片资料:8255:8255是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O口。

具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。

其各口功能可由软件选择,使用灵活,通用性强。

8255可作为单片机与多种外设连接时的中间接口电路。

8255作为主机与外设的连接芯片,必须提供与主机相连的3个总线接口,即数据线、地址线、控制线接口。

同时必须具有与外设连接的接口A、B、C口。

由于8255可编程,所以必须具有逻辑控制部分,因而8255内部结构分为3个部分:与CPU连接部分、与外设连接部分、控制部分。

8255特性:1.一个并行输入/输出的LSI芯片,多功能的I/O器件,可作为CPU总线与外围的接口。

2.具有24个可编程设置的I/O口,即3组8位的I/O口,分别为PA口、PB口和PC 口。

它们又可分为两组12位的I/O口:A组包括A口及C口(高4位,PC4~PC7),B组包括B口及C口(低4位,PC0~PC3)。

A组可设置为基本的I/O口,闪控(STROBE)的I/O闪控式,双向I/O三种模式;B组只能设置为基本I/O或闪控式I/O两种模式,而这些操作模式完全由控制寄存器的控制字决定.引脚说明RESET:复位输入线,当该输入端处于高电平时,所有内部寄存器(包括控制寄存器)均被清除,所有I/O口均被置成输入方式。

CS:芯片选择信号线,当这个输入引脚为低电平时,即CS=0时,表示芯片被选中,允许8255与CPU进行通讯;CS=1时,8255无法与CPU做数据传输。

RD:读信号线,当这个输入引脚为低电平时,即CS=0且RD=0时,允许8255通过数据总线向CPU发送数据或状态信息,即CPU从8255读取信息或数据。

WR:写入信号,当这个输入引脚为低电平时,即CS=0且WR=0时,允许CPU将数据或控制字写入8255。

51单片机数码管显示程序设计

51单片机数码管显示程序设计

练习3主程序参考:
ORG 0000H LJMP START ORG 000BH LJMP T0SERV ;T0中断入口 ORG 0030H START: MOV SP,#50H ;初始化堆栈 LCALL INIT ;初始化 MOV DISBUF,#0 MOV DISBUF+1,#1 MOV DISBUF+2,#2 MOV DISBUF+3,#3 MOV DISBUF+4,#4 MOV DISBUF+5,#0 MOV FLASH,#11000000B MOV R0,#0 LOOP: MOV DISBUF+5,R0 LCALL DELAY INC R0 CJNE R0,#10,LOOP MOV R0,#0 AJMP LOOP
恢复现场
返回
动态显示参考程序1:定义变量
;--------------------------------------------------------;动态显示程序 ;--------------------------------------------------------;全局变量定义 FLAG EQU 20H ;标志位 DISSEG EQU P0 ;显示段驱动 DISBIT EQU P2 ;显示位驱动P2.7-P2.2 DISBUF EQU 21H ;显示缓冲区首地址21H-26H DISBITBUF EQU 27H ;当前显示位计数器0-5 FLASH EQU 28H ;闪烁控制xxxxxx00,将x=1闪烁,=0不闪 ;小数点的处理: ;若显示‘3’,缓冲区放‘3’,若显示‘3.’,缓冲区放‘3+80H’, 最高位为1 S_PULSE EQU FLAG.0 ;秒脉冲 CNT_2D5MS EQU 2FH ;2.5MS计数器 CNT_10MS1 EQU 30H ;10MS计数器 CN_0D5S EQU 31H ;0.5秒计数器 ;----------------------------------------------------------

51单片机数码管段码共阴极_理论说明

51单片机数码管段码共阴极_理论说明

51单片机数码管段码共阴极理论说明1. 引言1.1 概述本篇文章主要介绍了数字电子技术中常用的一种显示器件——数码管,特别是51单片机控制下的共阴极数码管。

通过理论说明和实验分析,将详细探讨其原理和应用。

1.2 文章结构文章共分为五个部分进行阐述。

首先是引言部分,概述了本文所要探讨的内容,并对文章结构进行简要介绍。

接下来是正文部分,详细描述了该类型数码管的特点和工作原理。

随后的理论说明部分,进一步介绍了51单片机的基本概念以及数码管段码共阴极原理,并附上示例电路图进行解释。

然后是实验步骤和结果分析,展示了具体的实验操作步骤以及实验结果的详细分析。

最后是结论部分,对整个文章进行总结,并指出该技术在实际应用中的意义和前景。

1.3 目的本文旨在向读者全面介绍51单片机数码管段码共阴极的原理与应用,为读者提供一个深入了解该技术并能够自行实现相关功能的基础知识框架。

通过详细的理论说明和实验分析,希望读者能够对数码管段码共阴极有更深入的认识,并能够在项目设计或实践中灵活运用。

2. 正文本文主要介绍了51单片机数码管段码共阴极的理论知识和原理说明。

在正文部分,将重点讲解51单片机简介、数码管段码共阴极原理以及原理说明与示例电路图。

2.1 51单片机简介51单片机,全称为Intel公司推出的8051系列单片机,是一种非常常用且广泛应用于嵌入式系统开发中的微控制器。

它具有低功耗、成本低廉、易于编程以及丰富的外设资源等特点,被广泛应用于工业控制、家电控制和智能仪器等领域。

2.2 数码管段码共阴极原理数码管是一种可以显示数字和部分字母字符的输出装置,其中段码共阴极是一种常见的类型。

在该类型的数码管中,每个数字或字符都由多个LED组成,而且这些LED都采用共阴极方式连接。

当需要显示某个数字或字符时,只需提供所需数字或字符对应的LED端口高电平信号即可。

2.3 原理说明与示例电路图为了更好地理解数码管段码共阴极原理,下面我们将给出一个示例电路图。

51单片机(四位数码管的显示)程序

51单片机(四位数码管的显示)程序

51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。

最佳答案下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#include<at89x52.h>unsigned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码unsigned char k; //设置全局变量k 为键盘的键值/************************************键盘延时函数****************************/void key_delay(void) //延时函数{int t;for(t=0;t<500;t++);}/************************************键盘扫描函数******************************/void keyscan(void) //键盘扫描函数{unsigned char a;P2 = 0xf0; //键盘初始化if(P2!=0xf0) //有键按下?{key_delay(); //延时if(P2!=0xf0) //确认真的有键按下?{P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平key_delay();a = P2; //a作为缓存switch (a) //开始执行行列扫描{case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平a = P2;switch (a){case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}}}break;}}}}/****************************** ***主函数*************************************/ void main(void){while(1){keyscan(); //调用键盘扫描函数switch(k) //查找按键对应的数码管显示代码{case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case 10:P0=Dig[10];break;case 11:P0=Dig[11];break;case 12:P0=Dig[12];break;case 13:P0=Dig[13];break;case 14:P0=Dig[14];break;case 15:P0=Dig[15];break;default:break; //退出}}}/**********************************end***************************************/。

51单片机第四节数码管

51单片机第四节数码管

51单⽚机第四节数码管本笔记默认学习者已拥有:1.Keil5和stc 烧写⼯具 等各种软件、驱动、环境;2.有⼀个属于⾃⼰的 51单⽚机开发板及相关零件 ;3.认识C 语⾔的语法;本⼈使⽤的51开发板为 郭天祥C51 TX-1C 增强版开发板 ;本笔记根据B 站up 主:江科⼤⾃化协的教学视频 整理得到ヾ(•ω•)4-1 静态数码管显⽰上图为TX-1C 的 数码管及LED 模块 原理图138译码器和74HC245 都是⽤来控制 数码管显⽰ 的;单数码管1.上图为 ⼀位数码管,数码管有两种连接⽅式(对应 右边上下两幅图);2.右上图的原理图,8个LED的阴极都连在⼀个引脚上,称为共阴极连接;3.右下图的原理图,8个LED的阳极都连在⼀个引脚上,称为共阳极连接;TX-1C 开发板的连接⽅式是 共阴极连接;4.左下⾓的 左边图⽚ ,定义了8个LED的名称;5.左下⾓的 右边图⽚ ,定义了引脚的名称,与右图的引脚名称⼀⼀对应假设数码管连接⽅式为 共阳极连接,观察可以发现,数码管中的 LED 的引脚引出,使⽤的是就近原则;假设数码管连接⽅式为 共阴极连接,如果上数码管显⽰ 数字6 ?1.要让数码管显⽰ 数字6,让要 LED-A、C、D、E、F、G亮起;2.共阴极的公共端 要接地(给数据‘0’,或者是低电平);3.阳极(称为位选端)根据LED的亮灭需求给 数据0或1(1亮、0灭) ,称为 段码(阳码) (1011 1110 即为段码);如果 共阳极连接,共阳极端 要接到 VCC (⾼电平),阴极给 数据0或1 (1灭,0亮),称为 段码(阴码),和共阴极正好是相反关系;共阳极连接→共阳极端接VCC 并选中→阴极(位选端)传递(阴码)段码(1亮、0灭)→数码管显⽰共阴极连接→共阴极端接GND 并选中→阳极(位选端)传递(阳码)段码(1灭、0亮)→数码管显⽰四位⼀体数码管开发板上即为 四位⼀体的数码管,且有两个,正好组成了 ⼋位数码管;⽽TX-1C 上 包含的是六位数码管,⽽⾮⼋位;1.四位数码管 也有 两种连接⽅式,即 共阴极连接 和 共阳极连接 ;{Processing math: 100%2.四位数码管,(每位的公共端 单独引出来,位选端全部连在⼀起(所有A段连在⼀起、所有B段连在⼀起……),总共有12个引脚;假设数码管连接⽅式为共阴极连接,如何在第三位显⽰数字1 ?1.给第三位的公共端 赋值 0(低电平),给其他位的公共端 赋值 1(⾼电平);这样等同于 其他位的公共端(负极)接到了正极上,⽆论如何都亮不了;只有第三位能亮;2.这样给 LED-B、C 的位选端 赋值 1,其他 位选端 赋值0共阳极连接即为公共端赋值 1(⾼电平)亮,其他以此类推;3.发现这样⼀个现象,数码管⽆法在同⼀时间显⽰多个数字,其在同⼀时刻下只能有⼀个显⽰,只有⼀个数码管能被点亮,即使有多个被选中的数码管,显⽰的数字也是相同的;这种共⽤引脚的现象,是为了减少控制数码管IO⼝;(四位数码管有32个LED,如果都采⽤共阴极连接的⽅式,也要32+1(公共端)=33个引脚;)(采⽤这种链接,就只需要12个引脚即可控制四位数码管;)如何让数码管多位显⽰不同数字(动态数码管显⽰)?1.利⽤ ⼈眼视觉的暂留 和 数码管显⽰的余辉 的原理先让第⼀位数码管显⽰1,然后很快地让第⼆位数码管显⽰2,再很快地让第三位数码管显⽰3,让它不断地扫描,重复显⽰1、2、3的过程,这样三个数字就“同时”显⽰了;原理分析138译码器1.观察到 原理图右图 与数码管有关的,有138译码器(74LS138)和74HC245两枚芯⽚;TX-1C的原理图为左图,也有两个74HC573芯⽚与数码管有关;芯⽚名称与功耗、电压、说明符号有关,具体内容不做分析;2.如图,数码管连接⽅式为 共阴极连接,这样传输数据,就能让第三位显⽰ 数字1 了;3.⽽上⾯的 LED1 ~ 8,其实接在了138译码器的输出端,138译码器正好可以实现让LED1 ~ 8输出 0或1;LED1 ~ 8 对应了 TX-1C 六位数码管的SEG DS 1 ~ 6;4.138译码器可将LED 1 ~ 8的⼋个端⼝ 转化为 由 3个端⼝ (P22、P23、P24)控制,⽽G1、G2A、G2B端⼝ 被 称为 使能端;使能端相当于⼀种开关,如果电平有效,它就可以⼯作;如果电平⽆效,它就不⼯作;观察原理图发现,使能端是已经接好 VCC 和 GND 的,也就是说,其上电其实就会⼯作TX-1C的74HC573也是同理,但其并未压缩控制端⼝的数量;5.138译码器也叫“38线译码器”,是由3个线到8个线,其中C是⾼位、A是低位,CBA组成的数符合8进制,控制着Y0 ~ Y7 这8个端⼝;6.所以,138译码器的作⽤就是⽤来选中某⼀位数码管的74HC2451.74HC245是⼀种 双向数据缓冲器,VDD、GND都可视为电源,OE为使能(其 接地 就⼯作);2.DIR(direction),是⽅向的意思,它接到了VCC(⾼电平)上,将数据从左边输出到右边,从右边将数据读取回左边;DIR若接到低电平上,会将数据从右边输出到左边,从左边将数据读取回右边;3.单⽚机的⾼电平 驱动能⼒有限,其输出的最⼤电流不能太⼤;其低电平 驱动能⼒强;因此,LED模块才采⽤了低电平点亮的模式;4.如果⽤⾼电平 直接点亮 数码管,电流会很⼩,灯会很暗;所以其加⼀个缓冲器,缓冲器可以提⾼ 其驱动能⼒,如果直接将 数据 输出 给 数码管,数据就会被视为 驱动数据;现在增加了缓冲器,数据 就变成了 控制信号,控制信号 只需要很微弱,缓冲器 就可以接收到,缓冲器再通过⾃⼰接到的电源,输出 数据 到引脚上,这样控制的电流只需要⾮常⼩,就能驱动数码管 以⽐较亮的形式显⽰;2电容 是⽤来 稳定电源的,叫电源滤波;6.图右有 ⼀ 排阻,阻值为100R(即为100Ω),作⽤为 限流电阻 ,防⽌数码管的电流过⼤;TX-1C既没有电容,也没有排阻;原理总结1.⽤ 138译码器 使 数码管 的某⼀位 被选中;2.再给P0⼝⼀个 段码数据;TX-1C虽然⽤P0⼝控制段码输⼊,但也⽤P0⼝控制位选;需要先⽤ P2.6⼝和P2.7⼝控制输⼊数据是段码还是位选;P2.6⼝控制段码的输⼊;P2.7⼝控制位选的输⼊;例,给P2.6 数据1 (⾼电压)、给P2.7 数据 0 (低电压),就可以确定现在给数据是段码;1.由TX-1C的原理图可知,数码管内 LED灯 与 P0端⼝ 的顺序关系:(1)LED的名称定义是通⽤⽆疑的;(2)数码管本⾝的引脚名称不重要,重要的是 LED与哪个 P0 的 引脚 相连;2.由TX-1C的原理图可知, P0.0引脚 控制 数码管的最左位,P0.5引脚控制 数码管的最右位,剩余引脚是没有控制 数码管 位选 的作⽤的,哪个P0 的 引脚 控制 六位数码管的 哪位 很重要;代码实现静态数码管显⽰(让数码管第三位显⽰3).c#include<reg51.h>sbit D=P2^6; //段码⼝sbit W=P2^7; //位选⼝void main(){D=0;W=1;P0=0xFB;//1111 1011W=0;D=1;P0=0x4F;//0100 1111while(1);}下⾯写出了⼀个通⽤函数,可以让数码管在 第⼏个位置 显⽰ 哪个数#include<reg51.h>#define uchar unsigned charsbit D=P2^6;sbit W=P2^7;void NixieTube(uchar wei,uchar duan){ //NixieTube是数码管的英⽂uchar WEI,DUAN; //(Nixie是⼥⽔妖的意思)D=0;W=1;switch(wei){ //位选部分case 1:WEI=0xFE; break;case 2:WEI=0xFD; break;case 3:WEI=0xFB; break;case 4:WEI=0xF7; break;case 5:WEI=0xEF; break;case 6:WEI=0xDF; break;}P0=WEI;W=0;D=1;switch(duan){ //段码部分case 0:DUAN=0x3F; break;case 1:DUAN=0x06; break;case 2:DUAN=0x5B; break;case 3:DUAN=0x4F; break;case 4:DUAN=0x66; break;case 5:DUAN=0x6D; break;case 6:DUAN=0x7D; break;case 7:DUAN=0x07; break;case 8:DUAN=0x7F; break;case 9:DUAN=0x6F; break;case 10:DUAN=0x77; break; //Acase 11:DUAN=0x7F; break; //Bcase 12:DUAN=0x39; break; //Ccase 13:DUAN=0x3F; break; //Dcase 14:DUAN=0x79; break; //Ecase 15:DUAN=0x71; break; //Fcase 16:DUAN=0x80; break; //.}P0=DUAN;}void main(){NixieTube(3,3);while(1);}运⾏结果如下:4-2 动态数码管显⽰1.如果只是单纯让其显⽰完⼀个再显⽰⼀个,代码如下:#include<reg51.h>#define uchar unsigned charsbit D=P2^6;sbit W=P2^7;uchar Nixiewei[]={0,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF};uchar Nixiecode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7F,0x39,0x3F,0x79,0x71,0x80};//将两个switch改进为数组void NixieTube(uchar wei,uchar duan){D=0;W=1;P0=Nixiewei[wei];W=0;D=1;P0=Nixiecode[duan];}void main(){while(1){NixieTube(1,1);NixieTube(2,2);NixieTube(3,3);}}运⾏结果如下:2.这是⼀个数码管的常见问题,称为 数码管的消影 ;位选-->段选-->位选-->段选-->位选-->......在这⼀位的段选(输⼊段码)结束,进⾏下⼀位的位选时,很短的时间内,上⼀位的数据会串到下⼀位数据⾥⾯去;所以我们在段选和位选之间,增加⼀个 P0 清零的操作;动态数码管显⽰(数码管同时显⽰123).c#include<reg51.h>#define uchar unsigned charsbit D=P2^6;sbit W=P2^7;uchar Nixiewei[]={0,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF};uchar Nixiecode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7F,0x39,0x3F,0x79,0x71,0x80};void Delayms(unsigned int x){unsigned int j;for(;x>0;x--) for(j=110;j>0;j--);}void NixieTube(uchar wei,uchar duan){D=0;W=1;P0=Nixiewei[wei];W=0;D=1;P0=Nixiecode[duan];Delayms(1); //让数码管稳定显⽰,⽴刻清零会让数码管显⽰较暗P0=0; //清零操作}void main(){while(1){NixieTube(1,1);NixieTube(2,2);NixieTube(3,3);}}运⾏结果如下:相关知识1.在运⾏某些代码时,TX-1C的LED点阵模块会乱闪2.将左下⾓ DOT-OE旁的跳线帽 拔下来即可 断开LED点阵模块,3.拔下来的跳线帽不要乱丢,可以 只插⼀个脚放在原处,也可以妥善保管在其他地⽅上图即为拔下来的跳线帽1.此元件为电容;2.104的数量规则与 第⼆节 所讲的电容是相同的,其单位是pF1000pF=1nF, 1000nF=1uF, 1000uF=1000mF, 1000mF=1FF 是⼀个很⼤的单位,正常电容都是uF、nF级别的;超级电容能达到1 ~ 2 F,其⼀般作为备⽤电池;3.TX-1C的原理图上,电容的量都是直接⽤单位标记好的。

51单片机hc595控制一位数码管

51单片机hc595控制一位数码管

/*用hc595控制数码管,显示键盘的值*/#include<reg52.h>#define unchar unsigned char#define unint unsigned intunchar temp,num;sbit scl=P3^6;sbit sda=P3^4;sbit rclk=P3^5; //寄存器时钟unchar code table[]={0x40,0xf9,0x24,0x30,0x99,0x12,0x02,0xf8,0x00,0x10,0xbf,0xb9,0xb6,0}; //数码管编码void delay1()//短延时{;;}void delay(int z) //长延时{int a,b;for(a=0;a<110;a++)for(b=0;b<z;b++);}void init()//初始化{scl=1;sda=1;rclk=0;}void start()//开始条件{scl=1;delay1();sda=1;delay1();sda=0;delay1();}void stop()//停止{scl=1;delay1();sda=0;delay1();sda=1;delay1();}void write(unsigned char temp)//写{int i;start();for(i=0;i<8;i++){scl=0;rclk=0;delay1();sda=(bit)(temp&0x80);delay1();scl=1;delay1();delay1();temp<<=1;} rclk=1;stop();}//键盘扫描unchar scan(){// unchar num,temp;// num=17;P2=0xfd;temp=P2;temp=temp&0xf0;while(temp!=0xf0){P2=0xfd;temp=P2;temp=temp&0xf0;delay(10);while(temp!=0xf0){temp=P2;temp=temp&0xf0;switch(temp){case 0xe0:num=1;break;case 0xd0:num=2;break;case 0xb0:num=3;break;case 0x70:num=4;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}// display(num-1);}}P2=0xfb;temp=P2;temp=temp&0xf0;while(temp!=0xf0){P2=0xfb;temp=P2;temp=temp&0xf0;delay(10);while(temp!=0xf0){temp=P2;switch(temp){case 0xeb:num=5;break;case 0xdb:num=6;break;case 0xbb:num=7;break;case 0x7b:num=8;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}//display(num-1);}}P2=0xf7;temp=P2;temp=temp&0xf0;while(temp!=0xf0){P2=0xf7;temp=P2;temp=temp&0xf0;delay(10);while(temp!=0xf0){temp=P2;switch(temp){case 0xe7:num=9;break;case 0xd7:num=10;break;case 0xb7:num=11;break;case 0x77:num=12;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}// display(num-1);//delay(100);}}return num;}/*void display(unchar num) {P0=table[num-1];delay(10);} */void main()//主函数{init();delay1();while(1)//大循环{write(table[scan()]);}}。

51单片机-数码管显示

51单片机-数码管显示
P2=0x00; P0=0x03; delay(400); P0=0x9f; delay(400); P0=0x25; delay(400);
} void delay(int x) {
int i,j; for(i=0;i<x;i++)
for(j=1;j<120;j++); }
LED字型显示代码表
段符号
十六进制代码
显示 dp
g
f
e
d
c
b
a 共阴极 共阳极
0
0
1
0
2
0
3
0
4
0
5
0
6
0
7
0
8
0
9
0
A0
b
0
C0
d
0
E0
F
0
H0
P0
0
1
1
1
1
1
1
3FH
C0H
0
0
0
0
1
1
0
06H
F9H
1
0
1
1
0
1
1
5BH
A4H
1
0
0
1
1
1
1
4FH
B0H
1
1
0
0
1
Hale Waihona Puke 1066H
99H
1
1
0
1
1
0
1
6DH 92H
1
1
1
1
1
0
1
7DH
1. 静态显示的特点
静态显示就是单片机将所要显示的数据送出去后,数码管始终显示 该数据(不变),到下一次显示时,再传送一次新的显示数据。

51单片机共阴极数码管与三极管

51单片机共阴极数码管与三极管

51单片机共阴极数码管与三极管一、引言51单片机是一种广泛应用于嵌入式系统中的微处理器,其性能稳定、功能强大,在各种电子设备中得到了广泛的应用。

而共阴极数码管和三极管作为其外围元器件,在数字显示和电路控制中发挥着重要作用。

二、共阴极数码管的原理和应用1. 共阴极数码管的结构和工作原理共阴极数码管是一种常见的数字显示器件,其内部由多个发光二极管组成。

在工作时,需要通过外部电路控制不同的发光二极管,从而显示出不同的数字和字符。

共阴极数码管中的每个发光二极管都需要接地才能发光,因此在控制时需要将要显示的位置的共阴极接地,同时将对应的阳极高电平,从而实现数字显示的控制。

2. 共阴极数码管的应用共阴极数码管在各种电子仪器仪表中得到了广泛的应用,例如数字时钟、计数器、温度计、电压表等。

其优点是功耗低、寿命长、易控制,可以满足数字显示的需求,因此在数字显示方面有着重要的地位。

三、三极管的原理和应用1. 三极管的结构和工作原理三极管是一种半导体器件,由三个不同掺杂的半导体材料层组成,分别为发射区、基区和集电区。

在工作时,可以通过控制发射区和基区之间的电流来控制集电区的电流,从而实现放大和开关的功能。

三极管可以用作放大器、开关、振荡器等不同的电路元器件,具有广泛的应用。

2. 三极管的应用三极管在各种电子电路中都有着重要的应用,例如放大器电路、振荡电路、开关电路等。

其优点是具有放大效果,可以在不同的电路中实现信号放大和控制,因此被广泛地应用于各种电子设备和系统中。

四、51单片机与共阴极数码管、三极管的关系1. 51单片机的数字输出与共阴极数码管的控制51单片机具有多个通用输入输出引脚,可以通过控制这些引脚的电平来控制外部的各种元器件。

在控制共阴极数码管时,可以通过将对应的共阴极引脚接地,同时将对应的阳极引脚设置为高电平,从而实现对数码管的控制。

2. 51单片机与三极管的驱动和控制51单片机可以通过控制输出引脚的电平来控制三极管的工作。

51单片机数码管显示时钟程序

51单片机数码管显示时钟程序

#include〈reg52.h〉//#include#include<intrins。

h〉#define uchar unsigned char#define uint unsigned intsbit dula=P2^6;sbit wela=P2^7;sbit key1=P3^4;sbit key2=P3^5;sbit key3=P3^6;sbit beep=P2^3;unsigned code table[]={0x3f ,0x06 ,0x5b , 0x4f ,0x66 ,0x6d ,0x7d ,0x07 ,0x7f ,0x6f ,0x77 ,0x7c,0x39 , 0x5e , 0x79 ,0x71};uchar num1,num2,s,s1,m,m1,f,f1,num,numf,nums,dingshi;uchar ns,ns1,nf,nf1,numns,numnf;void delay(uint z);void keyscan ();void keyscan1 ();void alram();void display(uchar m,uchar m1,uchar f,ucharf1,uchars,uchars1); void display0(uchar nf,uchar nf1,uchar ns,uchar ns1);void main(){TMOD=0x01;//设定定时器0工作方式1TH0=(65536—46080)/256 ;TL0=(65536—46080)%256 ;EA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0中断numns=12;numnf=0;while(1){if(dingshi==0){keyscan ();display(m,m1,f,f1,s,s1);alram();}else{keyscan1 ();display0(nf,nf1,ns,ns1);}}}void keyscan (){if(key1==0){delay(10);if(key1==0)nums++;if (nums==24)nums=0;while(!key1);display(m,m1,f,f1,s,s1);}if(key2==0){delay(10);if(key2==0)numf++;if (numf==60)numf=0;while(!key2);display(m,m1,f,f1,s,s1);}if(key3==0){delay(10);if(key3==0){dingshi=~dingshi;while(!key3)display(m,m1,f,f1,s,s1);}}/*if(key4==0){delay(10);if(key4==0){flag=1;while(!key4);display(m,m1,f,f1,s,s1);}}*/}void keyscan1(){if(key1==0){delay(10);if(key1==0)numns++;if (numns==24)numns=0;while(!key1);// display(nf,nf1,ns,ns1);}if(key2==0){delay(10);if(key2==0)numnf++;if (numnf==60)numnf=0;while(!key2);// display(nf,nf1,ns,ns1);}if(key3==0){delay(10);if(key3==0){dingshi=0;while(!key3);// display(m,m1,f,f1,s,s1);}}}void alram(){if((numnf==numf)&&(numns==nums))beep=0;if(((numnf+1==numf)&&(numns==nums))&&(dingshi==0))//一分钟报时提示beep=1;}void display0(uchar nf,uchar nf1,uchar ns,uchar ns1)//闹钟显示函数{nf=numnf%10;nf1=numnf/10;ns=numns%10;ns1=numns/10;/*wela=1;P0=0xc0;//送位选数据wela=0;P0=0xff;*/dula=1;P0=table[ns1];dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delay(1);dula=1;P0=table[ns]|0x80;dula=0;wela=1;P0=0xfd;wela=0;delay(1);dula=1;P0=table[nf1];dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delay(1);dula=1;P0=table[nf];dula=0;P0=0xff;wela=1;P0=0xf7;wela=0;delay(1);}void display(uchar m,uchar m1,uchar f,ucharf1,uchars,uchars1) //时间显示{dula=1;P0=table[m1];//秒位第1位dula=0;P0=0xff;wela=1;P0=0xef;wela=0;delay(1);dula=1;P0=table[m];// 秒位第2位dula=0;P0=0xff;wela=1;wela=0;delay(1);dula=1;P0=table[s1]; //时位第一位dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delay(1);dula=1;P0=table[s]|0x80;dula=0;P0=0xff;wela=1;P0=0xfd;wela=0;delay(1);dula=1;P0=table[f1];//分位第一位dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delay(1);dula=1;P0=table[f]|0x80;dula=0;P0=0xff;wela=1;P0=0xf7;wela=0;delay(1);}void T0_timer() interrupt 1{TH0=(65536—46080)/256 ;TL0=(65536—46080)%256 ;num2++;if(num2==20){num++;num2=0;m=num%10;m1=num/10;f=numf%10;f1=numf/10;s=nums%10;s1=nums/10;if(num==59){num=0;numf++;if(numf==59){numf=0;nums++;}if (nums==24)nums=0;}}}void delay(uint z){uint x,y;for(x=110;x〉0;x—-)for(y=z;y>0;y—-);}。

51单片机 adc0809数码管

51单片机 adc0809数码管

//51单片机控制adc0809读取外部模拟信号(只读取一路,0809上的ABC三个引脚接地,模拟信号由in0接入(0-5v电压),在数码管上显示当前的数值#include<reg51.h>#define uint unsigned int#define uchar unsigned charsbit SMG_b = P1^1; //定义数码管阳级控制脚(百位)sbit SMG_s = P1^2; //定义数码管阳级控制脚(十位)sbit SMG_g = P1^3; //定义数码管阳级控制脚(个位)sbit oe=P3^3;//(以下原来想与p1.4和p1.5相连,但是这连个引脚与蜂鸣器和继电器相连,结果连上之后老是响,我就与p3口相连了)sbit eoc=P3^2;sbit clk=P1^6;//为0809提供时钟sbit st=P1^7;//与0809的ale相连,一起启动a/d转换uchar getdata=0;//转换后得到数据uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极数码管0-9void adc0809();//初始化0809并得到转换数据void delay(void);void display(uchar da);//显示数值void init();////初始化定时器0模式2(主要是为了给0809提供时钟)void main(){uint j;init(); //初始化定时器,为0809提供时钟while(1){ adc0809();//初始化0809j=200;//修改此值可以修改数值在数码管上的刷新速度(数值越大刷新的速度越慢)while(j--)display(getdata);//显示数值}}void init()//初始化定时器0模式2(主要用于给0809提供时钟){TMOD=0x02;//定时器0的模式2TH0=0xfb;//定时5usTL0=0xfb;TR0=1;//启动定时器0ET0=1;//开定时器0中断控制位EA=1;//开总中断}void time0() interrupt 1//定时器0中断{clk=~clk;}void adc0809()//初始化0809并得到转换数据{st=0;//以下三个表达式表示启动ad转换st=1;st=0;while(!eoc);//等待转换结束oe=1;//为高电平时,转换的数据输送个单片机getdata=P2;//从P2引脚读转换后的信息oe=0;}void display(uchar da)//显示数值{SMG_b=0; //选择百位数码管P0=table[(da*2)/100]&0x7f; //获取百位值,查表输出定义好的数码管段值与P0口,显示相应的0-9(&0x7f表示显示小数点)delay(); //延时P0=0XFF; //清除数码管显示,因是共阳型,所以不是0SMG_b=1; //关闭百位数码管SMG_s=0; //选择十位数码管P0=table[(da*2)%100/10]; //获取十位值,查表输出定义好的数码管段值与P0口,显示相应的0-9delay(); //延时P0=0XFF; //清除数码管显示,因是共阳型,所以不是0SMG_s=1; //关闭十位数码管SMG_g=0; //选择个位数码管P0=table[(da*2)%10]; //获取个位值,查表输出定义好的数码管段值与P0口,显示相应的0-9delay(); //延时P0=0XFF; //清除数码管显示,因是共阳型,所以不是0SMG_g=1; //关闭个位数码管}void delay(void){unsigned char i=10;while(i--);}。

51单片机数码管c代码集合

51单片机数码管c代码集合

51单片机:数码管c代码集合/*点亮第一个数码管,因为板子是自已做的,到电子城买数码管时说好要共阴的,拿来测时才发现是共阳的。

*///------------------------------------------------------------/*#include ;#define uchar unsigned charsbit duan=P2^5 ; //注意,有分号sbit wei=P2^6; //注意,有分号+P是大写的,若你写成小写的则会提示说找不到const unsigned chartable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //共阳极数码管数组,请注意,我使用的共阳极的数码管,如果你是用买的现成板,一般是使用共阴极的void main(){duan=1;P0=table[1];duan=0;wei=1;P0=0x01;wei=0;while(1);}*///-----------------------------------------------------------------/*//静态显示,第一个数码管显示1#include ;sbit duan=P2^5;sbit wei=P2^6;void main(){duan=1;P0=0xF9; //共阳极数码管显示1的编码值是F9,如果你是买的开发板(共阴的数码管)则为0x06;duan=0;wei=1;P0=0x01; //选中第1个数码管wei=0;while(1); //一直显示,以便我们观察}*///-----------------------------------------------------------------/*//静态显示,全为1#include ;sbit duan=P2^5;sbit wei=P2^6;void main(){duan=1;P0=0xF9; //共阳极数码管显示1的编码值是F9,如果你是买的开发板(共阴的数码管)则为0x06;duan=0;wei=1;P0=0xff; //选中所有的数码管wei=0;while(1); //一直显示,以便我们观察}*///-----------------------------------------------------------------//静态显示:从0到F (所有的数码管)#include ;#define uchar unsigned charsbit duan=P2^5 ; //注意,有分号+P是大写的,若你写成小写的则会提示说找不到sbit wei=P2^6;const unsigned chartable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //数码管数组void delay(int x){int a,b;for(a=x;a>;0;a--)for(b=110;b>;0;b--);}void main(){while(1){uchar n=0;for(n=0;n;#include ; //LED灯用到移动关键字crol,调用此关键字#define uchar unsigned charconst unsigned chartable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //数码管数组sbit wei=P2^6;sbit duan=P2^5;void delay(uchar x){uchar a,b;for(a=x;a>;0;a--)for(b=110;b>;0;b--);}void LED(){uchar a,temp;temp=0xfe;for (a=8;a>;0;a--) //循环8次,即流水灯8个循环8次即可点亮8个{P1=temp;temp=_crol_(temp,1); //移动delay(200);}delay(5);temp=0x7f;for (a=8;a>;0;a--) //循环8次,即流水灯8个循环8次即可点亮8个{P1=temp;temp=_crol_(temp,-1); //移动delay(170);}}void scan(){uchar n=0;for(n=0;n。

51单片机数码管的程序代码

51单片机数码管的程序代码
for (x=s;x>0;x--) for (y=100;y>0;y--);
}
3.依次流水作业
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit line= P1^3; //点阵
sbit led= P1^2;
duan=1; P0=table[shi]; _nop_();
//显示十位
_nop_(); _nop_(); duan=0; P0=0xff; wei=1; P0=0xFb; wei=0; delay(3);
duan=1; P0=table[ge]; _nop_(); _nop_(); _nop_(); duan=0; P0=0xff; wei=1; P0=0xF7; wei=0; delay(3);
unsigned char code weisn[]=
{
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uint y,s,a,b;
void delay ( uint);
void main ()
{
P0=0X00;
line=0;//关闭点阵
P0=0xff; led=0;//关闭 led
5,DS18B20 温度计程序代码
#include "reg52.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit ds=P1^4; //18B20 信号端口 sbit duan=P1^0; //数码管段码控制端

51单片机(四位数码管的显示)程序

51单片机(四位数码管的显示)程序

51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。

最佳答案下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#include<at89x52.h>unsigned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码unsigned char k; //设置全局变量k 为键盘的键值/************************************键盘延时函数****************************/void key_delay(void) //延时函数{int t;for(t=0;t<500;t++);}/************************************键盘扫描函数******************************/void keyscan(void) //键盘扫描函数{unsigned char a;P2 = 0xf0; //键盘初始化if(P2!=0xf0) //有键按下?{key_delay(); //延时if(P2!=0xf0) //确认真的有键按下?{P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平key_delay();a = P2; //a作为缓存switch (a) //开始执行行列扫描{case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平a = P2;switch (a){case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}}}break;}}}}/****************************** ***主函数*************************************/ void main(void){while(1){keyscan(); //调用键盘扫描函数switch(k) //查找按键对应的数码管显示代码{case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case 10:P0=Dig[10];break;case 11:P0=Dig[11];break;case 12:P0=Dig[12];break;case 13:P0=Dig[13];break;case 14:P0=Dig[14];break;case 15:P0=Dig[15];break;default:break; //退出}}}/**********************************end***************************************/。

51单片机hc595控制一位数码管

51单片机hc595控制一位数码管

/*用hc595控制数码管,显示键盘的值*/#include<reg52.h>#define unchar unsigned char#define unint unsigned intunchar temp,num;sbit scl=P3^6;sbit sda=P3^4;sbit rclk=P3^5; //寄存器时钟unchar code table[]={0x40,0xf9,0x24,0x30,0x99,0x12,0x02,0xf8,0x00,0x10,0xbf,0xb9,0xb6,0}; //数码管编码void delay1()//短延时{;;}void delay(int z) //长延时{int a,b;for(a=0;a<110;a++)for(b=0;b<z;b++);}void init()//初始化{scl=1;sda=1;rclk=0;}void start()//开始条件{scl=1;delay1();sda=1;delay1();sda=0;delay1();}void stop()//停止{scl=1;delay1();sda=0;delay1();sda=1;delay1();}void write(unsigned char temp)//写{int i;start();for(i=0;i<8;i++){scl=0;rclk=0;delay1();sda=(bit)(temp&0x80);delay1();scl=1;delay1();delay1();temp<<=1;} rclk=1;stop();}//键盘扫描unchar scan(){// unchar num,temp;// num=17;P2=0xfd;temp=P2;temp=temp&0xf0;while(temp!=0xf0){P2=0xfd;temp=P2;temp=temp&0xf0;delay(10);while(temp!=0xf0){temp=P2;temp=temp&0xf0;switch(temp){case 0xe0:num=1;break;case 0xd0:num=2;break;case 0xb0:num=3;break;case 0x70:num=4;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}// display(num-1);}}P2=0xfb;temp=P2;temp=temp&0xf0;while(temp!=0xf0){P2=0xfb;temp=P2;temp=temp&0xf0;delay(10);while(temp!=0xf0){temp=P2;switch(temp){case 0xeb:num=5;break;case 0xdb:num=6;break;case 0xbb:num=7;break;case 0x7b:num=8;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}//display(num-1);}}P2=0xf7;temp=P2;temp=temp&0xf0;while(temp!=0xf0){P2=0xf7;temp=P2;temp=temp&0xf0;delay(10);while(temp!=0xf0){temp=P2;switch(temp){case 0xe7:num=9;break;case 0xd7:num=10;break;case 0xb7:num=11;break;case 0x77:num=12;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}// display(num-1);//delay(100);}}return num;}/*void display(unchar num) {P0=table[num-1];delay(10);} */void main()//主函数{init();delay1();while(1)//大循环{write(table[scan()]);}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

51单片机-数码管
共阴极是指所有发光二极管阴极连接在一起,这个共阴极可以用来做片选。

如图,这里有8个发光二极管,到底哪个亮需要进行片选。

段选:8 段数码管
每一段的控制段叫段选位选:就是进行哪个8 段数码管亮的选择TX-1C 使用两
片锁存器74HC573 实现位选和段选这里的D0”7是连在单片机的I/O 口上,当
为高电平时,Q 与D 中的数据一致,遇到负跳变沿时Q 中的数据保持住,D 中
的数据即使变化也不会影响Q。

MCUVersion2 使用的是74HC245 和38 译码器
74HC13874HC245 有一个缓冲和驱动的作用,这样可以使led 显示的更加稳定,
数码管显示分动态显示和静态显示,每个数码管的状态都是被不断更新的,利
用的人的视觉暂留,使看上去数值保持在一个固定的位置上,人的视觉是有延
续性的,当一个东西不断变化时,变化的时间小于人眼的视觉暂留时间的话,
人的眼睛会以为这个东西是连续的。

静态显示是一幅画面放在那看上去是不动
的而它确实是不动的。

动态扫描显示即轮流向各位数码管送出字型码和相应位
选,利用发光管的余晖和视觉暂留作用,使人的感觉好像各位数码管同时都在
显示。

静态显示:数码管从左向右依次点亮: #include <reg52.h>void delay(){
int i,j; for(i = 0; i <0xff; i++) for(j = 0; j <0xff; j++) ;} unsigned int code duan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07};unsigned int code wei[]={ 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff};void main(){ while(1){ int i; P2 = 0x39; for(i = 0; i <8; i++){ P2 = duan[ i]; P1 = wei[ i]; delay(); } } } 想让哪个
数码管亮多少就亮多少:tips:感谢大家的阅读,本文由我司收集整编。

仅供参阅!。

相关文档
最新文档