C51四位数码管动态扫描让其中一位闪烁

合集下载

四位数码管动态扫描

四位数码管动态扫描

数码管学习数码管控制要点:扫描时间不能太短,太短数码管会只显示8,太长就不能看到几个数码管同时亮的感觉,不同的需要会选不同的扫描时间。

举个实例:在proteus里仿真如下,连接电路图。

注意:在proteus里可以不连51的最小系统,但是必须双击单片机在Edit Component设置晶振为12M或其它的。

使用P1口注意其内部没有集成上拉电阻,必须外接10K电阻。

51程序:/*四位数码管动态显示*/#include<reg52.h>#define uint unsigned int#define uchar unsigned charuint num;uchar code table[]={ //共阴数码管0~90x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delayms(uint z){ //延时毫秒函数uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void display(uint date){ //四位数码管显示函数uint a,b,c,d;a=date/1000;P0=0x0E;P2=table[a];delayms(10);b=date%1000/100;P0=0x0d;P2=table[b];delayms(10);c=date%100/10;P0=0x0b;P2=table[c];delayms(10);d=date%10;P0=0x07;P2=table[d];delayms(10);}void main(){ //主函数while(1){if(num==10000)num=0;display(num++);}}。

数码管动态扫描原理及其编程方法

数码管动态扫描原理及其编程方法

字形代码,用来控制显示的字形,称为段码;另一组是位输出口输出的控制信号,用来选择第几位数码管工作,称为位码。

由于各位数码管的段线并联,段码的输出对各位数码管来说都是相同的。

因此,在同一时刻如果各位数码管的位选线都处于选通状态的话,8位数码管将显示相同的字符。

若要各位数码管能够显示出与本位相应的字符,就必须采用扫描显示方式。

即在某一时刻,只让某一位的位选线处于导通状态,而其它各位的位选线处于关闭状态。

同时,段线上输出相应位要显示字符的字型码。

这样在同一时刻,只有选通的那一位显示出字符,而其它各位则是熄灭的,如此循环下去,就可以使各位数码管显示出将要显示的字符。

虽然这些字符是在不同时刻出现的,而且同一时刻,只有一位显示,其它各位熄灭,但由于数码管具有余辉特性和人眼有视觉暂留现象,只要每位数码管显示间隔足够短,给人眼的视觉印象就会是连续稳定地显示。

数码管不同位显示的时间间隔可以通过调整延时程序的延时长短来完成。

数码管显示的时间间隔也能够确定数码管显示时的亮度,若显示的时间间隔长,显示时数码管的亮度将亮些,若显示的时间间隔短,显示时数码管的亮度将暗些。

若显示的时间间隔过长的话,数码管显示时将产生闪烁现象。

所以,在调整显示的时间间隔时,即要考虑到显示时数码管的亮字型 dp g f e d c b a 段码0 1 1 0 0 0 0 0 0 0C0H1 1 1 1 1 1 0 0 1 0F9H2 1 0 1 0 0 1 0 0 0A4H3 1 0 1 1 0 0 0 0 0B0H4 1 0 0 1 1 0 0 1 99H5 1 0 0 1 0 0 1 0 92H6 1 0 0 0 0 0 1 0 82H7 1 1 1 1 1 0 0 0 0F8H8 1 0 0 0 0 0 0 0 80H9 1 0 0 1 0 0 0 0 90Ha 1 0 0 0 1 0 0 0 88Hb 1 0 0 0 0 0 1 1 83Hc 1 1 0 0 0 1 1 0 0C6Hd 1 0 1 0 0 0 0 1 0A1HE 1 0 0 0 0 1 1 0 86Hf 1 0 0 0 1 1 1 0 8EH举例:如果你想让图1最右边的数码管显示“0”的话,首先将段码“0C0H”送达P0口,然后将P2.7清为低电平。

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单片机原理图

51单片机原理图

