基于单片机的多功能电子钟设计

文章目录


前言

💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗
👇🏻 精彩专栏 推荐订阅👇🏻
单片机设计精品实战案例
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人

资料获取

文章底部名片,详细资料联系我。

设计介绍

随着电子技术行业的迅猛发展,电子产品的市场需求量增多,许多传统产品受到前所未有的冲击。电子钟是日常生活中的必需品,但传统电子钟功能单一,不能很好地满足人们日常的需求。多功能电子钟解决了这些问题,不仅拥有传统电子钟的功能,还拥有显示日期、温度测试、电子闹钟等常用功能,大大满足了人们的需求[1]。

多功能电子时钟是采用数字电路实现对时、分、秒数字显示的计时装置,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、通断动力设备、甚至各种定时电气的自动启用等,所有这些都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义[2]。

当前市场上已有现成的数字钟集成电路芯片出售,价格较便宜。由于数字集成电路技术的发展,使数字钟具有走时准确,性能稳定,携带方便等特点,是目前人们生活和工作不可或缺的报时用品。国内厂家的产品拥有时间、日期、温度、夜光、贪睡功能、倒计时、顺计时、省电模式、多组闹钟、可循环显示、多档亮度调节、12/24时制转换、调节亮度、遥控操作等功能。国外的时钟企业也已经研发出了价格低廉、封装小,功能更齐全的且具有时基软件调校功能(TTF)及振荡器停振自动检测功能的时钟芯片。

在实际生活中数字式电子钟的设计方法有很多钟,可用中小规模集成电路组成电子钟;也可以利用专用的电子钟芯片配以显示电路及其所需要的外围电路组成电子钟;还可以利用单片机来实现电子钟等等。如果用数字电路来完成,所设计的电路相当复杂,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高[3]。而利用单片机实现的电子钟具有编程灵活、便于电子钟功能的扩充(即可用该电子钟发出各种控制信号)、精确度高等特点,被广泛应用。

本次设计是基于单片机的定时计时功能而设计的一款以单片机为核心控制的电子钟,具有多项显示和控制功能,并且能够实现实时显示时、分、秒;具有闹钟、秒表功能;实时显示环境的温度、湿度、二氧化碳等信息。

功能介绍

课题研究方案:基于单片机AT89S52的实时多功能电子钟由时钟、微控制器、键盘和液晶显示、温湿度测量及显示、PM2.5、CO2测量及显示、蜂鸣器等部分组成。整个系统工作时,首先对各个测量模块进行初始化设置,使其产生的相应信号(如时钟模块产生时间信号、温湿度测量模块产生的温湿度信号等)可以通过键盘对其进行调整与校正以及完成其他控制功能,然后由液晶模块显示时间信息,包括年、月、日、时、分、秒、星期、温湿度、空气质量等信息,蜂鸣器模块用于整点报时功能。

课题主要研究内容与技术参数:主要研究是一款以单片机为核心,且具有多项显示和控制功能的多功能电子钟。从而整个系统能够实现实时显示时、分、秒;具有闹钟、秒表功能;实时显示环境的温度、湿度、二氧化碳等信息。具体的技术参数如下:

1.点阵式液晶显示器或 LED 显示;

2.能够实时显示时、分、秒,以 24 时计时方式;

3.具有快速校准时、分秒的功能;

4.时钟具有整点报时的功能;

5.具有秒表功能,秒表精度 0.1 秒,具有启动、暂停及清零功能;

6.具有闹钟的功能,可通过按钮关闭该提醒音;

7.可显示环境的温度和湿度等功能,温度检测精度±0.5℃;湿度检测精度±2%RH。

8.可以检测 PM2.5,测量精度为±10%;

9.可检测 CO2 浓度,测量精度为±5%。

程序代码部分参考

/*************************************************************
                      电子时钟

补充说明:
***************************************************************/
#include<reg52.h>		   //头文件
#include<LCD1602.h>
#include<DS1302.h>
#include<DHT11.h>
#include<AT24C02.h>
#include<INTERRUPT.h>
#include<ADC0832.h>
#include<SGP30.h>

#define uchar unsigned char//宏定义
#define uint unsigned int

/***********************引脚定义***********************/ 	
sbit key_mode = P1^0;	 //设置键
sbit key_jia  = P1^1;	 //加键
sbit key_jian = P1^2;	 //减键
sbit key_ok   = P1^3;	 //确定键
sbit key_miao = P1^4;	 //秒表键

sbit buzz     = P2^7;	 //蜂鸣器
sbit PM_out   = P3^2;    //粉尘传感器
/***********************变量定义***********************/
uchar set_f=0;		//设置选择标记,=0非设置,=1设置
uchar num;			//计数变量
uchar naozhong[3];	//闹钟-时、闹钟-分、闹钟-开关
bit   miaobiao_f=0;	//秒表标记位,=0非秒表模式,=1秒表模式
bit   baoshi_f=0;	//报时标记位,=1整点报时

uint PM25=0;	//存储实测PM2.5值

uint pm25_data[10];	//历史最近10个PM2.5值,以便求平均减少测量误差

uchar max=184;  //AD最大值
uchar min=16;   //AD最小值

/********************************************************
函数名称:void delayms(uint ms)
函数作用:毫秒延时函数
参数说明:
********************************************************/ 
void delayms(uint ms)
{
	unsigned char i=100,j;
	for(;ms;ms--)
	{
		while(--i)
		{
			j=10;
			while(--j);
		}
	}
}
/********************************************************
函数名称:void delayus(uint us)
函数作用:US延时函数
参数说明:
********************************************************/
void delayus(uint us)
{
    while( --us ) ;
}
/********************************************************
函数名称:void baoshi(uchar i)
函数作用:整点报时函数
参数说明:i为蜂鸣器响的次数
********************************************************/ 
void baoshi(uchar i)
{
	uchar j;
	for(j=0;j<i;j++)//循环i次
	{
		buzz=0;		//蜂鸣器鸣叫
		delayms(20);//延时
		buzz=1;		//关闭蜂鸣器鸣叫
		delayms(20);//延时
	}
}
/********************************************************
函数名称:void display(void)
函数作用:正常显示时间、温度函数
参数说明:
********************************************************/ 
void display(void)
{
	//显示时间
	LCD_disp_char(0,1,ASCII[time[2]/10]);//显示时【0:表示第1列,2:表示第2行,所有关于显示都一样】
	LCD_disp_char(1,1,ASCII[time[2]%10]);
	LCD_disp_char(2,1,':');
	LCD_disp_char(3,1,ASCII[time[1]/10]);//显示分【3:表示第4列,2:表示第2行,所有关于显示都一样】
	LCD_disp_char(4,1,ASCII[time[1]%10]);
	LCD_disp_char(5,1,':');
	LCD_disp_char(6,1,ASCII[time[0]/10]);//显示秒
	LCD_disp_char(7,1,ASCII[time[0]%10]);

	//判断整点报时
	if(time[0]==0&&time[1]==0&&baoshi_f==0)//判断是否为整点
	{
		baoshi_f=1;				   //标记整点报时开启
		if(time[2]%12==0)	   //根据当前时间,控制蜂鸣器鸣叫次数
			baoshi(12);
		else
			baoshi(time[2]%12);//12小时制			
	}
	if(time[0]>10&&time[1]==0)	   //整点报时结束
		baoshi_f=0;				   //重置整点报时标志

	//判断闹钟
	if(time[2]==naozhong[0]&&time[1]==naozhong[1]&&time[0]==0&&naozhong[2]==1)
		buzz=0;//闹钟时间到,开启闹钟
	if(time[1]!=naozhong[1])
		buzz=1;//闹钟结束关闭闹钟

	//显示温度
	if(DHT11_Check())
	{
		if(time[0]%6>2)
		{
			LCD_disp_char(10,1,Temp_H/10+0x30);
			LCD_disp_char(11,1,Temp_H%10+0x30);
			LCD_disp_char(12,1,'.');
			LCD_disp_char(13,1,Temp_L%10+0x30);
			LCD_disp_char(14,1,0x00);			 //显示自定义字符'°'
			LCD_disp_char(15,1,'C');			 //显示'C'
		}
		else
		{
			LCD_disp_char(10,1,' ');
			LCD_disp_char(11,1,ASCII[Humi_H%100/10]);
			LCD_disp_char(12,1,ASCII[Humi_H%10]);
			lcd1602_write_character(13,1,"%RH");		
		}
	}
	//显示PM2.5值
	LCD_disp_char(0,2,ASCII[PM25/100]);	
	LCD_disp_char(1,2,ASCII[PM25%100/10]);
	LCD_disp_char(2,2,ASCII[PM25%10]);
	lcd1602_write_character(3,2,"ug/m3");

	//显示CO2值
	LCD_disp_char(9,2,ASCII[CO2/1000]);	
	LCD_disp_char(10,2,ASCII[CO2%1000/100]);
	LCD_disp_char(11,2,ASCII[CO2%100/10]);
	LCD_disp_char(12,2,ASCII[CO2%10]);
	lcd1602_write_character(13,2,"PPM");
}
/********************************************************
函数名称:void display2()
函数作用:显示调整日期、时间函数
参数说明:
********************************************************/ 
void display2()
{
	num++;

	lcd1602_write_character(0,1,"Set time:");
	
	if(num%2==0)	  //偶数次显示,奇数次不显示。这样就会有闪烁效果,可以清楚看到当前设置的是哪个值
	{
		LCD_disp_char(4,2,ASCII[time[2]/10]); //显示时
		LCD_disp_char(5,2,ASCII[time[2]%10]);
		LCD_disp_char(6,2,':');  
		LCD_disp_char(7,2,ASCII[time[1]/10]); //显示分
		LCD_disp_char(8,2,ASCII[time[1]%10]);	   
		LCD_disp_char(9,2,':');
		LCD_disp_char(10,2,ASCII[time[0]/10]);//显示秒
		LCD_disp_char(11,2,ASCII[time[0]%10]);
	}	
	else			 //奇数次不显示
	{
		switch(set_f)//根据当前设置的内容,对应位置闪烁
		{
			case 1: lcd1602_write_character(4,2,"  "); break;
			case 2: lcd1602_write_character(7,2,"  "); break;
			case 3: lcd1602_write_character(10,2,"  "); break;
			default: break;
		}
	}	
}
/********************************************************
函数名称:void display3()
函数作用:显示调整闹钟函数
参数说明:
********************************************************/ 
void display3()
{
	num++;

	lcd1602_write_character(0,1,"Set alarm clock");
	if(num%2==0)	//偶数次显示,奇数次不显示。这样就会有闪烁效果,可以清楚看到当前设置的是哪个值
	{	
		LCD_disp_char(3,2,ASCII[naozhong[0]/10]);//显示闹钟-时
		LCD_disp_char(4,2,ASCII[naozhong[0]%10]);
		LCD_disp_char(5,2,':');  
		LCD_disp_char(6,2,ASCII[naozhong[1]/10]);//显示闹钟-分
		LCD_disp_char(7,2,ASCII[naozhong[1]%10]);

		if(naozhong[2]%2==0)
			lcd1602_write_character(9,2,"OFF"); //显示闹钟-开/关
		else
			lcd1602_write_character(9,2,"ON ");	
	}
	else			 //奇数次不显示
	{
		switch(set_f)//根据当前设置的内容,对应位置闪烁
		{
			case 4: lcd1602_write_character(3,2,"  "); break;
			case 5: lcd1602_write_character(6,2,"  "); break;
			case 6: lcd1602_write_character(9,2,"   "); break;
			default: break;
		}
	}
}
/********************************************************
函数名称:void display4(void)
函数作用:显示秒表计时函数
参数说明:
********************************************************/ 
void display4()
{
	lcd1602_write_character(0,1,"Seconds counter");	 //000:00.0
	LCD_disp_char(4,2,ASCII[fens/100]);	  //显示秒表-分
	LCD_disp_char(5,2,ASCII[fens%100/10]);
	LCD_disp_char(6,2,ASCII[fens%10]);
	LCD_disp_char(7,2,':');
	LCD_disp_char(8,2,ASCII[times/10]);	  //显示秒表-秒
	LCD_disp_char(9,2,ASCII[times%10]);
	LCD_disp_char(10,2,'.');
	LCD_disp_char(11,2,ASCII[T0_num/2]);  //显示秒表-分秒
}
/********************************************************
函数名称:void scan(void)
函数作用:按键查询处理函数
参数说明:
********************************************************/ 
void scan(void)
{
	//设置键
	if(key_mode==0&&miaobiao_f==0)			   //按键按下
	{  
		delayms(7);			   //延时消抖
		if(key_mode==0)		   //再次确认按键按下
		{
			buzz=1;		   //进入设置关闭闹钟声光提示
			if(set_f==0||set_f==3||set_f==6)     //进入设置先清除屏幕,显示设置部分
			{
				Writeds1302 (WRITE_PROTECT,0X00); //禁止DS1302写保护
				LCD_write_command(0x01);          //清除屏幕显示
				delay_n40us(100);		          //延时等待全部清除完毕
			}
			set_f++;							  //设置变量+1

			if(set_f>6)						  //全部设置完成,退出设置
			{									  
				set_f=0;						  //重置设置变量	
				AT24C02_write_date(0,naozhong[0]);//写入【闹钟-时】数据保存
				AT24C02_write_date(1,naozhong[1]);//写入【闹钟-分】数据保存
				AT24C02_write_date(2,naozhong[2]);//写入【闹钟-开关】数据保存
				
				Writeds1302 (WRITE_MINUTE,(time[1]/10)*16+time[1]%10);//将设置好的时间写入DS1302
				Writeds1302 (WRITE_SECOND,(time[0]/10)*16+time[0]%10);

				LCD_write_command(0x01);          //清除屏幕显示
				delay_n40us(100);		          //延时等待全部清除完毕
			}			
		}
		while(!key_mode);//等待按键松开
	}
	//确定
	if(key_ok==0)		       //按键按下
	{
		delayms(7);			   //延时消抖
		if(key_ok==0&&set_f!=0)//再次确认按键按下,并且当前处于设置模式
		{
			set_f=0;						  //重置设置变量	
			AT24C02_write_date(0,naozhong[0]);//写入【闹钟-时】数据保存
			AT24C02_write_date(1,naozhong[1]);//写入【闹钟-分】数据保存
			AT24C02_write_date(2,naozhong[2]);//写入【闹钟-开关】数据保存	
			
			Writeds1302 (WRITE_MINUTE,(time[1]/10)*16+time[1]%10);//将设置好的时间写入DS1302
			Writeds1302 (WRITE_SECOND,(time[0]/10)*16+time[0]%10);

			LCD_write_command(0x01);          //清除屏幕显示
			delay_n40us(100);		          //延时等待全部清除完毕
		}
		else
			if(key_ok==0&&buzz==0)	  //否则,当前闹钟响起,进入暂停闹钟
			{
				buzz=1;						  //关闭蜂鸣器
			}
			else
				if(key_ok==0&&miaobiao_f==1)  //否则,秒表启停
				{
					buzz=0;
					TR0=~TR0;//切换 秒表计时-开始/暂停
					delayms(5);
					buzz=1;
				}				
		while(!key_ok);	                      //等待按键松开
	}
	//加键		
	if(key_jia==0)				//按键按下
	{
		delayms(7);				//延时消抖
		if(key_jia==0&&set_f!=0)//再次判断按键按下
		{
			if(set_f==1)	  //设置时,同上
			{			
				time[2]++;
				time[2]=(time[2]/10)*16+time[2]%10;
				if(time[2]>0x23)
					time[2]=0x00;
				Writeds1302 (WRITE_HOUR,time[2]);	
			}
		
			if(set_f==2)	  //设置分,同上
			{
				time[1]++;
				time[1]=(time[1]/10)*16+time[1]%10;
				if(time[1]>0x59)
					time[1]=0x00;
				Writeds1302 (WRITE_MINUTE,time[1]);	
			}
		
			if(set_f==3)	 //设置秒,同上
			{
				time[0]++;
				time[0]=(time[0]/10)*16+time[0]%10;
				if(time[0]>0x59)
					time[0]=0x00;
				Writeds1302 (WRITE_SECOND,time[0]);	
			}
			
			if(set_f==4)	 //设置闹钟-时
			{
				naozhong[0]++;		//闹钟-时 +1
				if(naozhong[0]>23)	//判断闹钟-时 是否大于23时
					naozhong[0]=0;	//如果是,回到0时
			}
		
			if(set_f==5)    //设置闹钟-分
			{
				naozhong[1]++;		//闹钟-分 +1
				if(naozhong[1]>59)	//判断闹钟-分 是否大于59时
					naozhong[1]=0;	//如果是,回到0分	
			}
			if(set_f==6)	//设置闹钟-开/关
			{
				naozhong[2]++;		//切换闹钟开/关,0表示关,1表示开	
				if(naozhong[2]==2)
					naozhong[2]=0;
			}
		}
		if(key_jia==0&&miaobiao_f==1)//秒表模式下
		{
			T0_num=0;				 //复位秒表时间
			times=0;
			fens=0;
		}	
	}
	//减键
	if(key_jian==0)			     //按键按下
	{
		delayms(7);				 //延时消抖
		if(key_jian==0&&set_f!=0)//再次判断按键按下
		{
			if(set_f==1)	//设置时,同上
			{			
				if(time[2]==0)
					time[2]=23;
				else
					time[2]--;
				time[2]=(time[2]/10)*16+time[2]%10;
				Writeds1302 (WRITE_HOUR,time[2]);		
			}
	
			if(set_f==2)	//设置分,同上
			{
				if(time[1]==0)
					time[1]=59;
				else
					time[1]--;
				time[1]=(time[1]/10)*16+time[1]%10;
				Writeds1302 (WRITE_MINUTE,time[1]);		
			}
	
			if(set_f==3)	//设置秒,同上
			{
				if(time[0]==0)
					time[0]=59;
				else
					time[0]--;
				time[0]=(time[0]/10)*16+time[0]%10;
				Writeds1302 (WRITE_SECOND,time[0]);			
			}
			if(set_f==4)	 //设置闹钟-时,同上
			{
				if(naozhong[0]==0)
					naozhong[0]=23;
				else	
					naozhong[0]--;						
			}
	
			if(set_f==5)	//设置闹钟-分,同上
			{
				if(naozhong[1]==0)
					naozhong[1]=59;
				else	
					naozhong[1]--;
			}
			
			if(set_f==6)	//设置闹钟-开/关,同上
			{
				naozhong[2]++;			
				if(naozhong[2]==2)
					naozhong[2]=0;
			}
		}
		if(key_jian==0&&miaobiao_f==1)//秒表模式
		{
			T0_num=0;				  //复位秒表时间
			times=0;
			fens=0;
		}
	}
	//秒表键,不支持连按
	if(key_miao==0&&set_f==0)		  //否者,切换秒表模式和正常模式
	{
		delayms(7);				 //延时消抖
		if(key_miao==0)//再次判断按键按下
		{
			miaobiao_f=~miaobiao_f;	  //切换秒表模式和正常模式		
			LCD_write_command(0x01);  //清除屏幕显示
		    delay_n40us(100);		  //延时等待全部清除完毕
			if(miaobiao_f==0)		  //退出秒表模式时,关闭秒表计时
			{
				TR0=0;				  //关闭定时器
				T0_num=0;			  //重置所有秒表的时间
				times=0;
				fens=0;
			}
		}
		while(!key_miao);
	}	
}
/*********************************************************
函数名称:uchar paixu(uchar *s)
函数作用:求平均值
参数说明:uchar型使用
*********************************************************/
uchar paixu(uchar *s)
{
	uchar i;
	uint val;
	val=0;
	for(i=0;i<10;i++) 		//进行累加
		val+=s[i];	
	return val/10;			//求平均数并返回
}

/*********************************************************
函数名称:void read_pm25()
函数作用:求PM2.5值
参数说明:
*********************************************************/
void read_pm25()
{
	uchar i;
	uchar temp[10];
	for(i=0;i<10;i++)					  //连续采集十个数据
	{	
		PM_out=1;						  //控制输出高电平
		delayus(34);					  //延时
		_nop_();
		_nop_();
		ADC0832_read(0);				  //采集AD值
		delayus(4);
		_nop_();
		_nop_();
		PM_out=0;						  //控制输出低电平
		delayus(1209);					  
		temp[i]=ADC_date;				  //记录AD值
	}
	ADC_date=paixu(temp);				  //求本次采集的十个数据平均值

	if(ADC_date>max)					  //记录历史最大值
		max=ADC_date;
	if(ADC_date<min)					  //记录历史最小值
		min=ADC_date;	

	PM25=(double)((ADC_date-min)/(max-min))*520;//计算PM2.5

	for(i=0;i<9;i++)					  //记录最近十个PM2.5值数据
		pm25_data[i]=pm25_data[i+1];
	pm25_data[9]=PM25;
	PM25=paixu2(pm25_data);				  //将记录的十个PM2.5值数据取平均值
}
/********************************************************
函数名称:void mian()
函数作用:主函数
参数说明:
********************************************************/ 
void main()
{
    uchar i=200;				        //循环计数变量
	if(key_ok==0)
	{
		buzz=0;
		delayms(100);
		if(key_ok==0)
		{
			for(i=0;i<5;i++)
				AT24C02_write_date(i,0);//写入数据保存
		}
		buzz=1;
	}

	naozhong[0]=AT24C02_read_date(0);//读取存储的【闹钟-时】数据
	naozhong[1]=AT24C02_read_date(1);//读取存储的【闹钟-分】数据
	naozhong[3]=AT24C02_read_date(2);//读取存储的【闹钟-开关】数据

	SGP30_Init();               //初始化SGP30
	T0_init();					//定时器初始化
	LCD_init();					//LCD1602初始化

	lcd1602_write_pic(0x00,pic);//将自定义字符"°"写入到LCD1602中
	while(1)					//死循环
	{
		scan();					//按键检测处理
		if(miaobiao_f==0)		//非秒表模式,正常显示模式
		{
			if(set_f==0)		//非设置模式下
			{
				i++;			//循环次数+1
				if(i>30)		//循环次数达到30次,采集一次温度
				{
					i=0;		//重置循环次数
					read_pm25();     //采集PM2.5值
					DHT11_read();    //DHT11读取温湿度函数
					SGP30_Read_CO2();//从SGP30读数据CO2
					Read_time();	//读取DS1302时间
				}
				display();		//更新显示数据
			}
			else
				if(set_f<4)		//设置时间模式
				{				
					Read_time();//读取时间
					display2();	//显示校准时间界面
				}
				else			//设置闹钟模式
					display3();	//显示设置闹钟界面
		}
		else					//秒表模式
			display4();
	}
}

设计清单

元件清单
'双掷开关
'蜂鸣器
STC89C51
下载口

具体实现截图



参考文献

[1]王瀚增,姜欣欣.基于C51单片机的多功能电子钟系统设计与仿真[J].通信电源技术,2018,35(02):117-119.

[2]李刚仁,王进. 基于单片机AT89S52的实时电子钟的Proteus仿真[J]. 公路与汽运,2011,(02):20-22+54.

[3]卢超. 基于单片机的数字电子钟的设计与制作[J]. 大庆师范学院学报,2006,(05):48-53.

[4]金子涵, 任致远, 史旭东,王胜铎. 基于Multisim 14仿真设计的多功能数字电子钟[J]. 电子产品世界, 2021, 28(06): 94-97.

[5]陈敏. 基于51单片机的多功能电子钟设计[J]. 轻工科技, 2023, 39(01): 105-108.

[6]邵英淼, 李晶晶, 马丽娜等. 基于无线通信的多功能室内环境检测系统设计[J]. 无线互联科技, 2020, 17(09): 1-2.

[7]张丽红, 张国祥. 基于51单片机的电子钟系统设计与仿真[J]. 电子世界, 2018(20): 134-135.

[8]张婷. 基于单片机的电子钟的设计与仿真[J]. 山西电子技术, 2017(06): 14-16.

[9]尹克岩. 基于单片机的多功能数字钟的设计[J]. 电子制作, 2017(15): 68-69+54.

[10]赵海雁, 闫强. 基于单片机多功能的电子钟系统设计[J]. 山西电子技术, 2017, (01): 58-61.

[11]马忠梅, 李元章, 王美刚,王拓, 单片机的C语言应用程序设计(第6版). 北京航空航天出版社,2017.

[12]王会良,王东锋,董冠强,单片机C语言应用100例. 电子工业出版社,2017.

[13]刘波. 51单片机应用开发典型范例基于PROTEUS仿真. 电子工业出版社, 2014.

[14]马修水,钟伟红,陈琢,刘西琳.传感器与检测技术,浙江大学出版社, 2016.5

[15]赵海雁, 闫强. 基于单片机多功能的电子钟系统设计[J]. 山西电子技术, 2017,(01): 58-61.

[16]叶青. 基于51单片机的多功能数字电子钟的设计[J]. 山东工业技术,2016,(10): 158-160.

[17]刘昕,杨峰,谢晋.基于单片机AT89C52的多功能电子钟设计[J].信息化研究,2010,36(04): 61-64.

[18]张淑骅. 基于单片机的温度电子钟显示系统[J]. 科技信息,2009,(33): 58+46.

[19]贺媛, 李昕, 马健, 纪永成. 室内二氧化碳浓度监测报警器设计[J]. 吉林大学学报(信息科学版),2023,41(05): 827-831.

[20]薛青. 多功能电子钟的设计与实现[J]. 黑龙江科技信息,2017,(09): 95.

[21]Vinay Divakar. Design and Implementation of Microcontroller Based Temperature Data Logging System[J]. International Journal of Engineering and Advanced Technology (IJEAT),2013,3(2).

[22]Jun Xia Zhang, Bing Wang, Ya Ning Song. Exploration of Humidity Data Acquisition System Based on Single Chip Microcomputer[J]. Advanced Materials Research, 2013, 2526(753-755).

[23]Jian Huang. Design of Electronic Clock based on STM32[J]. IOP Conference Series: Materials Science and Engineering,2017,242(1).

[24]Wen Haokang,Zheng Qiang. Design of a High Precision Digital Clock Based on Single Chip Microcomputer[J]. 人工生命とロボットに関する国際会議予稿集,2021,26.

[25]Hu X., Chen T.,Zhao N... Research on rail temperature measuring meter based on DS18B20 and STC12C series MCU[J]. RISTI - Revista Iberica de Sistemas e Tecnologias de Informacao,2016,2016(E8).

