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

被折叠的 条评论
为什么被折叠?