2.3 51单片机增强型学习系统各组成部份原理图及功能简介2.3.1 共阴极数码管动态扫描控制图2.2 51单片机增强型学习系统的四位共阴极数码管动态扫描硬件连接原理图AT89S51单片机P0口是一组8位漏极开路型双向I/O 口,也即地址/数据总线复用口。

作为输出口用时,每位能驱动8个TTL 逻辑门电路,对端口写“1”可作为高阻抗输入端用。

在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。

在Flash 编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上接电阻。

AT89S51单片机P2口是一个带有内部上拉电阻的8位双向I/O 口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL 逻辑门电路。

对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。

在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX @DPTR 指令)时,P2口送出高8位地址数据。

在访问8位地址的外部数据存储器(如执行MOVX @Ri 指令)时,P2口线上的内容(也即特殊功能寄存器SFR 区中P2寄存器的内容),在整个访问期间不改变。

Flash 编程或校验时,P2亦接收高位地址和其它控制信号。

在上面的硬件连接原理图里,我们用到的是P0和P2口控制四位数码管显示的。

四位数码管显示的方式是动态扫描显示,动态扫描显示是单片机中应用最为广泛的一种显示方式之一。

其接口电路如上图是把所有显示器的8个笔划段a-h同名端连在一起由单51单片机增强型学习系统片机的P0.0~P0.7控制,而每一个数码管的公共极(阴极)是各自独立地受单片机P2.7~P2.4控制。

CPU向字段输出口P0口送出字形码时,所有数码管接收到相同的字形码,但究竟是那个数码管亮则取决于P2.7~P2.4的输入结果,所以我们就可以自行决定何时显示哪一位了。

四位共阳数码管原理

四位共阳数码管原理

四位共阳数码管原理
四位共阳数码管是一种常见的显示器件,由4个共阳数码管组成。

每个数码管有7个发光二极管分别代表数字0到9中的某一个,以及一个小数点位置。

共阳数码管的工作原理是通过控制扫描电路,动态地在不同的位上显示数字或符号。

其具体流程如下:
1. 设置控制信号:将四位共阳数码管的共阳端连接到高电平,将4个共阴端分别与驱动电路的4个输出引脚连接。

2. 扫描显示位:依次将4个输出引脚(一般为P0、P1、P2、P3)置为低电平,其他3个引脚保持高电平。

此时,只有当前被选中的数码管显示位处于通电状态,其他数码管的显示位关闭。

3. 发送显示数据:根据需要显示的数字或符号,设置对应的数码管显示段激活信号。

通过控制数码管对应的发光二极管的阳极或阴极来实现。

4. 循环扫描:不断重复步骤2和步骤3,依次显示四位数码管上需要显示的内容,使人眼产生持续显示的效果。

通过循环扫描的方式,可以在有限的时间内实现四位数码管上多个数字或符号的动态显示。

这种共阳数码管具有显示清晰、结构简单、使用方便等优点,在数字显示方面被广泛应用。

c51闪烁一个led灯的程序

