八位一体共阴极数码管显示电子时钟+闹铃+温度检测

这是一篇关于如何使用单片机和嵌入式硬件制作一个结合温度检测功能的八位一体电子时钟的教程。作者强调在焊接前要进行仿真,并提供了元器件引脚图和参考代码,提醒读者注意共阴极数码管的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

老师一枚,服务于学生,制作了电子时钟融合温度检测的系统。

首先在焊接式前一定要仿真,更要注意仿真引脚和实际引脚的不同。

下面这个链接是常用元器件实物引脚图和解释。

优快云icon-default.png?t=O83Ahttps://mp.youkuaiyun.com/mp_blog/creation/editor/127420613参考代码:

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit sounder=P3^7;
sbit qiehuan=P1^5;
sbit jia=P1^6;
sbit jian=P3^0;


sbit DS=P3^6; 
sbit LED1 = P3^4;
sbit LED2 = P3^5;
sbit LED3 = P1^2;
sbit LED4 = P1^4;
sbit anjian=P1^0;
uint temp;            
uchar flag1;
uint a,b;
uchar d=0; // 切换标志位
uchar  hour0,minu0,sec0,hour1,minu1,sec1,h1,h2,m1,m2,s1,s2,k,s; 
unsigned char code select[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f};	   //共阴极数码管
unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,	 //带小数点数字
                        0x87,0xff,0xef};

void DDDD(void);
void keyscan();
void init();
void delay(uchar z);
void display(uchar,uchar,uchar);
void sounde();
void delay1(unsigned int count);											
void dsreset(void);
void tmpwritebyte(unsigned char dat);
void tmpchange(void);
void dis(unsigned int temp);
void AAAA(void);


void main()
{ 
init();
while(1)
{    	


if(anjian==0)
{
delay(10);
while(anjian==0);
DDDD();
} 

keyscan();

while(s==1) 
{ 
keyscan(); 
display(hour1,minu1,sec1);
}
display(hour0,minu0,sec0);    

}
}

void init()
{
a=0;
b=0;

s=0;
hour0=0;
minu0=0;
sec0=0;

hour1=0;
minu1=0;
sec1=0;
TMOD=0x11;     

TH1=(65536-50000)/256; //50ms
TL1=(65536-50000)%256;
EA=1;
   
EX1=1;    

ET1=1;
   
IT1=1;

PX1=1;
   
TR1=1;      
}
void ex1_int() interrupt 2
{
s++;
if(s==3)
s=0;
}
void timer1_int() interrupt 3 //T1  
{
TH1=(65536-50000)/256;		   //50ms
TL1=(65536-50000)%256;
if(s==2)
{
if(hour1==hour0 && minu0==minu1&&sec0==sec1)
	
         sounde();//蜂鸣器


}
b++;
if(b==20)		  //1s
{
b=0;
sec0++;
if(sec0==60)	  //1m
{  
sec0=0;
minu0++;
if(minu0==60)	  //1h
{
minu0=0;
hour0++;
if(hour0==24)
hour0=0;
}
}
}
}

void keyscan()		   //按键扫描
{
if(s==0)
{
if(qiehuan==0)
   {
		d++;
		if(d>3)
		{
		  d=0;
		}
		while(qiehuan==0);
	}
 if (jia==0)
	{
			switch (d)
			{
				case 1 : sec0++; 
					if(sec0==60)
				{
				 sec0=0;
				}
				break;
				case 2 : minu0++;
				if( minu0==60)
				{
				  minu0=0;
				}
				 break;
				case 3 : hour0++; 
				if( hour0==24)
				{
				  hour0=0;
				}  
				break;
			}
			   while(jia==0);
		}
  if (jian==0)
	{
			switch (d)
			{
				case 1 : sec0--; 
				if(sec0==-1)
				{
				 sec0=59;
				}
				break;
				case 2 : minu0--;
				 if( minu0==-1)
				{
				  minu0=59;
				}
				 break;
				case 3 : hour0--;
				  if( hour0==-1)
				{
				  hour0=23;
				}  
				 break;
			}
			while(jian==0);
		}
	}
	if(s==1)
	{ 
	if(qiehuan==0)
   {
		d++;
		if(d>3)
		{
		  d=0;
		}
	   while(qiehuan==0);
	}
 if (jia==0)
	{
			switch (d)
			{
				case 1 : sec1++;
					if(sec1==60)
				{
				 sec1=0;
				}
				 break;
				case 2 : minu1++;
				if( minu1==60)
				{
				  minu1=0;
				}
				 break;
				case 3 : hour1++;
				if( hour1==24)
				{
				  hour1=0;
				}  
				 break;
			}
		   while(jia==0);
		}
  if (jian==0)
	{
			switch (d)
			{
				case 1 : sec1--; 
				 	if(sec1==-1)
				{
				 sec1=59;
				}
				break;
				case 2 : minu1--;
				 if( minu1==-1)
				{
				  minu1=59;
				}
				 break;
				case 3 : hour1--;
				if( hour1==-1)
				{
				  hour1=23;
				}  
				 break;
			}
			while(jian==0);
		}
	}
 }
