标题: 求教89c52rc单片机六位一体数码管怎么可以第一次显示如123456 [打印本页]
作者: zhezhichun 时间: 2024-3-27 09:10
标题: 求教89c52rc单片机六位一体数码管怎么可以第一次显示如123456
求教89c52rc 六位一体数码管怎么可以第一次显示如(123456),第二次显示(338737),第三次显示(decfga),六个数同时显示(用delay(1)),三次显示间隔一秒
作者: cedtek 时间: 2024-3-28 18:07
其实你只需要了解一个动态扫描的显示方式就可以实现了,我这里把我之前的学习笔记贴出来,我自己温故知新的同时希望对你也有所帮助。
数码管动态扫描显示原理六位八段数码管的内部结构图如下(下图以共阳极为例)
由图可知,六位八段数码管当中,每个数码位的段选信号全部连接到了一起,然后进行输出(对于共阳极数码管来说,段选引脚为低电平时有电流从数码管的段选引脚流出);每个数码位单独引出一个位选信号用来控制数码位的选择,这种连接方式会使得被选中的数码位显示的内容都是相同的,因为这些被选中的数码位的段选信号已经全部连接到了一起。如何使用这个六位八段数码管来实现数码管的动态显示呢?我们需要使用一种方式:动态扫描
如何使用动态扫描的方式来实现数码管的动态显示呢?这里给大家举一个例子:比如说,我们想要使用六位八段数码管显示数字 123456
如何使用六位八段数码管来显示数字 123456 呢?
首先我们选中第一个数码位,让这个数码位显示数字 1;然后它显示的时间设为 T,这个 T 可以看作一个周期
当第一个数码位完成一个 T 周期数字 1 的显示之后,立刻选中第二个数码位;注意,此时只选中了第二个数码位让它显示数字 2,显示的时间同样是一个周期 T
当第二个数码位完成了一个周期 T 数字 2 的显示之后,立刻选中第三个数码位;这儿注意,也是只选中了第三个数码位让它显示数字 3,同样显示时间为 T
依次往下类推,那么此时就显示 4
然后是 5
然后是 6
当第六个数码位完成了一个周期 T 数字 6 的显示之后,再重新选中第一个数码位;这儿也是只选中了第一个数码位,让它继续显示数字 1,然后显示的时间仍然是 T 周期,这样依次往下循环。
通过上述动态显示过程的描述,我们知道这样一个循环是六个周期就是 6*T;如果说给这个 T 规定一个确切的时间会怎样呢?首先给 T 规定一个确切的时间 1s;如果说 T 等于 1s,六位八段数码管的六个数码位会依次显示 1、2、3、4、5、6 每个数字显示的时间为 1s,如下GIF动图所示
如果进一步把这个 T 进行缩短,比如说缩短到 20ms 这时候六位八段数码管的六个数码位会进行闪烁显示,显示的内容依次是 1、2、3、4、5、6,如下GIF动图所示
如果进一步缩短时间 T 为 1ms,这时候,六位八段数码管的六个数码位实际上也是依次进行闪烁的显示,显示的内容依次是 1、2、3、4、5、6 每个数字显示时间是 1ms,如下GIF动图所示
但是它们切换的频率太快了,我们的肉眼不能分辨这种闪烁,就误以为六位八段数码管的六个数码位在同时进行显示,而且显示的内容是 123456。
这样就使用动态扫描的方式实现了数码管的动态显示。
使用动态扫描的方式实现数码管的动态显示,实际上是利用了两个现象:人眼的视觉暂留特性和数码管的余晖效应。人眼在观察景物时,光信号传入到大脑神经需要经过一段时间,光的作用结束之后我们的视觉影像并不会立刻的消失,这种残留的视觉被称为后像,这种现象就被称为视觉暂留;数码管的余晖效应是什么意思呢?当我们停止向发光二极管供电时,发光二极管的亮度仍能够维持一段时间。我们的动态扫描利用这两个特性就实现了数码管的动态显示。
Proteus 仿真看看吧一开始先设置T为3s左右看一看,如下GIF动图所示
接着设置为300ms左右,如下GIF动图所示(闪烁起来了
)
然后设置为30ms左右,如下GIF动图所示(貌似眨眼补帧后就是同时显示的了
)
我还要快一点,那就再除个10,每个位只显示3ms左右的时间看看吧
看来它已经可以欺骗我们的眼睛和大脑了(至少仿真软件认为是这样的)
用手机拍视频时如果画面中有对准过多位数码管显示类产品的话,相信你一定注意到过手机画面中,数码管通常会闪烁吧,原因就是使用了动态扫描的方式显示
作者: a399288395 时间: 2024-3-29 08:54
看来单片机开发板还没有学入门; 找个视频自己看了后再写出来,然后下载到板子上看看实际情况, 再改改延时时间 你就会看到另一种不一样的结果, 只有这样才真正学会, 在这问这些是没有用的, 跟你讲动态扫描 就好像讲无字天书一样, 很玄妙!
作者: 明日之星8 时间: 2024-3-29 10:02
你知道六位的数码管里面有多少个发光二极管吗?
6x8=48个发光二极管,最笨的办法要用49根引脚才能控制它,
聪明的办法只要6+8=14根引脚就行了,但是要用动态扫描的方
法才能正常显示。实际同一时间只能有一个数码管在显示,其
它的都是关着的不显示的,“动态扫描”的意思是排着队一个一个
的来显示,只要切换的速度足够快,我们就感觉是“同时”都在显
示数字了。你感觉1秒钟的时间很短,对于单片机来说却是很漫长
的,比如24MHz的频率它要计数2400万才到1秒钟。
你这个题目很大,慢慢来吧,从点亮一个发光管开始吧,然后学会
在其中的一个数码管上显示“12345abcd”这些,还要能随意的显示,
随意的变换显示给出的内容,然后是把时间分成小段完成动态扫描。
你要的不同时间段显示不同的内容,还要再把时间分成大的时间段
显示你要的内容。
作者: 黎明的曙光哈哈 时间: 2024-3-29 11:09
#define display_tm_base 15u
//
display_time++
if(display_time>=display_tm_base)
{
display_show();
display_time=0;
index++;
if(index>=12)
{
index=0;
}
}
//上面那部分程序放在定时器中
void display_show()//数码管显示程序
{
if(run_mode==6)
{
show_value[0]=mode_timer_value/100; //百位
show_value[1]=mode_timer_value%100/10; //十位
show_value[2]=mode_timer_value%100%10;//十位
}
else
{
if(pro_set==0)
{
show_value[0]=trigger_cut/100; //百位
}
else
{
show_value[0]=16; //P段显示
}
show_value[1]=trigger_cut%100/10; //十位
show_value[2]=trigger_cut%100%10;//十位
}
show_value[3]=intergral/100; //百位
show_value[4]=intergral%100/10;// 十位
show_value[5]=intergral%100%10;//个位
if(index==0)
{
select_pin1=0;
select_pin2=1;
select_pin3=1;
select_pin4=1;
select_pin5=1;
select_pin6=1;
show_port=table[show_value[2]];
}
else if(index==2)
{
select_pin1=1;
select_pin2=0;
select_pin3=1;
select_pin4=1;
select_pin5=1;
select_pin6=1;
show_port=table[show_value[1]];
}
else if(index==4)
{
select_pin1=1;
select_pin2=1;
select_pin3=0;
select_pin4=1;
select_pin5=1;
select_pin6=1;
show_port=table[show_value[0]];
}
else if(index==6)
{
select_pin1=1;
select_pin2=1;
select_pin3=1;
select_pin4=0;
select_pin5=1;
select_pin6=1;
show_port=table[show_value[5]];
}
else if(index==8)
{
select_pin1=1;
select_pin2=1;
select_pin3=1;
select_pin4=1;
select_pin5=0;
select_pin6=1;
show_port=table[show_value[4]];
}
else if(index==10)
{
select_pin1=1;
select_pin2=1;
select_pin3=1;
select_pin4=1;
select_pin5=1;
select_pin6=0;
show_port=table[show_value[3]];
}
else
{
select_pin1=1;
select_pin2=1;
select_pin3=1;
select_pin4=1;
select_pin5=1;
select_pin6=1;
// show_port=0X00;
}
}
char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x73}; //数码管共阴极编码表
作者: cy009 时间: 2024-3-31 23:11
标题: 修改多次都失败,不知何因,补发附件。
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0xc2}; //共阳代码
uchar code com[]={0x01,0x02,0x04,0x08,0x10,0x20}; //位码
uchar seg_buff[6]; //显示缓冲区
/****************************************************
延时子函数(xms)
****************************************************/
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=120;j>0;j--);
}
/***************************************************************
显示子函数
***************************************************************/
void seg_show(uchar a,uchar b,uchar c,uchar x,uchar y,uchar z)
{
uchar i;
seg_buff[0]=seg[a];
seg_buff[1]=seg[b ];
seg_buff[2]=seg[c];
seg_buff[3]=seg[x];
seg_buff[4]=seg[y];
seg_buff[5]=seg[z];
for(i=0;i<6;i++)
{
P2=0x00;
P0=seg_buff[ i];
P2=com[ i];
delay(1);
}
}
/****************************************************
主函数
****************************************************/
void main()
{
while(1)
{
uint cnt; //延时计数参数,不精确的计算,想精确的建议用定时器
//数码管刷新一次约为6ms,167次约为1秒
if(cnt<167) seg_show(1,2,3,4,5,6);
else if(cnt>=167 && cnt<334) seg_show(3,3,8,7,3,7);
else seg_show(13,14,12,15,16,10);
cnt++;
if(cnt>501) cnt=0;
}
}
-
-
seg05.rar
729 Bytes, 下载次数: 1
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |