51单片机-数码管
时间:03-22
来源:互联网
点击:
共阴极是指所有发光二极管阴极连接在一起,这个共阴极可以用来做片选。
如图,这里有8个发光二极管,到底哪个亮需要进行片选。
段选:8段数码管每一段的控制段叫段选
位选:就是进行哪个8段数码管亮的选择
TX-1C使用两片锁存器74HC573实现位选和段选
这里的D0"7是连在单片机的I/O口上,当为高电平时,Q与D中的数据一致,遇到负跳变沿时Q中的
数据保持住,D中的数据即使变化也不会影响Q。
MCU Version2使用的是74HC245和38译码器74HC138
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++;
}
#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();
}
}
#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++;
}
李万鹏
- 用于气象站的PC硬件监控器(05-08)
- EP7212处理器的LCD控制及触摸屏接口设计(10-25)
- 基于MSP430的无极性恒流电刺激器的设计(02-12)
- 基于STM32 MCU的太阳能:LED街灯解决方案(05-06)
- 基于单片机的瓦斯报警器设计(05-12)
- 用一只引脚为微控制器输入并行数据(07-31)