设计获取

文章下方名片联系我即可~

精彩专栏推荐订阅:在下方专栏👇🏻

毕业设计精品实战案例

收藏关注不迷路!!

🌟文末获取设计🌟

相关推荐
@@庆39 分钟前
任务中断的两套API函数(改进FormISR的实时性)资源管理_互斥操作的本质(解决DH11经常出错的问题)
arm开发·stm32·单片机·嵌入式硬件·freertos
mftang1 小时前
STM32 Nucleo-64 boards板卡介绍
stm32·单片机·嵌入式硬件
code_snow2 小时前
STM32-- 技巧-延时
stm32·单片机·嵌入式硬件
霖霖7142 小时前
基本功能实现
单片机·嵌入式硬件
Shaun_青璇2 小时前
stm32 点亮LED
stm32·单片机·嵌入式硬件·mcu·物联网
7yewh2 小时前
嵌入式硬件实战基础篇(三)-四层板PCB设计-步进电机驱动(TMC2208/TMC2209)
驱动开发·嵌入式硬件·mcu·物联网·硬件架构·硬件工程·pcb工艺
辞丶1763 小时前
STM32基于HALL库的串口以及DMA(串口总篇)
stm32·单片机·嵌入式硬件
相醉为友4 小时前
003 STM32基础、架构以及资料介绍——常识
stm32·单片机·嵌入式硬件
HZU_Puzzle4 小时前
【6】STM32·FreeRTOS·列表和列表项
stm32·单片机·嵌入式硬件
弥途5 小时前
半导体、晶体管、集成电路、芯片、CPU、单片机、单片机最小系统、单片机开发板-概念串联辨析
单片机