`
tomhibolu
  • 浏览: 1380333 次
文章分类
社区版块
存档分类
最新评论

51单片机-数码管

 
阅读更多
哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处
http://blog.csdn.net/woshixingaaa/archive/2010/09/19/5893645.aspx
QQ截图未命名 
共阴极是指所有发光二极管阴极连接在一起,这个共阴极可以用来做片选。
QQ截图未命名 
如图,这里有8个发光二极管,到底哪个亮需要进行片选。
段选:8段数码管每一段的控制段叫段选
位选:就是进行哪个8段数码管亮的选择
TX-1C使用两片锁存器74HC573实现位选和段选
QQ截图未命名 
这里的D0~7是连在单片机的I/O口上,当为高电平时,Q与D中的数据一致,遇到负跳变沿时Q中的
数据保持住,D中的数据即使变化也不会影响Q。
MCU Version2使用的是74HC245和38译码器74HC138
QQ截图未命名 QQ截图未命名1 
74HC245有一个缓冲和驱动的作用,这样可以使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();
		} 
	}			 
}
想让哪个数码管亮多少就亮多少:
#include <reg52.h>

void delay(){
	int i,j;
	for(i = 0; i < 0xff; i++)
		for(j = 0; j < 0xff; j++)
			;
} 
unsigned char code duan[]={ 
	0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
      0x77,0x7C,0x39,0x5E,0x79,0x71};
unsigned char code wei[]={
	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};

void show(unsigned char we,unsigned char du){
	P1 = wei[we];
	P2 = duan[du];
	delay();
}
void main(){
	while(1){
		show(1,5);
	}			 
}

动态显示: 3个数码管从0~999计数。
#include <reg52.h>

unsigned int code duan[]={ 
 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7f,0x6f};

unsigned int code wei[]={
	0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff};

unsigned int num,sum;

void delay(int k){
	int i,j;
	for(i = 0; i < k; i++)
		for(j = 0; j < 0xff; j++)
			;
}

void display(unsigned int bai, unsigned int shi, unsigned int ge){
	P1 = 0x0;
	P2 = duan[bai];
	delay(1);                       //少延时一些数码管更亮,如果延时很大就
	P1 = 0x1;                       //变成静态的了
	P2 = duan[shi];
	delay(1); 
	P1 = 0x2;
	P2 = duan[ge];
	delay(1);
}
void main(){
	EA = 1;                                   
	ET1 = 1;
	TMOD = 0x10;
	TR1 = 1;
	num = 0;
	sum = 0;
	TH1 = (65535 - 50000) / 256;
	TL1 = (65535 - 50000) % 256;
	while(1){
		if(num == 20){          //每一秒计数增加1
			num = 0;
			if(sum == 1000)
				sum = 0;     //用3位数码管显示,当达到1000时从头显示
			sum++;
		}
		display(sum/100,sum%100/10,sum%10);	
	}	
}

void time1() interrupt 3{
	TH1 = (65535 - 50000) / 256;
	TL1 = (65535 - 50000) % 256;
	num++;
}

image

#include <reg52.h>

unsigned char code duan[]={ 
	0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D};

void delay(int k){
	int i,j;
	for(i = 0; i < k; i++)
		for(j = 0; j < 0xff; j++)
			;
}

void display(){
	int i;
	for(i = 1; i < 7; i++){
		P1 = i-1;
		P2 = duan[7-i];
		delay(1);
	}
}

void main(){
	while(1){
			display();					
	}	
}
image     
#include <reg52.h>

unsigned int num,sum;

unsigned int code duan[]={ 
 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7f,0x6f};

void delay(int m){
	int i,j;
	for(i = 0; i < m; i++)
		for(j = 0; j < 0xff; j++)
			;
}

void display(int n1,int n2,int n3){
	P1 = 0;
	P2 = duan[n1];
	delay(1);
	P1 = 1;
	P2 = duan[n2];
	delay(1);
	P1 = 2;
	P2 = duan[n3];
	delay(1);
}

void main(){
	EA = 1;
	ET1 = 1;
	TMOD = 0x10;
	TR1 = 1;
	sum = 0;
	num = 0;
	TH1 = (65535 - 50000) / 256;
	TL1 = (65535 - 50000) % 256;
	while(1){
		if(num == 1){
			num = 0;
			sum++;
		}
		if(sum == 1000)
			sum = 0;
		display(sum/100,sum%100/10,sum%10);				
	}
}

void time1() interrupt 3{
	TH1 = (65535 - 10000) / 256;
	TL1 = (65535 - 10000) % 256;
	num++;
} 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics