基于51单片机的万年历(带温湿度)带闹钟功能proteus仿真原理图PCB

该系统采用STC89C52单片机,具备LCD1602液晶显示当前时间和温湿度功能,按键可切换页面显示农历和闹钟设置,时间到达设定闹钟时蜂鸣器报警。还给出了原理图、PCB、主程序,以及仿真和实物演示视频链接。

功能介绍:
0.本系统采用STC89C52作为单片机
1.LCD1602液晶显示当前时间和温湿度
2.按键可切换页面,显示农历,显示闹钟设置
3.当时间到达设定闹钟时间时,蜂鸣器报警

原理图:
在这里插入图片描述

PCB:
在这里插入图片描述

主程序:

#include <reg52.h>
//#include"DS18B20_3.H"
#include <string.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define wd 1 //定义是否有温湿度功能  =0时无温度,=1时有温湿度
#include "eeprom52.h"

//复位脚
#define RST_CLR	RST=0//电平置低
#define RST_SET	RST=1//电平置高

//双向数据
#define IO_CLR	IO=0//电平置低
#define IO_SET	IO=1//电平置高
#define IO_R	IO  //电平读取s

//时钟信号
#define SCK_CLR	SCLK=0//时钟信号
#define SCK_SET	SCLK=1//电平置高

#define yh 0x80		   // LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)
#define er 0x80 + 0x40 // LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)

//液晶屏的与C51之间的引脚连接定义(显示数据线接C51的P0口)
sbit en = P2^6;
sbit rw = P2^1; //如果硬件上rw接地,就不用写这句和后面的rw=0了
sbit rs = P2^7;

//校时按键与C51的引脚连接定义

sbit set = P3^5;		//设置键
sbit add = P3^6;		//加键
sbit dec = P3^4;		//减键
sbit seeNL_NZ = P3^7; //查看农历/闹钟

sbit DHT11_0 = P1^1; //温湿度传感器
sbit buzzer = P2^0; //蜂鸣器,通过三极管8550驱动,端口低电平响

bit NZ_sdgb = 1;
int temperature = 0;
int humidity = 0;

// DS1302时钟芯片与C51之间的引脚连接定义
sbit IO = P2^4;
sbit SCLK = P2^5;
sbit RST = P2^3;

char a, miao, shi, fen, ri, yue, nian, week, setn, temp;
uint flag;
// flag用于读取头文件中的温度值,和显示温度值
bit c_moon;

char nz_shi, nz_fen, setNZn;	   //定义闹钟变量
uchar shangyimiao, bsn, temp_hour; //记录上一秒时间
uchar T_NL_NZ;					   //计数器
bit timerOn = 0;				   //闹钟启用标志位
bit baoshi = 0;					   //整点报时标志位
bit p_r = 0;					   //平年/润年  =0表示平年,=1表示润年
data uchar year_moon, month_moon, day_moon;

unsigned char U8FLAG, k; //温湿度变量采
unsigned char U8count, U8temp;
unsigned char U8T_data_H, U8T_data_L, U8RH_data_H, U8RH_data_L, U8checkdata;
unsigned char U8T_data_H_temp, U8T_data_L_temp, U8RH_data_H_temp, U8RH_data_L_temp, U8checkdata_temp;
unsigned char U8comdata;

sbit ACC0 = ACC ^ 0;
sbit ACC7 = ACC ^ 7;
/************************************************************
ACC累加器=A
ACC.0=E0H

ACC.0就是ACC的第0位。Acc可以位寻址。

累加器ACC是一个8位的存储单元,是用来放数据的。但是,这个存储单元有其特殊的地位,
是单片机中一个非常关键的单元,很多运算都要通过ACC来进行。以后在学习指令时,
常用A来表示累加器。但有一些地方例外,比如在PUSH指令中,就必须用ACC这样的名字。
一般的说法,A代表了累加器中的内容、而ACC代表的是累加器的地址。
***************************************************************/

/******************把数据保存到单片机内部eeprom中******************/
void write_eeprom()
{
	SectorErase(0x2000);
	byte_write(0x2000, nz_shi);
	byte_write(0x2001, nz_fen);
	byte_write(0x2002, timerOn);
	byte_write(0x2060, a_a);
}

/******************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom()
{
	nz_shi = byte_read(0x2000);
	nz_fen = byte_read(0x2001);
	timerOn = byte_read(0x2002);
	a_a = byte_read(0x2060);
}

/**************开机自检eeprom初始化*****************/
void init_eeprom()
{
	read_eeprom(); //先读
	if (a_a != 1)  //新的单片机初始单片机内问eeprom
	{
		nz_shi = 12;
		nz_fen = 30;
		timerOn = 0;
		a_a = 1;
		write_eeprom(); //保存数据
	}
}

//********阳历转换阴历表************************************
code uchar year_code[597] = {
	0x04, 0xAe, 0x53, // 1901 0
	0x0A, 0x57, 0x48, // 1902 3
	0x55, 0x26, 0xBd, // 1903 6
	0x0d, 0x26, 0x50, // 1904 9
	0x0d, 0x95, 0x44, // 1905 12
	0x46, 0xAA, 0xB9, // 1906 15
	0x05, 0x6A, 0x4d, // 1907 18
	0x09, 0xAd, 0x42, // 1908 21
	0x24, 0xAe, 0xB6, // 1909
	0x04, 0xAe, 0x4A, // 1910
	0x6A, 0x4d, 0xBe, // 1911
	0x0A, 0x4d, 0x52, // 1912
	0x0d, 0x25, 0x46, // 1913
	0x5d, 0x52, 0xBA, // 1914
	0x0B, 0x54, 0x4e, // 1915
	0x0d, 0x6A, 0x43, // 1916
	0x29, 0x6d, 0x37, // 1917
	0x09, 0x5B, 0x4B, // 1918
	0x74, 0x9B, 0xC1, // 1919
	0x04, 0x97, 0x54, // 1920
	0x0A, 0x4B, 0x48, // 1921
	0x5B, 0x25, 0xBC, // 1922
	0x06, 0xA5, 0x50, // 1923
	0x06, 0xd4, 0x45, // 1924
	0x4A, 0xdA, 0xB8, // 1925
	0x02, 0xB6, 0x4d, // 1926
	0x09, 0x57, 0x42, // 1927
	0x24, 0x97, 0xB7, // 1928
	0x04, 0x97, 0x4A, // 1929
	0x66, 0x4B, 0x3e, // 1930
	0x0d, 0x4A, 0x51, // 1931
	0x0e, 0xA5, 0x46, // 1932
	0x56, 0xd4, 0xBA, // 1933
	0x05, 0xAd, 0x4e, // 1934
	0x02, 0xB6, 0x44, // 1935
	0x39, 0x37, 0x38, // 1936
	0x09, 0x2e, 0x4B, // 1937
	0x7C, 0x96, 0xBf, // 1938
	0x0C, 0x95, 0x53, // 1939
	0x0d, 0x4A, 0x48, // 1940
	0x6d, 0xA5, 0x3B, // 1941
	0x0B, 0x55, 0x4f, // 1942
	0x05, 0x6A, 0x45, // 1943
	0x4A, 0xAd, 0xB9, // 1944
	0x02, 0x5d, 0x4d, // 1945
	0x09, 0x2d, 0x42, // 1946
	0x2C, 0x95, 0xB6, // 1947
	0x0A, 0x95, 0x4A, // 1948
	0x7B, 0x4A, 0xBd, // 1949
	0x06, 0xCA, 0x51, // 1950
	0x0B, 0x55, 0x46, // 1951
	0x55, 0x5A, 0xBB, // 1952
	0x04, 0xdA, 0x4e, // 1953
	0x0A, 0x5B, 0x43, // 1954
	0x35, 0x2B, 0xB8, // 1955
	0x05, 0x2B, 0x4C, // 1956
	0x8A, 0x95, 0x3f, // 1957
	0x0e, 0x95, 0x52, // 1958
	0x06, 0xAA, 0x48, // 1959
	0x7A, 0xd5, 0x3C, // 1960
	0x0A, 0xB5, 0x4f, // 1961
	0x04, 0xB6, 0x45, // 1962
	0x4A, 0x57, 0x39, // 1963
	0x0A, 0x57, 0x4d, // 1964
	0x05, 0x26, 0x42, // 1965
	0x3e, 0x93, 0x35, // 1966
	0x0d, 0x95, 0x49, // 1967
	0x75, 0xAA, 0xBe, // 1968
	0x05, 0x6A, 0x51, // 1969
	0x09, 0x6d, 0x46, // 1970
	0x54, 0xAe, 0xBB, // 1971
	0x04, 0xAd, 0x4f, // 1972
	0x0A, 0x4d, 0x43, // 1973
	0x4d, 0x26, 0xB7, // 1974
	0x0d, 0x25, 0x4B, // 1975
	0x8d, 0x52, 0xBf, // 1976
	0x0B, 0x54, 0x52, // 1977
	0x0B, 0x6A, 0x47, // 1978
	0x69, 0x6d, 0x3C, // 1979
	0x09, 0x5B, 0x50, // 1980
	0x04, 0x9B, 0x45, // 1981
	0x4A, 0x4B, 0xB9, // 1982
	0x0A, 0x4B, 0x4d, // 1983
	0xAB, 0x25, 0xC2, // 1984
	0x06, 0xA5, 0x54, // 1985
	0x06, 0xd4, 0x49, // 1986
	0x6A, 0xdA, 0x3d, // 1987
	0x0A, 0xB6, 0x51, // 1988
	0x09, 0x37, 0x46, // 1989
	0x54, 0x97, 0xBB, // 1990
	0x04, 0x97, 0x4f, // 1991
	0x06, 0x4B, 0x44, // 1992
	0x36, 0xA5, 0x37, // 1993
	0x0e, 0xA5, 0x4A, // 1994
	0x86, 0xB2, 0xBf, // 1995
	0x05, 0xAC, 0x53, // 1996
	0x0A, 0xB6, 0x47, // 1997
	0x59, 0x36, 0xBC, // 1998
	0x09, 0x2e, 0x50, // 1999 294
	0x0C, 0x96, 0x45, // 2000 297
	0x4d, 0x4A, 0xB8, // 2001
	0x0d, 0x4A, 0x4C, // 2002
	0x0d, 0xA5, 0x41, // 2003
	0x25, 0xAA, 0xB6, // 2004
	0x05, 0x6A, 0x49, // 2005
	0x7A, 0xAd, 0xBd, // 2006
	0x02, 0x5d, 0x52, // 2007
	0x09, 0x2d, 0x47, // 2008
	0x5C, 0x95, 0xBA, // 2009
	0x0A, 0x95, 0x4e, // 2010
	0x0B, 0x4A, 0x43, // 2011
	0x4B, 0x55, 0x37, // 2012
	0x0A, 0xd5, 0x4A, // 2013
	0x95, 0x5A, 0xBf, // 2014
	0x04, 0xBA, 0x53, // 2015
	0x0A, 0x5B, 0x48, // 2016
	0x65, 0x2B, 0xBC, // 2017
	0x05, 0x2B, 0x50, // 2018
	0x0A, 0x93, 0x45, // 2019
	0x47, 0x4A, 0xB9, // 2020
	0x06, 0xAA, 0x4C, // 2021
	0x0A, 0xd5, 0x41, // 2022
	0x24, 0xdA, 0xB6, // 2023
	0x04, 0xB6, 0x4A, // 2024
	0x69, 0x57, 0x3d, // 2025
	0x0A, 0x4e, 0x51, // 2026
	0x0d, 0x26, 0x46, // 2027
	0x5e, 0x93, 0x3A, // 2028
	0x0d, 0x53, 0x4d, // 2029
	0x05, 0xAA, 0x43, // 2030
	0x36, 0xB5, 0x37, // 2031
	0x09, 0x6d, 0x4B, // 2032
	0xB4, 0xAe, 0xBf, // 2033
	0x04, 0xAd, 0x53, // 2034
	0x0A, 0x4d, 0x48, // 2035
	0x6d, 0x25, 0xBC, // 2036
	0x0d, 0x25, 0x4f, // 2037
	0x0d, 0x52, 0x44, // 2038
	0x5d, 0xAA, 0x38, // 2039
	0x0B, 0x5A, 0x4C, // 2040
	0x05, 0x6d, 0x41, // 2041
	0x24, 0xAd, 0xB6, // 2042
	0x04, 0x9B, 0x4A, // 2043
	0x7A, 0x4B, 0xBe, // 2044
	0x0A, 0x4B, 0x51, // 2045
	0x0A, 0xA5, 0x46, // 2046
	0x5B, 0x52, 0xBA, // 2047
	0x06, 0xd2, 0x4e, // 2048
	0x0A, 0xdA, 0x42, // 2049
	0x35, 0x5B, 0x37, // 2050
	0x09, 0x37, 0x4B, // 2051
	0x84, 0x97, 0xC1, // 2052
	0x04, 0x97, 0x53, // 2053
	0x06, 0x4B, 0x48, // 2054
	0x66, 0xA5, 0x3C, // 2055
	0x0e, 0xA5, 0x4f, // 2056
	0x06, 0xB2, 0x44, // 2057
	0x4A, 0xB6, 0x38, // 2058
	0x0A, 0xAe, 0x4C, // 2059
	0x09, 0x2e, 0x42, // 2060
	0x3C, 0x97, 0x35, // 2061
	0x0C, 0x96, 0x49, // 2062
	0x7d, 0x4A, 0xBd, // 2063
	0x0d, 0x4A, 0x51, // 2064
	0x0d, 0xA5, 0x45, // 2065
	0x55, 0xAA, 0xBA, // 2066
	0x05, 0x6A, 0x4e, // 2067
	0x0A, 0x6d, 0x43, // 2068
	0x45, 0x2e, 0xB7, // 2069
	0x05, 0x2d, 0x4B, // 2070
	0x8A, 0x95, 0xBf, // 2071
	0x0A, 0x95, 0x53, // 2072
	0x0B, 0x4A, 0x47, // 2073
	0x6B, 0x55, 0x3B, // 2074
	0x0A, 0xd5, 0x4f, // 2075
	0x05, 0x5A, 0x45, // 2076
	0x4A, 0x5d, 0x38, // 2077
	0x0A, 0x5B, 0x4C, // 2078
	0x05, 0x2B, 0x42, // 2079
	0x3A, 0x93, 0xB6, // 2080
	0x06, 0x93, 0x49, // 2081
	0x77, 0x29, 0xBd, // 2082
	0x06, 0xAA, 0x51, // 2083
	0x0A, 0xd5, 0x46, // 2084
	0x54, 0xdA, 0xBA, // 2085
	0x04, 0xB6, 0x4e, // 2086
	0x0A, 0x57, 0x43, // 2087
	0x45, 0x27, 0x38, // 2088
	0x0d, 0x26, 0x4A, // 2089
	0x8e, 0x93, 0x3e, // 2090
	0x0d, 0x52, 0x52, // 2091
	0x0d, 0xAA, 0x47, // 2092
	0x66, 0xB5, 0x3B, // 2093
	0x05, 0x6d, 0x4f, // 2094
	0x04, 0xAe, 0x45, // 2095
	0x4A, 0x4e, 0xB9, // 2096
	0x0A, 0x4d, 0x4C, // 2097
	0x0d, 0x15, 0x41, // 2098
	0x2d, 0x92, 0xB5, // 2099
};

///月份数据表
code uchar day_code1[9] = {0x0, 0x1f, 0x3b, 0x5a, 0x78, 0x97, 0xb5, 0xd4, 0xf3};
code uint day_code2[3] = {0x111, 0x130, 0x14e};

/*
函数功能:输入BCD阳历数据,输出BCD阴历数据(只允许1901-2099年)
调用函数示例:Conversion(c_sun,year_sun,month_sun,day_sun)
如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);
c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世
纪,c_sun=1为19世纪
调用函数后,原有数据不变,读c_moon,year_moon,month_moon,day_moon得出阴历BCD数据
*/

仿真演示视频:
https://www.bilibili.com/video/BV1LP4y1F73G/

实物演示视频:
https://www.bilibili.com/video/BV1F14y1E71J/

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值