51单片机学习 数码管 倒计时

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的译码电路中,扩展内存。

真值表

51单片机学习 数码管 倒计时_第1张图片

引脚功能

51单片机学习 数码管 倒计时_第2张图片

应用

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/

你可能感兴趣的:(学习笔记总结,C51单片机,单片机)