单片机数字时钟/闹钟

这篇具有很好参考价值的文章主要介绍了单片机数字时钟/闹钟。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

详细代码讨论加我QQ:1271370903

1.设计概述:

  1. 由单片机 AT89C51芯片和动态数码显示管为核心,辅以必要的电路,构成一个数字时钟。
  2. 时钟显示方式为:时-分-秒。时钟计时周期为24小时,显满刻度为“23时59分59秒”。
  3. 具有调整功能。设置有三个按键,分别对时、分、秒进行调整校对。
  4. 外加可当闹钟使用,闹钟数可设三个,提示音由蜂鸣器电路发出。

**2.设计思想:**数字时钟主要由 AT89C51、显示模块、控制模块和计时运算模块四大部分组成。其中,控制模块和计时运算模块主要对时、分、秒的数值显示和调整进行操作,并且秒计算到60时,自动清零并向分进1﹔分计算到60时,自动清零并向时进1﹔时计算到24时,自动清零。这样,就形成了循环计时,显示模块主要用来显示当前计数值。AT89C51是整个设计的核心,主要用来产生定时中断,传输数据和控制各部件工作。
3.硬件框架图:
单片机数字时钟/闹钟
4.组成
(1)单片机最小系统的组成详解(电源、晶振、复位电路)
(2)数码管显示器
(3)闹钟铃声电路
(4)按键电路
5.5. 电路总体仿真图
单片机数字时钟/闹钟
6.仿真开始
单片机数字时钟/闹钟
7.主程序流程图
单片机数字时钟/闹钟
8.相关代码文章来源地址https://www.toymoban.com/news/detail-512576.html

sbit key1=P1^0;             //设置   
sbit key2=P1^1;				//加
sbit key3=P1^2;				//减
sbit key4=P1^3;				//止闹音
sbit beep=P3^4;				//闹音蜂鸣器
//************************数码管显示的数值**************************
uchar code table[]=	{
						0x3f,0x06,0x5b,0x4f,0x66,0x6d,
						0x7d,0x07,0x7f,0x6f,0x40,0x00
					};               	
