51单片机学习 数码管 倒计时
简介
1.硬件部分
普中单片机 开发板 (138译码器控制)数码管
2.软件部分
keil软件
硬件部分
138译码器
简介
74LS138 为3 线-8线译码器,共有 54LS138和 74LS138 两种线路结构型式。54LS138为军用,74LS138为民用。
工作原理
①当一个选通端(E1)为高电平,另两个选通端()和()为低电平时,可将地址端(A0、A1、A2)的二进制编码在Y0至Y7对应的输出端以低电平译出。(即输出为Y0至Y7的非)比如:A2A1A0=110时,则Y6输出端输出低电平信号。
②利用 E1、E2和E3可级联扩展成 24 线译码器;若外接一个反相器还可级联扩展成 32 线译码器。
③若将选通端中的一个作为数据输入端时,74LS138还可作数据分配器。
④可用在8086的译码电路中,扩展内存。
真值表
引脚功能
应用
74LS138可以组成三变量输入,四变量输入的任意组合逻辑电路。
(1)用一块3线-8线译码器74LS138可以组成任何一个三变量输入的逻辑函数,任意一个输入三变量的逻辑函数都可以用一块3线-8线译码器74LS138来实现。因为任意一个组合逻辑表达式都可以写成标准与或式的形式,即最小项之和的形式,而·块3线-8线译码器74LS138的输出正好是二变量最小项的全部体现。
(2)二块3线-8线译码器74LS138可以组成任何一个四变量输入的逻辑函数。
常见的一些编码器、译码器如(74LS138)都只是三位或四位二进制的编码译码,只能满足一些简单电子电路的需求,对于复杂电子电路就无能为力了。
中规模集成电路74LS138的工作原理十分简单,根据输出表达式,从中可以看出译码器74LS138是一个完全译码器,涵盖了所有三变量输入的最小项,这个特性正是它组成任意一个组合逻辑电路的基础。74ls138还有另一重要应用,可以组成数据分配器。其实在电路在家用电器、自动化控制等方面都有重要的应用。
软件部分
//基于普中单片机138译码器数码管实验
#include "reg51.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit led=P2^2;
sbit beez=P1^5;
u16 flag=60,q,w,i,num=0,qwe=0;
double code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
void delay(u16 i)//us软件延迟
{
while(i--);
}
void DigDisplay()
{
u8 i;
for(i=0;i<2;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; P0=smgduan[0]; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; P0=smgduan[6]; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//显示第7位
}
delay(100); //间隔一段时间扫描
P0=0x00;//消隐
}
}
void time() interrupt 1
{
TH0=(65535-45872)/256;
TL0=(65536-45872)%256;
num++;
if(num==20)
{
num=0;
flag--;
q = flag%10;
w = flag/10%10;
}
}
void main()
{
TMOD=0x01;
TH0=(65535-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
for(i=0;i<2;i++)
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; P0=smgduan[w]; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; P0=smgduan[q]; break;//显示第1位
}
}
}
关于显示数字的处理(简单处理,可能有错误,毕竟小白)
一维数组表示数字,
取万位,就要/10000%10,主要看前面的数字取什么位
取个位,就要/1%10 //number%10 = number/1%10
LightBuf[0]= DuanMa[num%10]; //取个位/ number%1/10
LightBuf[1]= DuanMa[num/10%10];//取十位 number%10/10
LightBuf[2]= DuanMa[num/100%10];//取百位 number%100/10
LightBuf[3]= DuanMa[num/1000%10];//取千位 number%1000/10
参考资料
1.百度百科https://baike.baidu.com/item/74LS138/7761037?fr=aladdin
2. 普中单片机论坛http://prechin.net/