c51闪烁一个led灯的程序
P14插针是8个LED的输出插针,使用8P杜邦线从P14的8个插针连接到单片机P1口。
/*-----------------------------------------------
内容:点亮P1口的1个LED灯闪烁
该程序是单片机学习中最简单最基础的,
通过程序了解如何控制端口的高低电平
------------------------------------------------*/
//用于改变闪烁频率
L1=1; //将P0.0口赋值1,对外输出高电平
Delay(10000);
//主循环中添加其他需要一直工作的程序
}
}
/*------------------------------------------------
延时函数,含有输入参数unsigned int t,无返回值
unsigned int是定义无符号整形变量,其值的范围是
0~65535பைடு நூலகம்
------------------------------------------------*/
void Delay(unsigned int t)
{
while(--t);
}
#include<reg52.h> //包含头文件,一般情况不需要改动,
//头文件包含特殊功能寄存器的定义
sbit L1=P1^0;//用sbit关键字定义L1到P1.0端口,
//LED是自己任意定义且容易记忆的符号
void Delay(unsigned int t); //函数声明
/*------------------------------------------------

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的P0口+驱动芯片连接5只数码管的段选部分,P2口+驱动芯片连接数码管的位选,作出来的效果总是很闪烁,请问是怎么回事?还有就是程序里面用到了一个高速采样AD的定时中断,大概在2ms到5ms之间,请问怎么样设计程序才能让数码管尽量不闪烁?谢谢了答 1:你先把AD去掉,调试一下,看看闪烁吗?答 2:to jcsasm :把AD去掉显示没有问题的,但是问题是我要显示的数据就是从AD采集以后处理显示出来的。

我还尝试着把显示部分放在中断里面,但是还是有一点闪烁,而且显示一旦放到中断里面,系统程序有时候就执行乱了。

请问引起闪烁一般都有什么样的问题?以下是我的显示部分程序,请帮我看一下还应该怎么改,谢谢译码:unsigned char get_code(unsigned char i){unsigned char p;switch(i){case 0:p=0x5F; break;case 1:p=0x05; break;case 2:p=0x9B; break;case 3:p=0x8F; break;case 4:p=0xC5; break;case 5:p=0xCE; break;case 6:p=0xDE; break;case 7:p=0x07; break;case 8:p=0xDF; break;case 9:p=0xCF; break;case 10:p=0x7F; break;//小数点位显示case 11:p=0x25; break;case 12:p=0xBB; break;case 13:p=0xAF; break;case 14:p=0xE5; break;case 15:p=0xEE; break;case 16:p=0xFE; break;case 17:p=0x27; break;case 18:p=0xFF; break;case 19:p=0xEF; break;case 'R':p=0xD7;break;case 'S':p=0xCE; break;case 'E':p=0xDA; break;case 'L':p=0x58; break;case 'A':p=0xD7;break;case 'd':p=0x9D;break;case 'P':p=0xD3;break;case 'U':p=0x5D;break;case '-':p=0x80;break;//符号位显示default:p=0x00;break;}return p;}显示:(要显示的数据放在display_buffer数组中)void Display(void){unsigned char i;static unsigned char star_count=0;SDA^=1;switch(display_bit){case 1: i=0;break;case 2: i=1;break;case 4: i=2;break;case 8: i=3;break;case 16:i=4;break;default:break;}P2=0x00;//闪烁位判断与操作if(star_bit==display_bit && star_count<25){P0=0;star_count++;}else if(star_bit==display_bit && star_count>=25){P0=get_code(display_buffer[i]);star_count++;}//小数点位判断与操作else if(state==0 && (4-point)==i && (4-point)!=4)P0=get_code(display_buffer[i]+10);elseP0=get_code(display_buffer[i]);P2=display_bit;if(star_count>=50)star_count=0;if(display_bit<16) display_bit=display_bit*2;else display_bit=0x01;}答 3:你还没有理解闪烁的原因,要对症下药!即然是动态显示,那么一定要反复的输出显示数据,当输出显示数据之间的时间间隔太小时,就会出现闪烁!最好的问题就是用静态的,否则就要让间隔时间很小。

数码管的动态显示设计与研究

数码管的动态显示设计与研究

单片机课程设计报告指导老师:张橙班级:自动化072姓名:廖岩学号: 07401100221日期: 2013年1月6日数码管的动态显示设计与研究一:概述动态显示主要就是利用人眼的视觉感来设计的,一般来说如果显示的频率过慢,则会有断断续续的显示;如果显示的频率加快,则人眼就分辨不出这种视觉残余!随着现代科学技术的不断地进步,人们已经走入了信息的高速时代。

科学的力量日益强大,技术的更新的速度也更加加快了。

计算机走进了千家万户,其中,单片机是一种应用十分广泛的单心片微型计算机,在我国的普及应用已有若干年,上至航天飞机,下至电动玩具,都能见到它的身影。

单片机比专用处理器更适合应用于嵌入式系统,因此它得到了最多的应用。

事实上单片机是世界上数量最多的计算机。

现代人类生活中所用的几乎每件电子和机械产品中都会集成有单片机。

手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电脑配件中都配有1-2部单片机。

而个人电脑中也会有为数不少的单片机在工作。

汽车上一般配备40多部单片机,复杂的工业控制系统上甚至可能有数百台单片机在同时工作!单片机的数量不仅远超过PC机和其他计算的综合,甚至比人类的数量还要多。

而本次单片机数码管动态显示设计中采用AT89C52。

AT89C52为8位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52 相同,其主要用于会聚调整时的功能控制。

功能包括对会聚主IC 内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。

主要管脚有:XTAL1(19 脚)和XTAL2(18 脚)为振荡器输入输出端口,外接12MHz 晶振。

RST/Vpd(9 脚)为复位输入端口,外接电阻电容组成的复位电路。

vcc(40 脚)和VSS(20 脚)为供电端口,分别接+5V电源的正负端。

P0~P3 为可编程通用I/O 脚,其功能用途由软件定义,在本设计中,P0 端口(32~39 脚)被定义为N1 功能控制端口,分别与N1的相应功能管脚相连接,13 脚定义为IR输入端,10 脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12 脚、27 脚及28 脚定义为握手信号功能端口,连接主板CPU的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。

多位数码管的动态显示原理

多位数码管的动态显示原理

多位数码管的动态显示原理今天来聊聊多位数码管的动态显示原理。

前段时间我在捣鼓一个小电子制作,用到了多位数码管,当时就被这个动态显示的机制给难住了。

不过经过不断地摸索和学习,也算是有点心得啦。

你看,咱们平时在大街上看到那些数字显示牌,就像公交车牌显示线路啥的,一溜看过去数字特别清晰,其实这里面可能就用到了多位数码管的动态显示原理。

我们先来看看数码管是个啥。

简单来说,数码管就是能够显示出数字或者一些简单符号的小器件。

那多位数码管呢,就是好几个这样的小数码管凑在一起,可以用来显示多位数字,像时钟上显示时分秒的那些小数字,就是多位数码管在起作用。

多位数码管的动态显示,打个比方就像是一群小朋友轮流当代表发言。

数码管有好几个位,比如一位数码管显示个位数字,另一位显示十位数字等等。

在动态显示的时候,并不是所有的数码管同时亮起显示完整的数字的。

就像一群小朋友站成一排,老师要让他们顺次报自己的名字,一个说完下一个再说,但是因为说得很快,我们就感觉他们像是一起说的。

这就要说到具体的实现过程了。

在电路里,其实就是通过快速地扫描各个数码管。

比如说,先让显示个位数字的数码管亮起来,给出个位对应的信号,这时候十位、百位等其他数码管暂时是暗的,然后再非常快的速度切换到十位数码管,给它十位对应的信号让它亮起来,这样快速地循环扫描这些数码管。

人的眼睛有视觉暂留现象,就好像咱们看电影似的,虽然电影是一格一格的画面快速闪过,但是我们看到的好像是连贯的画面。

同样的道理,因为这个扫描速度非常快,我们眼睛就感觉这些数码管好像是同时显示出完整的数字啦。

有意思的是,在这个过程中,如果扫描速度慢了点儿,我们就会看到数码管显示会闪烁,或者显示不完全准确。

我一开始也不明白为啥有时候我做的小装置显示老是出问题,经过查阅资料和反复试验才发现是扫描速度的事儿。

这里的扫描速度就是一个很关键的因素,就像小朋友发言的时候,如果小朋友之间间隔的时间太长,那就不像一组连贯的信息了,看起来就很奇怪。

数码管动态扫描显示实验综述

数码管动态扫描显示实验综述

实验三定时器和中断实验一、实验目的1、学习51单片机内部定时器的使用方法。

2、掌握中断处理程序的方法。

3、掌握数码管与单片机的连接方法和简单显示编程方法。

4、学习和理解数码管动态扫描的工作原理。

二、实验内容1、使用定时器T0,定时1秒,控制P1口发光管循环点亮。

2、使用定时器T0,定时1秒,控制1个数码管循环显示数字0~9,每秒钟数字加一。

3、使用软件定时1秒,控制2个数码管循环显示秒数0~59,每秒钟数字加一。

4、使用定时器T0,定时1秒,控制2个数码管循环显示秒数0~59,每秒钟数字加一。

三、实验电路图四、实验说明1、数码管的基本概念(1)段码数码管中的每一段相当于一个发光二极管,8段数码管则具有8个发光二极管。

本次实验使用的是共阴数码管,公共端是1、6,公共端置0,则某段选线置1相应的段就亮。

公共端1控制左面的数码管;公共端6控制右面的数码管。

正面看数码管的引脚、段选线和数据线的对应关系为:图1 数码管封装图图2 数据线与数码管管脚连接关系段码是指在数码管显示某一数字或字符时,在数码管各段所对应的引脚上所加的高低电平按顺序排列所组成的一个数字,它与数码管的类型(共阴、共阳)(2)位码位码也叫位选,用于选中某一位数码管。

在实验图中要使第一个数码管显示数据,应在公共端1上加低电平,即使P2.7口为0,而公共端6上加高电平,即使P2.6口为1。

位码与段码一样和硬件连接有关。

(3)拉电流与灌电流单片机的I/O 口与其他电路连接时,I/O 电流的流向有两种情况:一种是当该I/O 口为高电平时,电流从单片机往外流,称作拉电流;另一种是该I/O 口为低电平时,电流往单片机内流,称为灌电流。

一般I/O 的灌电流负载能力远大于拉电流负载能力,对于一般的51 单片机而言,拉电流最大4mA,灌电流为20mA。

一般在数码管显示电路中采用灌电流方式(用共阳数码管),可以得到更高的亮度。

本实验电路中采用拉电流方式(用共阴数码管)。

四位LED显示器动态扫描电路

四位LED显示器动态扫描电路

通信工程专业《数字电路》课程设计四位LED动态扫描设计目录1前言(引言)随着计算机技术和电子技术的飞速发展和广泛应用,电器设备的输出显示技术也变得复杂多样,诸如CRT显示、LCD显示、多位LED显示及发光二极管显示等应运而生。

在这些显示当中,LED及发光二极管显示电路较为简单,成本也较低,在功能单一的仪器仪表与机电设备中应用较广。

但当设备显示的点或位较多时,就需要采用一定的驱动电路与相应的驱动方式。

通过我们所学的数字电路,模拟电路,设计一个电路,实现一些功能。

此次设计锻炼我们的动手能力,解决问题的能力!2设计任务及方案论证用四位编码开关编码,将编出来的数字(0~9)以动态扫描的形式显示在LED数码管上,并且能够调节扫描频率。

1.通过编码开关,编出0000~9999的数字。

2.通过两个四选一的选择开关(74LS153),选择输出位数。

3.将选择输出的四位进行排序,接入数码管译码器(C4511)。

4.将对应的编码通过译码器显示在数码管上。

5.由于要求动态扫描:5.1接入一个时钟脉冲。

产生时钟脉冲需要接入555多些振荡器。

5.2产生的CP脉冲,通过计数器产生00~11的二进制数。

5.3两位二进制数与四选一选择开关和2—4的计数器同步,产生1110,1101,1011,0111的四位二进制数作为数码管的驱动电压。

将设计的电路,经过理论计算,做出电路板,进行调试,从而来验证试验设计的真确性。

3电路设计原理与实验电路3.1设计任务及要求利用数字集成电路(如:74LS353、48、139、393,NE555等)和分立元件设计一个四位LED显示器动态扫描驱动电路。

(1)基本要求①显示范围:0000~9999;②显示方式:LED显示;③扫描频率:1Hz~1000Hz连续可调;④可预置数:0000~9999。

(2)发挥部分①扫描频率:1Hz~1000Hz连续可调;②自制符合要求电源。

3.2 设计方案通过编码开关对0到9的数字进行编码,送入四选一的选择器(74LS153),通过由低位到高位的排序,将选择的数字传入到译码器(74HC4511)中,并通过输出中间级使其数据传送到LED七段数码显示管。

51单片机按键控制数码管闪烁位置

51单片机按键控制数码管闪烁位置
display();
n--;
if (n > 3)
n = 3;}Βιβλιοθήκη }display();
}
}
void T0_INT() interrupt 1
{
TH0 = 0x3C;
TL0 = 0xB0;
n_50ms++;
n_50ms %= 6; //10对应1Hz
if(!n_50ms)
flag = ~flag;
}
while(1)
{
if (!k_a)
{
display();
if (!k_a)
{
while (!k_a)
display();
num[n]++;
if (num[n] > 9)
num[n] = 0;
}
}
if (!k_s)
{
display();
if (!k_s)
{
while (!k_s)
display();
#include <intrins.h>
sbit k_a = P3^1;
sbit k_s = P3^3;
sbit k_l = P3^5;
sbit k_r = P3^7;
unsignedchar code SEG7[] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
for(i = 0; i < 8; i++)
{
P0 = SEG7[DISP_BUFF[i]];
P2 = w;
DelayMS(1);
P2 = 0;
w = _cror_(w, 1);

动态数码管闪烁

动态数码管闪烁

设计程序时,发现数码管动态显示时存在部分闪烁现象。

经两天的时间去尝试解决和调试,最终找到解决的办法:
动态数码管亮度均匀等同于时序均匀。

(本人采用定时器中断方式点亮动态数码管)数码管的时序不能乱,之前的数码管动态显示闪烁现象,主要是由于其他中断程序扰乱了时序(中断嵌套)。

最终的解决办法是:在动态数码管所在的定时器中断函数下,将ds18b20通讯(中断嵌套)的程序放在同一个定时器中断下。

然而ds18b20通讯的间隔是0.4S,程序运行时长是6ms,而动态数码管显示的间隔是5ms,程序运行时长是0.5ms。

于是在ds18b20通讯的间隔期,在中断函数中填入6ms等长的延时函数,以保证动态数码管的时序均匀。

通过if else 语句判断是否达到0.4s。

而这样的结果就是需要提高MCU频率,并且其他程序只能写在两位数码管显示的间隔的狭窄时间段。

而数码管的显示频率在50HZ以上效果较好,如果在50Hz下,4位数码管,则其他程序的运行时长不能超过(1/50)/4 s=5ms。

总而言之,动态数码管闪烁的主要原因在于各位数码管显示的时长不均匀(例如:有中断加入导致某位数码管显示的时间突然增长)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
break;
default:break;
}
if(flagtj!=0)
if((n==i)||(n+1==i))
{if(flag_1s==1)
P0=0xff;
else
P0=table[dula[i]];}
else
P0=table[dula[i]];
if(flagtj==0)
P0=table[dula[i]];
case 0xbe:outnum=11;break;
case 0x7e:outnum=15;break;
default:break;
}
}
}
}
}
}
/*if(!key1)
{
delayus(50);
if(!key1)
{
outnum=5;
while(!key1);
delayus(50);
}
} */
}
void main()
if(miao==60)
{miao=0,fen++;}
if(fen==60)
{fen=0,shi++;
if(shi>12)
shi=1;}
}
//====================
void disp()
{uchar i,n;
dula[7]=miao%10;
dula[6]=miao/10;
dula[5]=0x0a;
}
else {P0=num[dbuf[3]];}
P1=0x08;
delayus(20);
P1=0x00;
}
void keynum()
{
uchar temp;
P2=0x0f;
if(P2!=0xf0)
{
delayus(10);
if(P2!=0xf0)
{
P2=0xf7;
delayus(10);
temp=P2;
switch(temp)
{
case 0xe7:flashbit=1;break;
case 0xd7:flashbit=2;break;
case 0xb7:flashbit=3;break;
case 0x77:flashbit=4;break;
default :P2=0xfb;
temp=P2;
switch(temp)
P0=0xff;
else
P0=table[dula[i]];}
else
P0=table[dula[i]];break;
case 0:
P0=table[dula[i]];break;
}
P2=wela[i];
delay(10);
P0=0xff;
}
*/
}
//=====================
void delay(uint z)
P1=0x02;
delayus(20);
P1=0x00;
if(flashflag==1&&flashbit==3)
{
P0=0xff;
}
else {P0=num[dbuf[2]];}
P1=0x04;
delayus(20);
P1=0x00;
if(flashflag==1&&flashbit==4)
{
P0=0xff;
void intc();
void keyscan();
void disp();
void main()
{intc();
while(1)
{
keyscan();
disp();
}
}
//================
void intc()
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
{flagjian=0;
if(shi<1)
shi=1;
shi--;
}
break;
}
}
//===============
uchar miao,fen,shi,flagjia,flagjian;
bit flag_1s;
uchar code wela[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar dula[8]={0,0,1,1,2,2,3,3};
void delay(uint z);
switch(flagtj)
{ case 1: if(flagjia==1)
{flagjia=0;miao++;
if(miao>60)
miao=0;
}
if(flagjian==1)
{flagjian=0;
if(miao<1)
miao=1;
miao--;
}
break;
case 2: if(flagjia==1)
P0=table[dula[i]];break;
case 2:
if(i>2&&i<5)
{if(flag_1s==1)
P0=0xff;
else
P0=table[dula[i]];}
else
P0=table[dula[i]];break;
case 3:
if(i>=0&&i<2)
{if(flag_1s==1)
{
uint x;
uchar y;
for(x=0;x<z;x++)
for(y=0;y<112;y++);
}
//===========================
void keyscan()
{
if(tiaojie==0)
delay(100);
if(tiaojie==0)
{while(!tiaojie);
{
case 0xeb:outnum=1;break;
case 0xdb:outnum=5;break;
case 0xbb:outnum=9;break;
case 0x7b:outnum=13;break;
default:P2=0xfd;
temp=P2;
switch(temp)
{
case 0xed:outnum=2;break;
sbit tiaojie=P1^0;
sbit jia=P1^1;
sbit jian=P1^2;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0xbf};
uchar a,b,num1,num2,flag100ms,flag1s,flagtj;
{flagjia=0;fen++;
if(fen>60)
fen=0;
}
if(flagjian==1)
{flagjian=0;
if(fen<1)
fen=1;
fen--;
}
break;
case 3: if(flagjia==1)
{flagjia=0;shi++;
if(shi>12)
shi=1;
}
if(flagjian==1)
display();
flashflag=~flashflag;
}
//8位数码管动态显示时间,可调节,
//调节时间时,调节的数闪烁显示;
//比较两种闪烁的方法;
//2011。3。6
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
dula[4]=fen%10;
dula[3]=fen/10;
dula[2]=0x0a;
dula[1]=shi%10;
dula[0]=shi/10;
for(i=0;i<8;i++)
{
switch(flagtj)
{
case 1 : n=6;
break;
case 2 : n=3;
break;
case 3 : n=0;
思路说明:将显示程序放入定时器中断,设定一闪烁标志位。定时时间为2MS,定时时间到则将标志位取反,同时也可以将按键扫描程序放入该定时器,则在视觉上可以看到要求位的闪烁。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
ET0=1;
EA=1;
TR0=1;
}
void timer0() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
a++;
if(a==10)
{flag100ms=1;}
if(a==100)
{a=0,flag1s=1,miao++;flag_1s=~flag_1s;}
{
TMOD=0X01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1;
}
void delayus(uint z)
{
uchar x,y;
相关文档
最新文档