//****************************函数声明******************************
void jia();    
void jian(); 
//********************数组定义,数组内含有8个数值******************
uchar table1[8],table2[8],table3[8],table4[8];
//**************************时间显示初始值**************************
uchar shi=12,fen=0,miao=0;  
//**************************定义全局变量****************************
uchar shi1,fen1,miao1,shi2,fen2,miao2,shi3,fen3,miao3;
uchar shi4,fen4,miao4;
uchar flag, flag1, wss, cnt, cnt1, alm1, alm2, alm3;
//    1秒   等时  位闪 次数 校时   闹1  闹2   闹3
uint flag2;
//   蜂鸣 
//*********************延时函数,用于动态扫描数码管*****************
void delay(uchar i)                                     
{  
	uchar x,y;
   	for(x=i;x>0;x--)
     	for(y=120;y>0;y--);
}
//*******************************初始化函数*************************
void init()   
{  
	TMOD=0x01;         //工作方式1										
   	TH0=0x3c;          //定时时间为:50ms	(65536-50000)/256
   	TL0=0x0b0;         //(65536-50000)%256
	EA=1;              //开总中断
   	ET0=1;             //打开定时器
   	TR0=1;             //启动定时器
	beep=1;
}
//********************显示子函数,用于显示时间数值*****************
void display()  
{  
	uchar i,j;
   	if(cnt!=10||wss==0)
    { 
		table1[0]=miao%10;        //分离秒的个位与十位
       	table1[1]=miao/10;
	}
	else
	 	table1[0]=table1[1]=11;
	if(cnt!=11||wss==0)
	{ 
		table1[3]=fen%10;         //分离分的个位与十位
       	table1[4]=fen/10;
	}
	else
	  	table1[3]=table1[4]=11;
	if(cnt!=12||wss==0)
	{ 
		table1[6]=shi%10;         //分离时的个位与十位
       	table1[7]=shi/10;
	}
	else
		table1[6]=table1[7]=11;
    table1[2]=table1[5]=10;
    j=0xfb; 
    for(i=0;i<=7;i++)          //从秒到时的扫描
    {  
		P2=j;
        P0=table[table1[i]];  //显示数值
        delay(10);
        j=_cror_(j,1);        //循环右移 
    }
}
//*******************显示子函数,用于显示定时1时间*****************
void display1() 
{  
	uchar i,j;
   	if(alm1==0)
    { 
		if(cnt!=1||wss==0)
	    { 
			table2[0]=miao1%10;        //以下含义同上
           	table2[1]=miao1/10;
		}
	   	else
	      	table2[0]=table2[1]=11;
	   	if(cnt!=2||wss==0)
	    { 
			table2[3]=fen1%10;
           	table2[4]=fen1/10;
		}
	   	else
	     	table2[3]=table2[4]=11;
	   	if(cnt!=3||wss==0)
	    { 
			table2[6]=shi1%10;
           	table2[7]=shi1/10;
		}
	   	else
	     	table2[6]=table2[7]=11;
	}
	else
	   	table2[0]=table2[1]=table2[3]=table2[4]=table2[6]=table2[7]=10;
   	table2[2]=table2[5]=10;
   	j=0xfb;
   	for(i=0;i<=7;i++)
   	{  
		P2=j;
        P0=table[table2[i]];
		delay(10);
        j=_cror_(j,1); 
   	}
}
//********************显示子函数,用于显示定时2时间******************
void display2() 
{  
	uchar i,j;
   	if(alm2==0)
    { 
		if(cnt!=4||wss==0)
	    { 
			table3[0]=miao2%10;        //以下含义同上
           	table3[1]=miao2/10;
	   	}
	   	else
	      	table3[0]=table3[1]=11;
	   	if(cnt!=5||wss==0)
	    { 
			table3[3]=fen2%10;
           	table3[4]=fen2/10;
		}
		else
		  	table3[3]=table3[4]=11;
		if(cnt!=6||wss==0)
		{ 
			table3[6]=shi2%10;
           	table3[7]=shi2/10;
		}
		else
		 	table3[6]=table3[7]=11;
	}
	else
	   table3[0]=table3[1]=table3[3]=table3[4]=table3[6]=table3[7]=10;
   	table3[2]=table3[5]=10;
   	j=0xfb;
   	for(i=0;i<=7;i++)
    {  	
		P2=j;
        P0=table[table3[i]];
		delay(10);
        j=_cror_(j,1); 
    }
}
//***************显示子函数,用于显示定时3时间数值****************//
void display3()  
{ 
 	uchar i,j;
   	if(alm3==0)
    {  
		if(cnt!=7||wss==0)
	    { 
			table4[0]=miao3%10;        //分离秒的个位与十位
            table4[1]=miao3/10;
        }
		else
		   	table4[0]=table4[1]=11;
		if(cnt!=8||wss==0)
		{ 
			table4[3]=fen3%10;         //分离分的个位与十位
            table4[4]=fen3/10;
		}
		else
		  	table4[3]=table4[4]=11;
		if(cnt!=9||wss==0)
		{ 
			table4[6]=shi3%10;         //分离时的个位与十位
            table4[7]=shi3/10;
		}
		else
		  	table4[6]=table4[7]=11;
    }
    else
	    table4[0]=table4[1]=table4[3]=table4[4]=table4[6]=table4[7]=10;
   	table4[2]=table4[5]=10;
   	j=0xfb;                    //从秒到时的扫描
   	for(i=0;i<=7;i++)
   	{  
		P2=j;
        P0=table[table4[i]];  //显示数值
		delay(10);
        j=_cror_(j,1);        //循环右移 
   	}
}
//***********************时间子函数 *****************************//
void shijian()          
{  
	if(flag>=20)               //判断是否到一秒
    { 
		wss=~wss;
	   	flag=0;			         //到了,则标志位清零
	   	if(cnt1!=0)
	    { 
			miao4++;          //秒加1
           	if(miao4>59)    //判断秒是否到60s
            { 
				miao4=0;      //到了,则清零
                fen4++;       //分加1
                if(fen4>59)  //以下含义同上
                { 
					fen4=0;
                    shi4++;
                    if(shi4>23)
                      shi4=0;														  
                 }	
             }
        } 
	   	else
       	{ 
			miao++;          //秒加1
         	if(miao>59)    //判断秒是否到60s
           	{ 
				miao=0;      //到了,则清零
             	fen++;       //分加1
             	if(fen>59)  //以下含义同上
               	{ 
					fen=0;
                 	shi++;
                 	if(shi>23)
                   		shi=0;														  
                }	
            }
        }
    }
}
//**************************键盘扫描子函数************************//
void key_scan() 
{  
	if(key1==0)
    {  
		while(!key1)          //防止掉显
        {  
			if(cnt==1||cnt==2||cnt==3)
                display1(); 			                 	//	闹1
			if(cnt==4||cnt==5||cnt==6)
                display2();  								//	闹1
			if(cnt==7||cnt==8||cnt==9)
                display3(); 								//	闹1
			if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13)
            	display();									//	走时
        }
        cnt++;     //记下按键key1按下的次数 	          
		if(cnt==10&&cnt1==0)
		{ 
			miao4=miao;
		    fen4=fen;
			shi4=shi;
			cnt1++;
		}
		if(cnt==13)
		{ 
			cnt=0;
		    if(cnt1==1)
			{ 
				miao=miao4;
				fen=fen4;
				shi=shi4;
			}
		    cnt1=0; 
		}         
	}
   	if(key2==0)              //判断key2是否按下
   	{  
		while(!key2)          //防止掉显
        {  
			if(cnt==1||cnt==2||cnt==3)
                display1(); 
			if(cnt==4||cnt==5||cnt==6)
                display2(); 
			if(cnt==7||cnt==8||cnt==9)
                display3(); 
			if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13)
                display(); 
        }
        jia();
   	}
   	if(key3==0)              //判断key3是否按下
   	{  
		while(!key3)          //防止掉显
        {  
			if(cnt==1||cnt==2||cnt==3)
                display1(); 
			if(cnt==4||cnt==5||cnt==6)
                display2(); 
			if(cnt==7||cnt==8||cnt==9)
                display3();  
			if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13)
                display(); 
        }
        jian(); 		   //调用减1子函数           
   	}
	if(key4==0)		   //判断key4是否按下
	{
		while(!key4) 	   //防止掉
	    { 
			if(cnt==1||cnt==2||cnt==3)
		    {  
				alm1=~alm1;
			    display1();
			}
		    if(cnt==4||cnt==5||cnt==6)
		    {  
				alm2=~alm2;
			    display2();
			}
		    if(cnt==7||cnt==8||cnt==9)
		    {  
				alm3=~alm3;
			    display3(); 
			}
			if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13)
		       display();
		 } 
	}       
}
//****************************加1子函数***************************
void jia()            
{ 
	if(cnt==1)			 //判断key1按下的次数是否为1
    {  
		miao1++;		 //是,则秒加1
       	if(miao1>59)	 //判断秒是否大于60,是,则秒清零
           miao1=0;
    }
 	if(cnt==2)			 //以下含意同上
    {  
		fen1++;
        if(fen1>59)
           fen1=0;
    }
  	if(cnt==3)
    {  
		shi1++;
        if(shi1>23)
           shi1=0;
    }
  	if(cnt==4)
    {  
		miao2++;
        if(miao2>59)
           miao2=0;
    }
  	if(cnt==5)
    {  
		fen2++;
        if(fen2>59)
           fen2=0;
    }
  	if(cnt==6)
    {  
		shi2++;
        if(shi2>23)
           shi2=0;
    }
  	if(cnt==7)
    {  
		miao3++;
        if(miao3>59)
           miao3=0;
    }
  	if(cnt==8)
    {  
		fen3++;
        if(fen3>59)
           fen3=0;
    }
  	if(cnt==9)
    {  
		shi3++;
        if(shi3>23)
           shi3=0;
    }
  	if(cnt==10)          
    {  
		miao++;         
       	if(miao>59)      
          miao=0;
		cnt1++;
    }
  	if(cnt==11)          
    {  
		fen++;
        if(fen>59)
           fen=0;
		cnt1++; 
    }
  	if(cnt==12)
    {  
		shi++;
        if(shi>23)
           shi=0;
		cnt1++;
    }
}
//***************************减1子函数**************************//
void jian()    
{  
	if(cnt==1)			//判断key1按下的次数是否为1,是则秒减1
    {  
		miao1--;
        if(miao1==255)	//判断秒是否减到255,是,则秒置59
           miao1=59;
    }
   	if(cnt==2)			//以下含意同上
    {  
		fen1--;
        if(fen1==255)
           fen1=59;
    }
   	if(cnt==3)
    {  
		shi1--;
       	if(shi1==255)
           shi1=23;
    }
   	if(cnt==4)
    {  
		miao2--;
       	if(miao2==255)
           miao2=59;
    }
   	if(cnt==5)
    {  
		fen2--;
        if(fen2==255)
           fen2=59;
    }
   	if(cnt==6)
    {  
		shi2--;
        if(shi2==255)
           shi2=23;
    }
	if(cnt==7)
    {  
		miao3--;
        if(miao3==255)
            miao3=59;
    }
    if(cnt==8)
    {  
		fen3--;
        if(fen3==255)
            fen3=59;
    }
    if(cnt==9)
    {  
		shi3--;
        if(shi3==255)
            shi3=23;
    }
    if(cnt==10)          
    {  
		miao--;
        if(miao==255)  
            miao=59;
		cnt1++;
    }
    if(cnt==11)
    {  
		fen--;
        if(fen==255)
            fen=59;
		cnt1++;
    }
    if(cnt==12)
    {  
		shi--;
        if(shi==255)
            shi=23;
		cnt1++;
    }
}
//***************************闹铃子函数***************************//
void clock()           
{  
	//判断秒的数值是否相等
	if(miao==miao1&&alm1==0||miao==miao2&&alm2==0||miao==miao3&&alm3==0)
	//是,在判断分是否相等                                   
    	if(fen==fen1&&alm1==0||fen==fen2&&alm2==0||fen==fen3&&alm3==0)
	//是,再判断时是否相等	     
    		if(shi==shi1&&alm1==0||shi==shi2&&alm2==0||shi==shi3&&alm3==0)
    		{ 
				flag2=0;                       //是,则标志位,flag2清零
        		while(!(flag2==1200)&&(cnt==0)) //判断flag2是否到1200且不                          
        		{
					//             为调时状态
					if(key4==0)			         //没有,则继续驱动蜂鸣器响
					{
						while(!key4)
			    			flag2=1200;
					} 
					if(flag1>1)	       //等时方波驱动蜂鸣器
	        		{ 
						beep=~beep;
						flag1=0;
					}
            		shijian();         //调用时间子函数
            		display();         //调用显示子函数  
        		}
        		beep=1;                  //关闭蜂鸣器
			}
}
//**************************主函数********************************//
void main()
{  
	init();                         //调用初始化子函数
   	while(1)
    {  
		clock();                   //闹钟子函数 		   
        if(cnt==1||cnt==2||cnt==3) //显示子函数
           	display1(); 
		if(cnt==4||cnt==5||cnt==6)
           	display2(); 
		if(cnt==7||cnt==8||cnt==9)
           	display3(); 
		if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13)
           	display(); 
	    shijian(); 		//调用时间子函数
		key_scan();		//调用键盘扫描子函数
    }
}


