Ⅰ 单片机led数码管实验
单片机led数码管 秒表仿真实例,很简单的,可以参考一下,
#include<reg52.h> //秒表程序
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar ,shi;
uint a1,a2;
sbit D1=P3^0;
sbit D2=P3^1;
sbit D3=P3^2;
sbit D4=P3^3;
sbit key=P3^5;
sbit key1=P3^7;
bit j ;
uint y ;
void main()
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1;
=0;
shi=0;
while(1)
{
if(key==0)
{
j=0;
}
if(key1==0)
{
j=1; a2=0;
}
}
}
void timer0()interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
a1++;
y++;
if(a1==100)
{
a1=0;
if(j==1) a2++;
if(a2>=10000) a2=0;
}
D1 = 1; D2 = 1; D3 = 1; D4 = 1;
if(y==1)
{
P1=table[a2%10000/1000];
D4=0;
}
if(y==2)
{
P1=table[a2%1000/100];
D3=0;
}
if(y==3)
{
P1=table[a2%100/10];
D2=0;
}
if(y==4)
{
P1=table[a2%10];
D1=0;
y=0;
}
}
Ⅱ 单片机数码管动态显示
下面是用段选和位选的数码管动态显示程序,可以参照下写法
#include <AT89X51.H>
unsigned char dispbitcnt; //数码管位码扫描变量
unsigned char second;
//秒变量
unsigned char minite;
//分变量
unsigned char hour;
//时变量
unsigned char tcnt;
//秒信号产生变量
unsigned char mstcnt;
//扫描时间变量
const unsigned char dispcode[10]={0xc0,0xf9,0xa4,0xb0,0x99,<br> <br> <br> 0x92,0x82,0xf8,0x80,0x90};
//0123456789段码
const unsigned char dispbitcode[6]={0xfe,0xfd,0xfb,0xf7,<br> <br> <br> 0xef,0xdf};
//123456位码
unsigned char dispbuf[6]={0,0,0,0,0,0};
//缓冲数组
//**************TMR0中断数码管扫描程序*********************
void Timer0() interrupt 1
{
P2=dispcode[dispbuf[dispbitcnt]];//段码
P1=dispbitcode[dispbitcnt];//位码
dispbitcnt++;
if(dispbitcnt==6)
{dispbitcnt=0;<br> }
tcnt++;
//中断产生秒信号
if(tcnt==244)
{tcnt=0;<br> <br>second++;<br> <br>if(second==60)<br> <br> {second=0;<br> <br> minite++;<br> <br> if(minite==60)<br> <br> {minite=0;<br> <br> <br>hour++;<br> <br> <br>if(hour==24)<br> <br> <br> {hour=0;<br> <br> <br> }
}
}
dispbuf[4]=second%10;
dispbuf[5]=second/10;
dispbuf[2]=minite%10;
dispbuf[3]=minite/10;
dispbuf[0]=hour%10;
dispbuf[1]=hour/10;
}
TMOD=0x01;
TL0=0x10;
TH0=0xf0;
}
///****************1ms延时程序******************
void delay_1ms(unsigned char i)
{
unsigned char j;
for(i=0;i<144;i++)
for(j=0;j<144;j++);
}
//*************主程序********************
void main(void)
{
TMOD=0x01;
TL0=0x10;
TH0=0xf0;
while(1)
{
dispbitcnt=0;
P1=0x00;
//开段码
P2=0x00;
//开位码
delay_1ms(200);
//延时
delay_1ms(200);
//延时
delay_1ms(200);
//延时
delay_1ms(200);
//延时
P2=0xff;
//关位码
EA=1;
ET0=1;
TR0=1;
while(1);
}
}
Ⅲ 我在学AVR单片机在遇到数码管动态显示实验时,里面要有个Delay延时,为什么要延时啊
大凡涉及动态显示,有一个基本数据,那就是一个画面在1秒的时间内最少显示24次(24Hz),至于这个数据的出处我也不详细,如此,一个画面停留时间不能大于42毫秒,而要想画面稳定则至少要达到50Hz以上,对于数码管的显示,由于是通过通/断电的方式进行扫描控制的,所以这又有别于上诉的帧频显示原理,因为电源的频繁通断使得数码管获得的平均工作电流降低了,相当于PWM调压作用,所以要仔细调整通/断这两个延时时间以获得兼顾显示的稳定和亮度的合理,另外最终显示结果还和显示代码的结构及实板演示、模拟仿真等多种因素有关。
Ⅳ 数码管动态显示中要改善显示效果实验程序应作哪些修改
1. 在Proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路
2. 在电路中增加四个7段数码管(共阳/共阴自选),将P1口作数据输出口与7段数码管数据引脚相连 ,P2.0~P2.3引脚输出选控制信号
3. 在Keil软件中编写程序,采用动态显示法,实现数码管分别显示数字1,2,3,4
二、实验目的
1. 巩固Proteus软件和Keil软件的使用方法
Ⅳ 数码管动态显示工作原理
1、多个数码管的段码连接在一起,位码分别控制。
2、由于段码连接在一起,如果数码管全亮,则显示的数据相同,所以为了显示不同的数字,任何时刻,只能有一个数码管显示,其余不显示。
3、用软件使这几个数码管轮流显示我们需要的数字。
4、只要更新频率足够快(>100Hz),肉眼看起来,这些数码管就同时显示我们需要的数字了。
(5)单片机数码管动态显示实验扩展阅读:
数码管的最常见形式有10个阴极,形状为数字0到9,某些数码管还有一个或两个小数点。然而也有其他类型的数码管显示字母、标记和符号。如一种“数码管”,其阴极为一个模板制成的面具,上面有数字形状的孔。一些俄罗斯的数码管,如IN-14,使用倒立的数字2代表5,大概是为了节约生产成本,而没有明显的技术或美学方面的原因。俄罗斯的数码管大部分都使用了倒立的2作为5。
将170伏的直流电压加在阴极和阳极之间,每一个阴极可以发出氖的的红橙色光。由于混合气体的不同,不同类型的数码管之间的颜色有所区别。寿命较长的数码管在制造中加入了汞,减少了溅射,结果发出的光的颜色为蓝色或紫色调。在某些情况下,这些颜色被玻璃上的红色或橙色过滤涂层过滤。
Ⅵ 单片机数码管显示生日实训会出现的问题
我们最常用的是七段式和八段式LED数码管,八段比七段多了一个小数点,其他的基本相同。所谓的八段就是指数码管里有八个小LED发光二极管,通过控制不同的LED的亮灭来显示出不同的字形。数码管又分为共阴极和共阳极两种类型,其实共阴极就是将八个LED的阴极连在一起,让其接地,这样给任何一个LED的另一端高电平,它便能点亮。而共阳极就是将八个LED的阳极连在一起。其原理图如下。
注:共阳极数码管:低电平点亮
共阴极数码管:高电平点亮
2.段码字节与字节中各位对应关系:
代码位: D7 D6 D5 D4 D3 D2 D1 D0
显示段: dp g f e d c b a
3.重影:IO口从高电平到低电平,有一定的残留的电流在里面。
在数码管动态显示实验中,每次送完段选数据后,在送入位选数据之前,需要一句
“P0 = 0xff” ,这条语句的专业名称叫做“消影”
解释如下:
在刚送完段选数据后,P0口仍然保持着上次的段选数据,若不加“P0 = 0xff”这句话,再执行接下来的打开位锁存器命令后,原来保持在P0口的段选数据将立即通过位选锁存器直接加在数码管上,接下来才是再次通过P0口给位选锁存器送入位选数据,虽然这个过程非常短暂,但是在数码管高速显示状态下,我们仍然可以看到数码管出现显示混乱的现象,加上消影之后,在开启位锁存器后,P0口数据全为高电平,所以哪个数码管都不会亮,因此这个消影的动作是很重要的。
4.关于送数据与送段选位选先后问题:
/*
* 函数名:DulaSet
* 描述 :数码管段选设置
* 输入 :DP:数码管段选是否为带小数点显示方式 Y:是 / N:否
* DU:段选——范围为16个字形码
* 输出 :无
* 备注 :先送位选数据,再使能锁存器,(最佳写法)
* 因为只有P0状态稳定了,锁进去的数据才不会出错
* 否则显示0x00(即数码管8位全关断)会有亮影
* 接着关锁存器,一瞬间锁存器即可锁存数据
*/
void DulaSet(uchar DP,uchar DU)
{
if(DP == Y)
P0 = NTDP[DU]; //送段选数据,带小数点段选表示
else if(DP == N)
P0 = NT[DU]; //送段选数据
DULA = 1; //开U1锁存器端
DULA = 0; //关U1锁存器端
}
5.数码管静态显示与动态显示的区别:
(对于单片机上8位的数码管(8段LED)
静态:
段码线:每一位段码线分别与一个8位I/O锁存器输出相连
位码线:8个8位I/O口
动态:
段码线:一个数码管占用一个8位I/O口
位码线:8个数码管占用一个8位I/O口
但在实际单片机硬件电路连接中,都把段码线并联,故,静态显示方式下,所有数码管显示相同。
3. 由于各个数码管的段码线并联,(静态显示下)在同一时刻,8个数码管将显示相同的字符,因此若要各个数码管能够同时显示出与本位相应的显示字符,就必须采用动态扫描的显示方式。即在某一时刻,只让某一位的位选线处于选通状态,同时,段码线上输出相应为要显示的字符。LED不同为显示的时间间隔(扫描间隔)应根据实际情况而定。发光二极管从导通到发光有一定的延时,导通时间太短,发光太弱,人眼无法看清;时间太长,要受限于临界闪烁频率,而且此时间越长,占用单片机的时间越多。另外显示位数增多,也将占用大量的单片机时间,因此动态显示的实质是一些牺牲单片机的时间来换取I/O端口的减少。
Ⅶ 单片机实验中数码管显示出现拖影的原因及解决方法
你所谓的拖影,本人称之为 残影。
数码管残影的产生,只发生在动态扫描的设计电路中,主要问题是软件设计者考虑不足引起的。
残影产生的原理是:
在程序进行切换数码管显示时,旧数据(上一位数码管的段选数据)依然存在,就开启了新数码管的位选,导致 旧数据 在 新数码管 短暂出现,然后程序更换新数据,替换了 旧数据。反复快速的进行此类操作,导致短时间内,旧数据 在 新数码管 上的显示次数剧增,使光亮度达到人眼可以轻微辨别的程度,于是出现所谓 残影。
解决方法:
从上面看出,合适的段选、位选开启过程是消除残影的重要因素。不同编程习惯,有不同的过程方法。只要保证,在新位选开启前,数据已经更新即可。例:
关闭所有段选→数据①→段选①→时间→关闭所有段选→数据②→段选②→时间→关闭所有段选……………………
Ⅷ 如何利用单片机让4位数码管显示
程序如下(用的是STC89C52芯片):
#include<reg52.h>//52系列单片机头文件
#defineucharunsignedchar
#defineuintunsignedint
uintx,y;
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//共阴极数码管编码
voiddisplay(uchar,uchar,uchar,uchar);//声明子函数
voiddelay(int);//声明子函数
voidmain()
{
while(1)
{
display(1,2,3,4);//主程序始终调用数码管显示子程序
}
}
voiddisplay(uchara,ucharb,ucharc,uchard)
{
P2=0xef;
P0=table[a];//给第一个数码管送"a"
delay(1);//延时1ms
P2=0xdf;
P0=table[b];//给第二个数码管送"b"
delay(1);//延时1ms
P2=0xbf;
P0=table[c];//给第三个数码管送"c"
delay(1);//延时1ms
P2=0x7f;
P0=table[d];//给第三个数码管送"d"
delay(1);//延时1ms
}
voiddelay(uintz)//延时子函数
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
(8)单片机数码管动态显示实验扩展阅读
led数码管是由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。led数码管常用段数一般为7段有的另加一个小数点,还有一种是类似于3位“+1”型。
位数有半位,1,2,3,4,5,6,8,10位等等,led数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。