完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
1.数码管的显示原理
数码管有一位和多位一体两类,它是由8个LED(a,b,c,d,e,f,g,dp)排列组成,任意一个LED叫作一个“段”。通过给a,b,c,d,e,f,g,dp各个脚加上不同的控制电压可以使不同的LED导通发亮,从而显示0~9各个数字和ABCDEF各个字母。 由于8个LED共有16个引脚,为了减少引脚,形成了共阳极和共阴极两种数码管,如下图,如果是共阴极,点亮方法就是公共脚加低电平,引出脚加高电平,如果是共阳极,公共脚加高电平,引出脚加低电平即可。(我的数码管是共阳极,所以下面我就使用共阳极进行说明) 2.数码管的静态显示 所谓静态显示,就是数码管的笔画点亮后,这些笔画就一直处于点亮状态,而不是处于周期性点亮状态。下面我将以我的原理图为例说明如何点亮静态显示。 我的数码管的a,b,c,d,e,f,g,dp接在P0.0~P0.7脚,故我让哪一个二极管亮,就使其脚加低电平,几个LED组合在一起就可以拼出一个数字或字母,下面给出常用的字形码 例如要使用‘3’,则数码管的a,b,g,c,d应点亮,其引脚为低电平,其他引脚为高电平,二进制数为dp g f e d c b a 1011 0000,每四位转成十六进制就是b0,所以要先显示‘3’,给P0端口赋值0xb0即可,其他字符的编码类似。 #include《reg52.h》 #define uchar unsigned char #define uint unsigned int ***it DI1=P1^0; //定义四位数码管位选信号 ***it DI2=P1^1; ***it DI3=P1^2; ***it DI4=P1^3; unsigned char i = 0; void delay(uint z) //定义延时函数 { uint x,y; for(x = z;x》0;x--) for(y = 110;y》0;y--); } /*定义数码管显示字符跟数字的对应数组关系*/ uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, //数码管显示编码(0-F) 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; void main() { P0=0x00; //P0口初始化 DI1=0; //第一位数码管位选 while(1) { P0 = table[i]; delay(1000); //延时约1s i++; if(i》15) //n=15时显示F,当n=16时从头开始 i = 0; } } 3.数码管的动态显示(不用锁存器) 由于我的板子上没有锁存器。。。所以这里只介绍不用锁存器的动态显示,锁存器的好处只是可以节省I/O口,其实不用锁存器依然可以使数码管动态显示。 动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。这样一来,就没有必要每一位数码管配一个锁存器,从而大大地简化了硬件电路。选亮数码管采用动态扫描显示。 所谓动态扫描,即是通过分时轮流送出字形码和相应的位选,使各个数码管轮流受控显示。在轮流显示过程中,每位元数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极体的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示资料,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O口,而且功耗更低。 #include《reg51.h》 #define uchar unsigned char ***it DI1=P1^0; //定义四位数码管位选信号 ***it DI2=P1^1; ***it DI3=P1^2; ***it DI4=P1^3; void delay(uchar x) //定义延时函数 { uchar j; while(x--) { for(j=0;j《125;j++) {;} } } /*定义数码管显示字符跟数字的对应数组关系*/ uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, //数码管显示编码(0-F) 0x80,0x90,0xa0,0x83,0xc6,0xa1,0x84,0x8e,0x00}; void main() { P0=0x00; //P0口初始化 DI1=0; //第一位数码管位选 P0=table[0]; //第一位数码管显示0 delay(5); DI1=1; //关闭第一位数码管位选 DI2=0; //第二位数码管位选 P0=table[1]; //第二位数码管显示1 delay(5); DI2=1; //关闭第二位数码管位选 DI3=0; //第三位数码管位选 P0=table[2]; //第三位数码管显示2 delay(5); DI3=1; //关闭第三位数码管位选 DI4=0; //第四位数码管位选 P0=table[3]; //第四位数码管显示3 delay(5); DI4=1; //关闭第四位数码管位选 } 4.中断与数码管结合的计时器 #include《reg52.h》 #define uchar unsigned char #define uint unsigned int uchar num = 0; ***it DI1=P1^0; ***it DI2=P1^1; ***it DI3=P1^2; ***it DI4=P1^3; uchar i4 = 0; uchar i3 = 0; uchar i2 = 0; uchar i1 = 0; uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar code table2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; void delay(uint z) //定义延时函数 { uint x,y; for(x = z;x》0;x--) for(y = 110;y》0;y--); } void display() { P0=0x00; //P0口初始化 DI1=0; //第一位数码管位选 P0=table[i1]; //第一位数码管显示0 delay(5); DI1=1; //关闭第一位数码管位选 DI2=0; //第二位数码管位选 P0=table2[i2]; //第二位数码管显示1 delay(5); DI2=1; //关闭第二位数码管位选 DI3=0; //第三位数码管位选 P0=table[i3]; //第三位数码管显示2 delay(5); DI3=1; //关闭第三位数码管位选 DI4=0; //第四位数码管位选 P0=table[i4]; //第四位数码管显示3 delay(5); DI4=1; //关闭第四位数码管位选 } void main() { //P0 = 0x00; TMOD = 0x01;//将定时器0设为方式1,即16位定时器 /*TH0中每增加1,就相当于计了256个数,所以TH0装入初值是对256取模,TL0是对256取余*/ TH0 = (65536-45872)/256;//给定时器的高八位赋初值 TL0 = (65536-45872)%256;//给定时器的低八位赋初值 EA = 1;//开总中断 ET0 = 1;//开定时器0中断 TR0 = 1;//启动定时器T0 while(1) { if(num == 20) //num=20代表用了50ms*20 = 1s { num = 0; if(i4 == 9) { i4 = 0; if(i3 == 5) { i3 = 0; if(i2 == 9) { i2 = 0; i1++; } else { i2++; } } else { i3++; } } else { i4++; } } display(); } } void T0time() interrupt 1 { TH0 = (65536-45872)/256; TL0 = (65536-45872)%256; num++; } |
|
|
|
只有小组成员才能发言,加入小组>>
2513 浏览 0 评论
1083浏览 2评论
700浏览 1评论
452浏览 0评论
193浏览 0评论
328浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 23:17 , Processed in 1.221880 second(s), Total 78, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号