到了这里,关于单片机数字时钟/闹钟的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于51单片机的数字时钟设计

    目录 一、总体概述 1、计时控制方案 2、主控制器模块 3、显示电路模块 4、调试按键模块 5、电源模块 6、闹钟声光报警模块 二、系统总体结构 1.电路图 三、系统的硬件设计与实现 1、电源电路 2、显示电路 3、单片机基本电路 4、按键电路 四、功能测试及结果分析 五、程序附

    2024年02月07日
    浏览(47)
  • 51单片机入门——(新)简易数字时钟

    实现正确稳定地显示小时(两位数)、分钟(两位数)、秒钟(两位数),同时数码管应无闪烁问题。 通过按键分别实现时、分信息的调整,方便用户对时间的校准。 加入闹铃功能在(本设计中用LED代替)。 key1 用于切换时分秒的加减。例:第一次按下后,按key2key3时“秒”加减,

    2024年02月11日
    浏览(52)
  • 【单片机】STM32单片机,RTC实时时钟,STM32F103C8T6,程序,万年历,数字时钟

    我以STM32F103C8T6为例,但STM32F103的RTC是通用的,STM32F103C8T6有一个原理图: https://qq742971636.blog.csdn.net/article/details/131288390 用纽扣电池给VBAT供电(要共地),即可实现掉电后依旧走时的能力。 主要特性(来源于STM32中文参考手册V10.pdf): 记得加标准库文件: 串口接收:

    2024年02月11日
    浏览(56)
  • 51单片机的数字时钟系统【含仿真+程序+报告+原理图】

    该系统由AT89C51单片机+DS1302时钟模块+按键模块+LCD显示模块构成。 利用51单片机实现电子时钟的功能。使用DS1302芯片作为计时设备,用LCD1602作为显示设备,按键按下可修改当前时间,按下的时候蜂鸣器会di一声。 可实现基本功能: 1、实时显示当前时间和日期 按键功能: 1、点

    2024年02月06日
    浏览(56)
  • 基于 AT89C51 单片机的数字时钟设计

    目录 1.设计目的、作用 2.设计要求 3.设计的具体实现 3.1 设计原理 3.2 硬件系统设计         3.2.1 AT89C51 单片机原理 3.2.2 晶振电路设计 3.2.3 复位电路设计 3.2.4 LED 数码管显示 3.3 系统实现 3.3.1 系统仿真与调试 3.3.2 演示结果 4.总结 附录 附录 1 附录 2 (1 )掌握 51 系列单片机的

    2024年02月01日
    浏览(62)
  • 基于52单片机的电子时钟(原理图,代码)

    所需要使用的元器件:  代码:(使用的是keil5) #include reg52.h             //调用单片机头文件 #define uchar unsigned char  //无符号字符型 宏定义    变量范围0~255 #define uint  unsigned int     //无符号整型 宏定义    变量范围0~65535   //数码管段选定义      0     1    2    

    2024年02月06日
    浏览(43)
  • 基于51单片机的电子时钟(原理图,代码)

    所需要使用的元器件:  代码:(使用的是keil5) #include reg52.h             //调用单片机头文件 #define uchar unsigned char  //无符号字符型 宏定义    变量范围0~255 #define uint  unsigned int     //无符号整型 宏定义    变量范围0~65535   //数码管段选定义      0     1    2    

    2024年02月07日
    浏览(47)
  • 单片机课设 - 电子时钟 (仿真,仿真代码,实验板代码)

    1. 主要器件 : C51单片机、8位LED数码管(共阴极)… 2. 仿真图如下: 3. 主要特点 1. 24进制显示 2. 最下方三个按钮分别控制时、分、秒 上述代码包含的主要内容: 1. T1定时方式1,用到T1中断函数 2. 每50ms溢出一次,一共20次为 1s 记一次数 3. 按键知识,消抖动... 4. 移位知识,_c

    2024年02月11日
    浏览(38)
  • 基于51单片机实现时间显示及闹钟设置

    本次为大学中的一次创新实验,当时老师叫我自己拿个单片机去玩,为了赶时间就做了个简单的时间显示和闹钟设置,因为比较简单所以也把代码附上了。 1.单片机 单片机内部内部资源:Flash——程序存储空间;RAM——数据存储空间;SFR——特殊功能寄存器。51单片机指的是

    2024年02月07日
    浏览(40)
  • 基于51单片机的数码管闹钟设计

    系统功能:利用定时器实现时钟,时钟可以通过独立按键设置,设有一个闹钟,闹钟时间可通过按键进行设置,时钟界面和闹钟界面可通过按键切换,当时钟和闹钟时间相同,蜂鸣器响,提示闹钟时间到等。 此系统重点在于:数码管动态驱动的使用方法,单片机内部定时器的

    2024年02月11日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包