1、项目简介

  • 系统构成:本设计以STC89C52为主控芯片的单片机万年历,其硬件部分由 按键 电路, LCD1602液晶显示 电路, 时钟芯片 电路, 单片机最小系统 电路, 蜂鸣器 电路组成,软件部分由 按键扫描程序 , 液晶显示程序 , 时钟芯片驱动程序, 蜂鸣器程序组成,能实现 万年历 功能。

1.1 系统功能

  • 功能介绍:
      1. 运用C语言实现软件相关功能
      1. 该设计采用 STC89C52 芯片实现 单片机万年历 功能。
      1. 设计应具有 时间显示 , 年月日显示 等功能。
      1. 依据需求可扩展实现 农历显示 功能。
      1. 运用proteus进行仿真,实现 电路仿真 。

1.2 演示视频

2、部分电路设计

2.1 51单片机核心板电路设计

  • ‌51单片机最小系统是确保51系列单片机能够正常工作的最基本电路配置,通常包括‌电源电路、‌晶振电路、‌复位电路。这些组件共同为单片机提供稳定的工作环境和必要的时钟信号,确保单片机能够准确地执行程序指令。‌

  • 电源电路:为单片机提供稳定的工作电压,通常采用5V电源供电。电源电路的设计要保证单片机在不同工作条件下都能获得稳定的电压输出,以确保单片机的正常工作。

  • 晶振电路:提供单片机工作所需的时钟信号。晶振电路通过晶振和电容组成,为单片机提供稳定的工作脉冲,确保单片机的定时和同步需求。

  • 复位电路:实现单片机的复位功能,类似于电脑的重启。复位电路通过电容和电阻的配合,实现单片机在上电启动时的自动复位,以及通过手动按键实现复位功能,保证单片机在程序跑飞或异常情况下能够重新开始执行程序。

  • 单片机最小系统原理图如下图所示:

2.2 DS1302实时时钟电路设计

  • DS1302是Dallas公司生产的一种实时时钟芯片。它通过串行方式与单片机进行数据传送,能够向单片机提供包括秒、分、时、日、月、年等在内的实时时间信息,并可对月末日期、闰年天数自动进行调整;它还拥有用于主电源和备份电源的双电源引脚,在主电源关闭的情况下,也能保持时钟的连续运行。另外,它还能提供31字节的用于高速数据暂存的RAM。

DS1302引脚说明:

时钟芯片DS1302的接口电路及工作原理:

实物图:

2.3 DS18B20温度采集电路设计

  • ‌DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9-12位的数字值读数方式。现场温度直接以"一线总线"的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。与前一代产品不同,新的产品支持3V~5.5V的电压范围,使系统设计更灵活、方便。

其性能特点可归纳如下:

  • 1独特的单线接口仅需要一个端口引脚进行通信;
  • 2测温范围在-55℃到125℃,分辨率最大可达0.0625℃;
  • 3采用了3线制与单片机相连,减少了外部硬件电路;
  • 4零待机功耗;
  • 5可通过数据线供电,电压范围在3.0V-5.5V;
  • 6用户可定义的非易失性温度报警设置;
  • 7报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;
  • 8负电压特性,电源极性接反时,温度计不会因发热烧毁,只是不能正常工作。

其具体电路原理图如下图所示:

实物图如下:

2.4、LCD1602显示电路设计

  • ‌LCD的D0~D7分别接单片机的的P2口,作为数据线,因为P0口内部没有上拉电阻,所以外部另外加上10K的上拉电阻;P1.0—P1.2分别接LCD的RS、RW、E三个控制管脚;RV1用来调节LCD的显示灰度;BLK、BLA为背光的阴极和阳极,接上相应电平即点亮背光灯。

引脚说明:

其具体电路原理图如下图所示:

实物图:

3、单片机代码展示

3.1 DS1302时钟显示程序

/*************时钟显示***************/
void init_1602_ds1302()
{
	write_lcd2_ds1302(1,1,shi);		   //显示时
	write_lcd2_ds1302(1,4,fen);		   //显示分
	write_lcd2_ds1302(1,7,miao);	   //显示秒
	write_week(2,12,week);			   //显示星期 
	write_lcd3_18B20(1,11,temperature);	   //显示温度
	if(flag_nl == 0)  //显示阳历
	{
		write_lcd2_ds1302(2,2,nian);   //显示年
		write_lcd2_ds1302(2,5,yue);	   //显示月	
		write_lcd2_ds1302(2,8,ri);	   //显示日 	
	}
	else 			 //显示农历
	{
		write_lcd2_ds1302(2,2,n_nian);	//显示年
		write_lcd2_ds1302(2,5,n_yue);	//显示月	
		write_lcd2_ds1302(2,8,n_ri);	//显示日 		
	}			
}		

3.2 DS18B20温度采集电路

/*************读取温度的值 读出来的是小数***************/
uint read_temp()
{
	uint value;
	uchar low;			   //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序
	init_18b20();		   //初始化18b20
	write_18b20(0xcc);	   //跳过64位ROM
	write_18b20(0x44);	   //启动一次温度转换命令
	delay_uint(50);		   //转换一次温度需要时间 延时一下 

	init_18b20();		   //初始化18b20
	
	write_18b20(0xcc);	   //跳过64位ROM
	write_18b20(0xbe);	   //发出读取暂存器命令
	
 	low = read_18b20();	   //读温度低字节
	value = read_18b20();  //读温度高字节
 	value <<= 8;		   //把温度的高位左移8位
	value |= low;		   //把读出的温度低位放到value的低八位中
	value *= 0.625;	       //转换到温度值 小数
	return value;		   //返回读出的温度 带小数
}

3.3 闹钟报警程序

void menu_dis()
{
	static uchar mm,value;
	if(flag_100ms == 1)		  //100ms执行一次
	{
		flag_100ms = 0;
		if(open1 == 1)	//如果闹钟打开
		{
			if((miao == 0) && (fen == fen1) && (shi == shi1)) 
			{		
				flag_beep_en = 1;	//打开蜂鸣器响的标志位				
			}		
			if(flag_beep_en == 1)	//闹钟以被打开
			{
				clock_value++;
				if(clock_value <= 30)	 
					beep = ~beep;	   //蜂鸣器叫3秒
				else if(clock_value > 30)
				{
					beep = 1;		    //蜂鸣器停1秒
					if(clock_value > 40)
					{
						clock_value = 0;

					}
				}
				//  1 分钟后自动关闭闹钟
				value ++;
				if(value >= 10)
				{
					value = 0;
					mm++;
					if(mm >= 60)
					{
						mm = 0;
						flag_beep_en = 0;
						beep = 1;	
					}
				}					
			}
		}	
	}
}
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