void display(uchar hour,uchar minu,uchar sec)
{
h1=hour/10;
h2=hour%10;
m1=minu/10;
m2=minu%10;
s1=sec/10;
s2=sec%10;
P2=0xff;
P0=table[h1];
P2=select[7];
delay(1);
P2=0xff;
P0=table[h2];
P2=select[6];
delay(1);
P2=0xff;
P0=0x40;;
P2=select[5];
delay(1);
P2=0xff;
P0=table[m1];
P2=select[4];
delay(1);
P2=0xff;
P0=table[m2];
P2=select[3];
delay(1);
P2=0xff;
P0=0x40;
P2=select[2];
delay(1);
P2=0xff;
P0=table[s1];
P2=select[1];
delay(1);
P2=0xff;
P0=table[s2];
P2=select[0];
delay(1);
}

//蜂鸣器
void sounde()
{
		LED1=~LED1;
    sounder=~sounder;	
	  
}


void delay(uchar z)
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}


void delay1(uint count)      //delay
{
  uint i;
  while(count)
  {
    i=200;
    while(i>0)
    i--;
    count--;
  }
}
void dsreset(void)       //send reset and initialization command
{
  uint i;
  DS=0;
  i=103;
  while(i>0)i--;
  DS=1;
  i=4;
  while(i>0)i--;
}

bit tmpreadbit(void)       //read a bit
{
   uint i;
   bit dat;
   DS=0;i++;          //i++ for delay
   DS=1;i++;i++;
   dat=DS;
   i=8;while(i>0)i--;
   return (dat);
}

uchar tmpread(void)   //read a byte date
{
  uchar i,j,dat;
  dat=0;
  for(i=1;i<=8;i++)
  {
    j=tmpreadbit();
    dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
  }
  return(dat);
}

void tmpwritebyte(uchar dat)   //write a byte to ds18b20
{
  uint i;
  uchar j;
  bit testb;
  for(j=1;j<=8;j++)
  {
    testb=dat&0x01;
    dat=dat>>1;
    if(testb)     //write 1
    {
      DS=0;
      i++;i++;
      DS=1;
      i=8;while(i>0)i--;
    }
    else
    {
      DS=0;       //write 0
      i=8;while(i>0)i--;
      DS=1;
      i++;i++;
    }

  }
}

void tmpchange(void)  //DS18B20 begin change
{
  dsreset();
  delay1(1);
  tmpwritebyte(0xcc);  // address all drivers on bus
  tmpwritebyte(0x44);  //  initiates a single temperature conversion
}

uint tmp()               //get the temperature
{
  float tt;
  uchar a,b;
  dsreset();
  delay1(1);
  tmpwritebyte(0xcc);
  tmpwritebyte(0xbe);
  a=tmpread();
  b=tmpread();
  temp=b;
  temp<<=8;             //two byte  compose a int variable
  temp=temp|a;
  tt=temp*0.0625;
  temp=tt*10+0.5;
  return temp;
}

void dis(uint temp)			//显示程序
{
   uchar A1,A2,A2t,A3,i;
   A1=temp/100;
   A2t=temp%100;
   A2=A2t/10;
   A3=A2t%10;
 i=0;
while(i<20)
{
     i++;

		P2=0xff;
		P0=table[A1];
		P2=select[7];
		delay1(1);
			
		P2=0xff;
		P0=table1[A2];
		P2=select[6];
		delay1(1);
			
		P2=0xff;
		P0=table[A3];
		P2=select[5];
		delay1(1);
	 
}
 }

void DDDD(void)
{  
	
 uchar a;
	
  do
  { 
    tmpchange();
	for(a=10;a>0;a--)
  	{   
  		dis(tmp());
  	}
		
		//高于***值蜂鸣器慢响并led1闪烁
	if(temp>=380)	 //当温度超过38度(仅作试验用,实际可设为其他更高的值),蜂鸣器便会报警。
		{
		LED1=0;
				LED2=0;
			 sounder=0;
			  delay1(50);
			 sounder=1;
			  LED1=1;
			  LED2=1;	
			   }
		else
		{	if(temp>=320)
			{
				LED1=0;
			 sounder=0;
			  delay1(100);
			 sounder=1;
			  LED1=1;
			}
		}

		//低于***值蜂鸣器慢响并led1闪烁
	if(temp<=230)	 //当温度低于23度  慢响单闪烁
		{
		 LED3=0;
		 LED4=0;
			  sounder=0;
			  delay1(50);
			  sounder=1;
			    LED3=1;
			    LED4=1;
				}
	else
	{		if(temp<=270)/低于27度  快响双闪烁
			{
				  LED3=0;
			  sounder=0;
			  delay1(100);
			  sounder=1;
			    LED3=1;
			  
			}
		}
		if(anjian == 0) 
		{ delay(10);
		  while(anjian==0);
			break;
		 }
}while(1);
}

参考原理图:

各位同学,你检索到我的文件了,请注意,这是共阴极数码管,请务必理解程序后再焊接。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值