带温度无字库12864的万年历程序
【精品 毕业论文 毕业设计】单片机电子万年历毕业论文

作品介绍基于STC90C516RD+、DS1302、DS18B20、12864液晶显示万年历设计目录目录 (I)Abstract (II)1 概述 (1)1.1 系统基本方案选择和论证 (1)1.2 电路设计最终方案 (3)2 系统的硬件设计与实现 (4)2.1 电路设计框图 (4)2.2 系统硬件概述 (4)2.3 主要单元电路的设计 (4)3 系统的软件设计 (17)3.1 程序流程框图 (17)3.2 子程序 (19)4 系统测试 (20)4.1 硬件测试 (20)4.2 软件测试 (20)5 结束语 (21)参考文献 (22)附录:程序 (23)致谢................................................... 错误!未定义书签。
摘要本文借助电路仿真软件Protues对基于STC90C516RD+单片机的电子万年历的设计方法及下载测试进行了全面的阐述。
该电子万年历在硬件方面主要采用STC90C516RD+单片机作为主控核心,由DS1302时钟芯片提供时钟、12864点阵液晶显示屏显示。
STC90C516RD+单片机是由Atmel公司推出的,功耗小,电压可选用4~6V电压供电;DS1302时钟芯片是美国DALLAS公司推出的具有涓细电流充电功能的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小;数字显示是采用的LED液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒等信息。
此外,该电子万年历还具有时间校准等功能。
在软件方面,主要包括日历程序、时间调整程序,显示程序等。
所有程序编写完成后,在Keil软件中进行调试,确定没有问题后,进行下载调试。
论文主要研究了液晶显示器及时钟芯片DS1302,温度传感器DS18B20与单片机之间的硬件相互之间通信,对数种硬件连接方案进行了详尽的比较,在软件方面对日历算法也进行了论述。
FYD12864无字库3A中文使用手册

FYD12864-0403A 液晶显示模块服务文件实物图片一.基本特性* 电源电压5V* 显示分辨率:128×64点* 显示方式:STN、半透、正显* 驱动方式:1/64DUTY,1/9BIAS* 视角方向:6点* 背光方式:底部黄绿LED背光* 通讯方式:8线并口* 内置DC-DC转换电路,无需外加负压* 工作温度:-10℃ - +60℃ ,存储温度: -20℃ - 70℃二.外形尺寸1.外形尺寸图2.主要外形尺寸项 目 标 准 尺 寸 单 位模 块 体 积 93.0×70.0×12.8 mm定 位 尺 寸 88.0×65.0 mm视 域 71.7×39 mm点 阵 数 128×64 像素点 距 离 0.52×0.52 mm点 大 小 0.48×0.48 mm三.硬件说明1.引脚特性引脚号 引脚名称 电 平 引 脚 功 能 描 述1 VSS 0V 电源地2 VDD +5V 电源电压3 V0 0~-10V LCD驱动负电压,调节LCD对比度4 D/I H/L H:DB0-DB7为显示数据L:DB0-DB7为显示指令数据5 R/W H/L R/W=H,E=H数据被读到DB0-DB7R/W=L,E=H—L,DB0-DB7数据写到IR或DR6 E H/L 使能信号:R/W=L.E信号下降沿锁存DB0-DB7;R/W=H,E=H,DDRAM数据读到DB0-DB77 DB08 DB19 DB210 DB3H/L 8位三态并行数据总线11 DB412 DB513 DB614 DB715 CS1 H/L 片选信号,当CS1=H时,液晶右半屏显示16 CS2 H/L 片选信号,当CS2=H时,液晶左半屏显示17 /RET H/L 复位信号,RET=0有效18 VEE -10V 输出-10V的负电压(单电源供电)19 A +5V背光电源,背光功耗≤300mA20 K 0V2.原理简图背光接线图 3.硬件功能描述1)显示数据RAM(DDRAM)DDRAM(64×8×8 bits)是存储图形显示数据的。
protues中无字库12864汉字显示程序

lie1=0;
}
page=5;
lie1=0;
for(i=0;i<8;i++)
{
if(i<4)
screen(0);
else
screen(1);
show1616(page,lie1,address);
lie1+=16;
if(lie1>63)
lie1=0;
address+=32;
}
screen(2);
{
uchar i;
page(pa);
lie(li);
for(i=0;i<16;i++)
dat(*(add++));
page(pa+1);
lie(li);
for(i=0;i<16;i++)
dat(*(add++));
}
void main()
{
uchar i,page,lie1;
uchar *address;
}
void line(uchar line)
{
line=line&0x3f;
line=line|0xc0;
com(line);
}
void onoff(uchar onoff)
{
if(onoff==1)
com(0x3f);
else
com(0x3e);
}
void reset()
{
reset1=0;
delay(2);
0x80,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x03,0x0C,0x10,0x20,0x40,0x80,0x80,0x00,
万年历程序

•/*********************************************************************************** *************•C51写的公历转农历,并驱动LCM-12864汉字液晶显示。
•author: cth•本程序参考了网上部分程序,在这里感谢所有无私奉献的朋友!•全程注释,有耐心就慢慢看!•************************************************************************************ ************/••#include <reg52.h>•#include <intrins.h>•#include <stdio.h>•#define uint unsigned int•#define uchar unsigned char•char sec,min,hour,day,month,year,week; //定义全局变量,秒,分,时,日,月,年和星期•bit century; //定义世纪位:0为20世纪,1为19世纪。
•//此时初始日期为2006年8月13日,即此程序完成日期!••/**************************************C51写的公历转农历和星期•**************************************••公历是全世界通用的历法以地球绕太阳的一周为一年一年365 天分为12 个月1 3 5 7 8 10 12 月为•31 天2 月为28 天其余月份为30 天事实上地球绕太阳一周共365 天5 小时48 分46 秒比公历一年多出5 小时48•分46 秒为使年误差不累积公历年用闰年法来消除年误差由于每年多出5 小时48 分46 秒每4 年累计多出23•小时15 分4 秒接近1 天天文学家就规定每4 年有一个闰年把2 月由28 天改为29 天凡是公历年代能被4 整除•的那一年就是闰年但是这样一来每4 年又少了44 分56 秒为了更准确地计时天文学家又规定凡能被100 整除•的年份只有能被400 整除才是闰年即每400 年要减掉3 个闰年经过这样处理后实际上每400 年的误差只有2 小时•53 分20 秒已相当准确了•农历与公历不同农历把月亮绕地球一周作为一月因为月亮绕地球一周不是一整天所以农历把月分为大月和小•月大月30 天小月29 天通过设置大小月使农历日始终与月亮与地球的位置相对应为了使农历的年份与公历年•相对应农历通过设置闰月的办法使它的平均年长度与公历年相等农历是中国传统文化的代表之一并与农业生产联•系密切中国人民特别是广大农民十分熟悉并喜爱农历•公历与农历是我国目前并存的两种历法各有其固有的规律农历与月球的运行相对应其影响因素多它的大小•月和闰月与天体运行有关计算十分复杂且每年都不一致因此要用单片机实现公历与农历的转换用查表法是最方•便实用的办法•51 系列单片机因其在功能上能满足大部份对速度要求不高的应用场合的要求且价格低廉开发工具普及程度高•是目前应用最多的单片机之一本文介绍一种用51 单片机实现从1901 年到2099 年2199 年公历日到农历日及星期•的转换方法并向读者提供完整的51C程序•二基本原理•实现公历与农历的转换一般采用查表法按日查表是速度最快的方法但51 单片机寻址能力有限不可能采用•按日查表的方法除按日查外我们可以通过按月查表和按年查表的方法再通过适当的计算来确定公历日所对应的•农历日期本文采用的是按年查表法最大限度地减少表格所占的程序空间•对于农历月来说大月为30 天小月为29 天这是固定不变的这样我们就可用1 个BIT 位来表示大小月信•息农历一年如有闰月为13 个月否则是12 个月所以一年需要用13 个BIT 闰月在农历年中所在的月份并不固定•大部分闰月分布在农历2 8 月但也有少量年份在9 月以后所以要表示闰月的信息至少要4BIT 在这里我们用4BIT•的值来表示闰月的月份值为0 表示本年没有闰月有了以上信息还不足以判断公历日对应的农历日因为还需要一•个参照日我们选用农历正月初一所对应的公历日期作参照日公历日最大为31 日需要5BIT 来表示而春节所在的•月份不是1 月就是2 月用1BIT 就够了考虑到表达方便我们用2BIT 来表示春节月2BIT 的值直接表示月份这•样一年的农历信息只用3 个字节就全部包括了•计算公历日对应的农历日期的方法先计算出公历日离当年元旦的天数然后查表取得当年的春节日期计算出春•节离元旦的天数二者相减即可算出公历日离春节的天数以后只要根据大小月和闰月信息减一月天数调整一月农•历月份即可推算出公历日所对应的农历日期如公历日不到春节日期农历年要比公历年小一年农历大小月取前一•年的信息农历月从12 月向前推算•公历日是非常有规律的所以公历日所对应的星期天可以通过计算直接得到理论上公元0 年1 月1 日为星期日•只要求得公历日离公元0 年1 月1 日的日子数除7 后的余数就是星期天为了简化计算采用月校正法根据公历的•年月日可直接计算出星期天其算法是日期年份所过闰年数月校正数之和除7 的余数就是星期天但如果是在•闰年又不到3 月份上述之和要减一天再除7 其1 12 月的校正数据为6 2 2 5 0 3 5 1 4 6 2 4 在•本程序中采用1 个字节表示年份闰年数也只计算1900 年以后的闰年数所以实际校正数据也和上述数据不同••••公历年对应的农历数据,每年三字节,•格式第一字节BIT7-4 位表示闰月月份,值为0 为无闰月,BIT3-0 对应农历第1-4 月的大小•第二字节BIT7-0 对应农历第5-12 月大小,第三字节BIT7 表示农历第13 个月大小•月份对应的位为1 表示本农历月大(30 天),为0 表示小(29 天)•第三字节BIT6-5 表示春节的公历月份,BIT4-0 表示春节的公历日期•************************************************************************************ *************/•code uchar year_code[597]={• 0x04,0xAe,0x53, //1901• 0x0A,0x57,0x48, //1902• 0x55,0x26,0xBd, //1903• 0x0d,0x26,0x50, //1904• 0x0d,0x95,0x44, //1905• 0x46,0xAA,0xB9, //1906• 0x05,0x6A,0x4d, //1907• 0x09,0xAd,0x42, //1908• 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• 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• 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• 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 • 0x0C,0x96,0x45, //2000 • 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• 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• 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};••bit c_moon;•data uchar year_moon,month_moon,day_moon;•/*子函数,用于读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0*/•bit get_moon_day(uchar month_p,uint table_addr)•{•uchar temp;• switch (month_p){• case 1:{temp=year_code[table_addr]&0x08;• if (temp==0)return(0);else return(1);}• case 2:{temp=year_code[table_addr]&0x04;• if (temp==0)return(0);else return(1);}• case 3:{temp=year_code[table_addr]&0x02;• if (temp==0)return(0);else return(1);}• case 4:{temp=year_code[table_addr]&0x01;• if (temp==0)return(0);else return(1);}• case 5:{temp=year_code[table_addr+1]&0x80;• if (temp==0) return(0);else return(1);}• case 6:{temp=year_code[table_addr+1]&0x40;• if (temp==0)return(0);else return(1);}• case 7:{temp=year_code[table_addr+1]&0x20;• if (temp==0)return(0);else return(1);}• case 8:{temp=year_code[table_addr+1]&0x10;• if (temp==0)return(0);else return(1);}• case 9:{temp=year_code[table_addr+1]&0x08;• if (temp==0)return(0);else return(1);}• case 10:{temp=year_code[table_addr+1]&0x04;• if (temp==0)return(0);else return(1);}• case 11:{temp=year_code[table_addr+1]&0x02;• if (temp==0)return(0);else return(1);}• case 12:{temp=year_code[table_addr+1]&0x01;• if (temp==0)return(0);else return(1);}• case 13:{temp=year_code[table_addr+2]&0x80;• if (temp==0)return(0);else return(1);}• }•}••/*********************************************************************************** **•函数功能:输入阳历数据,输出阴历数据(只允许1901-2099年)•调用函数示例:Conversion(c,year,month,day)•如:计算2004年10月16日Conversion(0,0x4,0x0A,0x10);•c,year,month,day均为16进制数据,c为世纪标志位,c_sun=0为21世纪,c_sun=1为19世纪•调用函数后,原有数据不变,读c_moon,year_moon,month_moon,day_moon得出阴历16进制数据。
12864LCD上显示温湿度

12864LCD显示温湿度第一种方式:/**********************DHT11与12864LCD************************/ #include <>#define uchar unsigned char#define uint unsigned intuchar lcd_x,lcd_y,data_byte=0,count;uint TH_data,TL_data,RH_data,RL_data,CK_data;uint TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;uchar num;sbit RS = P2^0;;uchar wendu[6];uchar shidu[6];/********************************************************1ms延时函数********************************************************/void delay(int z){ int x,y;for(x=z;x>0;x--)for(y=125;y>0;y--); }/********************************************************50us延时函数********************************************************/void delay_50us(uint t){uint j;for(;t>0;t--)for(j=19;j>0;j--);}/********************************************************50ms延时函数********************************************************/ void delay_50ms(uint t){uint j;for(;t>0;t--)for(j=6245;j>0;j--);}/********************************************************12864液晶写指令********************************************************/ void write_12864com(uchar com){ lcdrs=0;lcdrw=0;delay_50us(1);P0=com;lcden=1;delay_50us(10);lcden=0;delay_50us(2);}/********************************************************12864液晶写数据********************************************************/ void write_dat(ucha r dat) { lcdrs=1;lcdrw=0;delay_50us(1);P0=dat;lcden=1;delay_50us(10);lcden=0;delay_50us(2); }/********************************************************12864液晶初始化********************************************************/void init12864lcd(void) {delay_50ms(2);write_12864com(0x30);delay_50us(4);write_12864com(0x30);delay_50us(4);write_12864com(0x0f);delay_50us(4);write_12864com(0x01);delay_50us(240);write_12864com(0x06);delay_50us(10);write_12864com(0x0c);delay_50us(10); }/********************************************************12864液晶显示函数********************************************************/ void display1(void){uchar i;write_12864com(0x80);for(i=0;i<18;i++){write_dat(table2[i]);delay_50us(1); } }/********************************************************12864液晶显示函数********************************************************/ void display2(void){uchar i;write_12864com(0x90);for(i=0;i<18;i++){write_dat(table3[i]);delay_50us(1); } }/********************************************************12864液晶显示函数********************************************************/ void display3(void){ uchar i;write_12864com(0x88);for(i=0;i<8;i++){ write_dat(table4[i]);delay_50us(1); }}/********************************************************12864液晶显示函数********************************************************/ void displaywendu(void){ uchar i;write_12864com(0x94);for(i=0;i<3;i++){ write_dat(wendu[i]);delay_50us(1);}for(i=0;i<1;i++){write_dat(table5[i]);delay_50us(1);}for(i=4;i<5;i++){write_dat(wendu[i]);delay_50us(1); } }/********************************************************12864液晶显示函数********************************************************/ void displayshidu(void) {uchar i;write_12864com(0x8C);for(i=0;i<3;i++) {write_dat(shidu[i]);delay_50us(1); }for(i=0;i<1;i++){ write_dat(table5[i]);delay_50us(1);}for(i=4;i<5;i++){write_dat(shidu[i]);delay_50us(1);} }/********************************************************SHT11写字节程序********************************************************/char s_write_byte(unsigned char value){unsigned char i,error=0;for (i=0x80;i>0;i>>=1) //高位为1,循环右移{ if (i&value) DATA=1; //和要发送的数相与,结果为发送的位else DATA=0;SCK=1;_nop_();_nop_();_nop_(); //延时3usSCK=0;}DATA=1; //释放数据线SCK=1;error=DATA; //检查应答信号,确认通讯正常_nop_();_nop_();_nop_();SCK=0;DATA=1;return error; //error=1 通讯错误}/********************************************************SHT11读字节程序********************************************************/char s_read_byte(unsigned char ack){unsigned char i,val=0;DATA=1; //释放数据线for(i=0x80;i>0;i>>=1) //高位为1,循环右移{SCK=1;if(DATA)val=(val|i); //读一位数据线的值SCK=0; }DATA=!ack; //如果是校验,读取完后结束通讯;SCK=1;_nop_();_nop_();_nop_(); //延时3usSCK=0;_nop_();_nop_();_nop_();DATA=1; //释放数据线return val; }/********************************************************SHT11启动传输********************************************************/void s_transstart(void){DATA=1;SCK=0; //准备_nop_();SCK=1;_nop_();DATA=0;_nop_();SCK=0;_nop_();_nop_();_nop_();SCK=1;_nop_();DATA=1;_nop_();SCK=0; }/********************************************************SHT11连接复位********************************************************/void s_connectionreset(void){ unsigned char i;DATA=1;SCK=0; //准备for(i=0;i<9;i++) //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位{ SCK=1;SCK=0;}s_transstart(); //启动传输}/********************************************************SHT11温湿度检测********************************************************/char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsign ed char mode){unsigned error=0;unsigned int i;s_transstart(); //启动传输switch(mode) //选择发送命令{ case TEMP : error+=s_write_byte(MEASURE_TEMP);break; //测量温度case HUMI : error+=s_write_byte(MEASURE_HUMI);break; //测量湿度default : break;}for (i=0;i<65535;i++)if(DATA==0) break; //等待测量结束if(DATA) error+=1;// 如果长时间数据线没有拉低,说明测量错误*(p_value) =s_read_byte(ACK); //读第一个字节,高字节(MSB)*(p_value+1)=s_read_byte(ACK); //读第二个字节,低字节(LSB)*p_checksum =s_read_byte(noACK); //read CRC校验码return error; // error=1 通讯错误}/********************************************************SHT11温湿度值标度变换及温度补偿********************************************************/ void calc_sth10(flo at *p_humidity ,float *p_temperature){const float C1=; // 12位湿度精度修正公式const float C2=+; // 12位湿度精度修正公式const float C3=; // 12位湿度精度修正公式const float T1=+; // 14位温度精度5V条件修正公式const float T2=+; // 14位温度精度5V条件修正公式float rh=*p_humidity; // rh: 12位湿度float t=*p_temperature; // t: 14位温度float rh_lin; // rh_lin: 湿度linear值float rh_true; // rh_true: 湿度ture 值float t_C; // t_C : 温度℃t_C=t* - 40; //补偿温度rh_lin=C3*rh*rh + C2*rh + C1; //相对湿度非线性补偿rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //相对湿度对于温度依赖性补偿if(rh_true>100)rh_true=100; //湿度最大修正if(rh_true<rh_true=; //湿度最小修正*p_temperature=t_C; //返回温度结果*p_humidity=rh_true; //返回湿度结果}/********************************************************主函数********************************************************/void main(void){unsigned int temp,humi;value humi_val,temp_val; //定义两个共同体,一个用于湿度,一个用于温度unsigned char error; //用于检验是否出现错误unsigned char checksum; //CRCinit12864lcd();display1();display2();display3();s_connectionreset(); //启动连接复位while(1){error=0; //初始化error=0,即没有错误error+=s_measure((unsigned char*)&,&checksum,TEMP); //温度测量error+=s_measure((unsigned char*)&,&checksum,HUMI); //湿度测量if(error!=0) s_connectionreset(); ////如果发生错误,系统复位else{=(float); //转换为浮点数=(float); //转换为浮点数calc_sth10(&,&; //修正相对湿度及温度temp=*10;humi=*10;wendu[0]=temp/1000+'0'; //温度百位wendu[1]=temp%1000/100+'0'; //温度十位wendu[2]=temp%100/10+'0'; //温度个位wendu[3]=0x2E; //小数点wendu[4]=temp%10+'0'; //温度小数点后第一位displaywendu();shidu[0]=humi/1000+'0'; //湿度百位shidu[1]=humi%1000/100+'0'; //湿度十位shidu[2]=humi%100/10+'0'; //湿度个位shidu[3]=0x2E; //小数点shidu[4]=humi%10+'0'; //湿度小数点后第一位displayshidu(); }Delay(800);//等待足够长的时间,以现行下一次转换}}。
无字库12864程序

功能:
向
LCD
写入数据
参数:
WDLCD
待写入的字符数据
select
用于选择
LCD
屏的左右
,1
选择左屏,
2
选********************************************/
void WriteDataLCD(unsigned char WDLCD,unsigned char select)
{
switch(select)
{
case 1:{LCD_CSA=1;LCD_CSB=0;break;}//
左
函数声明
*****************************************/
void ReadStatusLCD(unsigned char select);//
从
LCD
读出忙标志位
unsigned char ReadDataLCD(unsigned char select);//
向指定行列
写数据
void LcmPutDots(unsigned char Column,unsigned char Page, unsigned char DotByte );//
显示点
void whiteword(unsigned char Column,unsigned char Page, const unsigned char puts[][16] );//
void set_XY(unsigned char Column,unsigned char Page);//
设置数据写入或读出的地址,通过页
自己制作的单片机万年历程序+原理图

自己制作的单片机万年历程序+原理图单片机万年历仿真原理图如下仿真Altium Designer画的万年历原理图和PCB图如下:PCB原理图基于51单片机,可以完成时钟显示、公历显示、农历显示、温度显示、闹钟报警定时的LCD时钟PPT内容预览:本设计使用AT89C51来做主控芯片,其强大的功能足够实现我们设计的所有功能。
使用LCD1602的液晶显示器来进行显示。
使用Keil uVision5进行编程。
通过Proteus8.6来进行仿真。
点击一次K1进入时钟设置页面,通过点击K2切换时、秒、分、星期、年、月、日,通过K3与K4实现加减来完成时钟的设置点击两次K1进入闹钟设置页面,通过点击K2切换开关、时、秒、分,通过K3与K4实现加减完成闹钟的设置。
单片机源程序如下注释是很全的#include //调用单片机头文件#define uchar unsigned char //无符号字符型宏定义变量范围0~255#define uint unsigned int //无符号整型宏定义变量范围0~65535#include "eeprom52.h"#include "nongli.h"#include "intrins.h"bit flag_200ms ;bit flag_100ms ;sbit beep = P3^7; //蜂鸣器定义bit flag_beep_en;uint clock_value; //用作闹钟用的sbit dq = P3^1; //18b20 IO口的定义uint temperature ; //温度变量uchar flag_nl; //农历阳历显示标志位uchar menu_1,menu_2;uchar key_time,flag_value; //用做连加的中间变量bit key_500ms ;uchar n_nian,n_yue,n_ri; //农历显示的函数#include "ds1302.h"#include "lcd1602.h"/******************把数据保存到单片机内部eeprom中******************/void write_eeprom(){SectorErase(0x2000);byte_write(0x2000, fen1);byte_write(0x2001, shi1);byte_write(0x2002, open1);byte_write(0x2058, a_a);}/******************把数据从单片机内部eeprom中读出来*****************/void read_eeprom(){fen1 = byte_read(0x2000);shi1 = byte_read(0x2001);open1 = byte_read(0x2002);a_a = byte_read(0x2058);}/**************开机自检eeprom初始化*****************/void init_eeprom(){read_eeprom(); //先读if(a_a != 1) //新的单片机初始单片机内问eeprom{fen1 = 3;shi1 = 8;a_a = 1;write_eeprom(); //保存数据}}/***********************18b20初始化函数*****************************/void init_18b20(){bit q;dq = 1; //把总线拿高delay_uint(1); //15usdq = 0; //给复位脉冲delay_uint(80); //750usdq = 1; //把总线拿高等待delay_uint(10); //110usq = dq; //读取18b20初始化信号delay_uint(20); //200usdq = 1; //把总线拿高释放总线}/*************写18b20内的数据***************/void write_18b20(uchar dat){uchar i;for(i=0;i<8;i++){ //写数据是低位开始dq = 0; //把总线拿低写时间隙开始dq = dat & 0x01; //向18b20总线写数据了delay_uint(5); // 60usdq = 1; //释放总线}}/*************读取18b20内的数据***************/uchar read_18b20(){uchar i,value;for(i=0;i<8;i++){dq = 0; //把总线拿低读时间隙开始value >>= 1; //读数据是低位开始dq = 1; //释放总线if(dq == 1) //开始读写数据value |= 0x80;delay_uint(5); //60us 读一个时间隙最少要保持60us 的时间}return value; //返回数据}/*************读取温度的值读出来的是小数***************/uint read_temp(){uint value;uchar low; //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序init_18b20(); //初始化18b20write_18b20(0xcc); //跳过64位ROMwrite_18b20(0x44); //启动一次温度转换命令delay_uint(50); //500usinit_18b20(); //初始化18b20write_18b20(0xcc); //跳过64位ROMwrite_18b20(0xbe); //发出读取暂存器命令EA = 0;low = read_18b20(); //读温度低字节value = read_18b20(); //读温度高字节EA = 1;value <<= 8; //把温度的高位左移8位value |= low; //把读出的温度低位放到value的低八位中value *= 0.625; //转换到温度值小数return value; //返回读出的温度带小数}/******************1ms 延时函数*******************/void delay_1ms(uint q){uint i,j;for(i=0;i<>< p=""><>for(j=0;j<120;j++);}/******************写星期函数*******************/void write_week(uchar hang,uchar add,uchar week)//写星期函数{if(hang==1)write_com(0x80+add);elsewrite_com(0x80+0x40+add);。
基于单片机的电子万年历的设计与制作

郑州航空工业管理学院毕业论文(设计)题目基于单片机的电子万年历的设计与制作二О一三年五月二十三日摘要单片机应用技术飞速发展,从导弹的导航装置到飞机上各种仪表的控制,从计算机的网络通讯与数据传输到工业自动化过程的实时控制和数据处理,以及生活中广泛使用的各种智能IC卡、电子宠物等,这些都离不开单片机。
单片机是集CPU、RAM、ROM 、定时、计数和多种接口于一体的微控制器。
它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。
本文通过对一个基于单片机的能实现万年历功能电子时钟的设计,系统由主控制器STC89C52为控制中心,DS12C887产生时钟,DS18B20产生温度,12864液晶显示对日期、时间等进行显示,按键可以设置时间、闹钟等。
能实现时钟、日历、时间和温度显示的功能。
今后万年历将会朝着精准度更高,外观更加美丽,价格更加实惠的方向发展,并且将会出现更多的辅助功能。
关键词:单片机,农历查询,万年历,温度显示ABSTRACTAs the rapid development of Single-chip Microcomputer Application technology, from the navigation device of missile to the various instruments on the aircraft control and from computer communication network and data transmission to industrial real-time automation process control and data processing, as well as the extensive use of the smart card and electronic pets in live, All of this is inseparable from the microcontroller. SCM is set to CPU, RAM, ROM, timing, counting and multiple interfaces in one microcontroller. It has the advantages of small volume, low cost, strong function, widely used in smart industries, and industrial automation.This paper designed a electronic clock which can achieve calendar function based on microcontroller, the system consists of main controller STC89C52, clock circuit, display circuit, DS12C887circuit, and a reset circuit components,the main control system as the control center, DS12C887 generates a clock, DS18B20 generates temperature, a 12864 LCD display the date and time, the key can set the time, alarm clock, achieved the clock calendar and time display function.In the future, the calendar will be more accurate, look more beautiful; more affordable prices of the direction of development, and will appear more auxiliary function.Keywords: Monolithic single-chip,lunar calendar demand, perpetual calendars display temperature目录摘要 (I)ABSTRACT (II)第1章绪论 (1)1.1 课题的背景 (1)1.2 电子万年历的发展 (1)1.3 电子万年历设计 (1)第2章设计要求与方案论证 (3)2.1 设计要求 (3)2.2 方案论证 (3)2.2.1 控制部分方案设计 .......................................... .32.2.2 显示部分的设计 ........................................... ..42.2.3 单片机芯片的选择方案和论证 (4)2.2.4 时钟芯片的选择方案和论证 (4)2.2.5 温度传感器的选择方案和论证 (5)2.2.6 电源的选择方案 (5)第3章硬件设计 (6)3.1 电路的设计框图 (6)3.2 主要单元电路的设计 (6)3.2.1 单片机主控电路设计 (6)3.2.2 时钟振荡电路设计 (8)3.2.3 复位电路设计 (9)3.2.4 温度传感器电路设计 (9)3.2.5 时钟电路设计 (12)3.2.6 显示电路设计 (13)3.2.7 按键电路设计 (16)3.2.8 报警电路设计 (16)第4章软件设计 (17)4.1 程序流程图 (17)4.1.1 主程序流程 (17)4.1.2 时间调整程序流程图 (18)4.1.3 时钟芯片读写程序流程 (20)4.1.4 温度测量元件控制程序流程 (20)4.1.4 公历转换成农历的基本原理 (21)4.2 操作与调试 (22)4.2.1 软件调试 (22)4.2.2 万年历实物 (23)总结与展望 (26)致谢 (27)参考文献 (28)附录一:系统硬件原理图 (29)附录二:元器件清单 (30)附录三:设计程序 (31)第1章绪论1.1 课题的背景随着社会的发展和科技水平的提高,人类获得和计算时间的方法,历经观天阳、摆钟到现在电子钟,经过不断发展和创新,计时的精度越来越准确。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SW08A15_带温度无字库12864的万年历程序文章来源:网络转载┊发布时间:2008-8-22 21:43:01 ┊浏览次数:283 本例程完成了万年历的显示,包括设置时间,农历,温度,1302的初始化以及帮助界面,采用不带字库的12864,所以整体程序比较大,编译完成后,不能在89C52中运行,建议使用89C54。
本程序还有很多冗杂之处,未做调整,全做抛砖引玉。
#include "reg52.h"#include "sw08a15.h"#include "1302.h"#include "12864.h"#include "intrins.h"uchar num,week;uchar timeNow[6];uint LunarCal;uchar SolarCalYear, SolarCalMonth, SolarCalDay;uchar times=0;uchar wendu=0;uchar code dian[32]={0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,/*:*/};uchar code hz[][32]={{0x40,0x20,0x10,0x0C,0xE3,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0x02,0x00,0x00,0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00},/*"年",0*/ {0x00,0x00,0x00,0x00,0x00,0xFF,0x11,0x11,0x11,0x11,0x11,0xFF,0x00,0x00,0x00,0x00,0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x01,0x01,0x21,0x41,0x3F,0x00,0x00,0x00,0x00},/*"月",1*/ {0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00},/*"日",2*/ {0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,0x00,0x48,0x46,0x41,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x49,0x41,0x40,0x00},/*"星",3*/ {0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,0x02,0x22,0x42,0x3F,0x00,0x00},/*"期",4*/ {0x00,0x20,0x18,0x08,0x88,0xE8,0x1F,0x6A,0x88,0x08,0x88,0xC8,0xA8,0x1C,0x08,0x00,0x08,0x04,0x02,0x41,0xFF,0x40,0x20,0x10,0x01,0x02,0x0D,0x18,0x70,0x20,0x20,0x00},/*"农",5*/ {0x00,0x00,0xFE,0x02,0x22,0x22,0x22,0x22,0xFA,0x22,0x22,0x22,0xE2,0x02,0x02,0x00,0x40,0x30,0x0F,0x00,0x40,0x20,0x18,0x06,0x01,0x00,0x20,0x60,0x3F,0x00,0x00,0x00},/*"历",6*/ {0x10,0x21,0x86,0x70,0x00,0x7E,0x4A,0x4A,0x4A,0x4A,0x4A,0x7E,0x00,0x00,0x00,0x00,0x02,0xFE,0x01,0x40,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x40,0x00},/*"温",7*/ {0x00,0x00,0xFC,0x04,0x24,0x24,0xFC,0xA5,0xA6,0xA4,0xFC,0x24,0x24,0x24,0x04,0x00,0x80,0x60,0x1F,0x80,0x80,0x42,0x46,0x2A,0x12,0x12,0x2A,0x26,0x42,0xC0,0x40,0x00},/*"度",8*/ {0x00,0x02,0x05,0xE2,0x18,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x04,0x1E,0x00,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x18,0x00,0x00},/*"℃",9*/{0x40,0x41,0xCE,0x04,0x00,0x80,0x40,0xBE,0x82,0x82,0x82,0xBE,0xC0,0x40,0x40,0x00,0x00,0x00,0x7F,0x20,0x90,0x80,0x40,0x43,0x2C,0x10,0x10,0x2C,0x43,0xC0,0x40,0x00},/*"设",10*/ {0x00,0x20,0x2F,0xA9,0xA9,0xAF,0xE9,0xB9,0xA9,0xAF,0xA9,0xA9,0x2F,0x20,0x00,0x00,0x80,0x80,0x80,0xFF,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xFF,0x80,0x80,0x80,0x00},/*"置",11*/ {0x00,0x20,0x2A,0x2A,0xAA,0x7F,0x2A,0x2A,0xAA,0x00,0xFE,0x42,0x9A,0xA6,0x42,0x00,0x00,0x04,0x02,0x01,0x3E,0x02,0x02,0x02,0xFF,0x02,0x13,0x22,0x1E,0x00,0x00,0x00},/*"帮",12*/ {0x00,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x10,0x10,0xFF,0x10,0x10,0xF0,0x00,0x00,0x10,0x10,0x1F,0x11,0x11,0x09,0x4F,0x28,0x10,0x0C,0x03,0x20,0x40,0x3F,0x00,0x00},/*"助",13*/{0x40,0x40,0x42,0xCC,0x00,0x50,0x4E,0xC8,0x48,0x7F,0xC8,0x48,0x48,0x40,0x00,0x00,0x00,0x40,0x20,0x1F,0x20,0x48,0x46,0x41,0x40,0x40,0x47,0x48,0x48,0x4E,0x40,0x00},/*"选",14*/ {0x08,0x08,0xFF,0x88,0x48,0x08,0x42,0x46,0x2A,0xD2,0x2A,0x46,0x42,0x80,0x80,0x00,0x42,0x81,0x7F,0x00,0x00,0x08,0x09,0x09,0x09,0xFF,0x09,0x09,0x09,0x08,0x08,0x00},/*"择",15*/ {0x20,0x21,0xEE,0x04,0x00,0x00,0xFF,0x29,0xA9,0xBF,0xA9,0xA9,0x01,0xFF,0x00,0x00,0x00,0x00,0x1F,0x88,0x44,0x30,0x0F,0x00,0x0F,0x04,0x04,0x4F,0x80,0x7F,0x00,0x00},/*"调",16*/ {0x00,0x04,0x74,0xD4,0xFF,0xD4,0x74,0x04,0x10,0x0C,0xB7,0x44,0xB4,0x0C,0x04,0x00,0x00,0x42,0x43,0x7A,0x43,0x42,0x43,0x7E,0x4B,0x4B,0x4A,0x4A,0x42,0x43,0x01,0x00},/*"整",17*/ {0x00,0x84,0xE4,0x5C,0x44,0xC4,0x10,0xF8,0x97,0x92,0xF2,0x9A,0x96,0xF2,0x00,0x00,0x01,0x00,0x3F,0x08,0x88,0x4F,0x30,0x0F,0x04,0x04,0x3F,0x44,0x84,0x7F,0x00,0x00},/*"确",18*/{0x40,0x41,0x42,0xCC,0x04,0x00,0x00,0x00,0x80,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x20,0x90,0x60,0x18,0x07,0x00,0x03,0x0C,0x30,0xC0,0x40,0x00},/*"认",19*/ {0x40,0x42,0xDC,0x08,0x00,0x00,0xFE,0x52,0x92,0x12,0x12,0x92,0x73,0x02,0x00,0x00,0x40,0x20,0x1F,0x20,0x48,0x46,0x51,0x50,0x48,0x45,0x42,0x45,0x48,0x50,0x00,0x00},/*"返",20*/ {0x00,0xFE,0x02,0x02,0xF2,0x12,0x12,0x12,0x12,0x12,0xF2,0x02,0x02,0xFE,0x00,0x00,0x00,0x7F,0x40,0x40,0x47,0x44,0x44,0x44,0x44,0x44,0x47,0x40,0x40,0x7F,0x00,0x00},/*"回",21*/ {0x00,0x08,0x88,0xC9,0x2E,0x98,0x48,0x00,0x08,0x08,0xF8,0x08,0x08,0xFC,0x08,0x00,0x02,0x01,0x00,0x7F,0x01,0x02,0x44,0x20,0x10,0x0C,0x03,0x20,0x40,0x3F,0x00,0x00},/*"初",22*/ {0x10,0x90,0x70,0x1F,0x12,0xF0,0x00,0x20,0x70,0x28,0x27,0x22,0x28,0x70,0x20,0x00,0x40,0x21,0x12,0x0C,0x06,0x09,0x30,0x00,0x7F,0x21,0x21,0x21,0x21,0x7F,0x00,0x00},/*"始",23*/ {0x80,0x40,0x20,0xF8,0x07,0x02,0x00,0x00,0xFF,0xC0,0x60,0x30,0x1C,0x08,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x04,0x02,0x01,0x3F,0x40,0x40,0x40,0x40,0x78,0x00,0x00},/*"化",24*/ };uchar code weekCode[][32]={{0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"一",0*/ {0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x10,0x00},/*"二",1*/ {0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00},/*"三",2*/ {0x00,0xFE,0x02,0x02,0x02,0xFE,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x22,0x7F,0x00,0x00},/*"四",3*/ {0x00,0x02,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0xC2,0x82,0x02,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x30,0x20,0x00},/*"五",4*/ {0x10,0x10,0x10,0x10,0x10,0x91,0x12,0x1E,0x94,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x00,0x00,0x01,0x02,0x0C,0x78,0x30,0x00,0x00},/*"六",5*/ {0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00},/*"日",6*/ };uchar code numberCode[][16]={{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},/*"0",0*/{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"1",1*/{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},/*"2",2*/{0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00},/*"3",3*/{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00},/*"4",4*/ {0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00},/*"5",5*/ {0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},/*"6",6*/ {0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00},/*"7",7*/ {0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},/*"8",8*/ {0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00},/*"9",9*/ {0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20},/*"A",0*/ {0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00},/*"B",11*/ {0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00},/*"C",12*/ {0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00},/*"D",13*/{0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00},/*"E",14*/ {0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00},/*"F",15*/ };/////////////////////农历数据///////////////////////// uchar code year_code[]={0x4d,0x4A,0xB8, //20010x0d,0x4A,0x4C, //20020x0d,0xA5,0x41, //20030x25,0xAA,0xB6, //20040x05,0x6A,0x49, //20050x7A,0xAd,0xBd, //20060x02,0x5d,0x52, //20070x09,0x2d,0x47, //20080x5C,0x95,0xBA, //20090x0A,0x95,0x4e, //20100x0B,0x4A,0x43, //20110x4B,0x55,0x37, //20120x0A,0xd5,0x4A, //20130x95,0x5A,0xBf, //20140x0A,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, //20380x0B,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, //20620x0d,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, //20860x0A,0x57,0x43, //20870x45,0x27,0x38, //20880x0d,0x26,0x4A, //20890x8e,0x93,0x3e, //20900x0d,0x52,0x52, //20910x0d,0xAA,0x47, //20920x66,0xB5,0x3B, //20930x05,0x6d,0x4f, //20940x04,0xAe,0x45, //20950x4A,0x4e,0xB9, //20960x0A,0x4d,0x4C, //20970x0d,0x15,0x41, //20980x2d,0x92,0xB5, //2099};uchar code day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};uint code day_code2[3]={0x111,0x130,0x14e};////////////////农历转换算法bit get_moon_day(uchar month_p,uint table_addr)//bit[15-9]--year,bit[8-5]--month,bit[4-0]--day {switch (month_p){case 1: {if((year_code[table_addr]&0x08)==0) return(0);else return(1);}case 2: {if((year_code[table_addr]&0x04)==0) return(0);else return(1);}case 3: {if((year_code[table_addr]&0x02)==0) return(0);else return(1);}case 4: {if((year_code[table_addr]&0x01)==0) return(0);else return(1);}case 5: {if((year_code[table_addr+1]&0x80)==0) return(0);else return(1);} case 6: {if((year_code[table_addr+1]&0x40)==0) return(0);else return(1);} case 7: {if((year_code[table_addr+1]&0x20)==0) return(0);else return(1);} case 8: {if((year_code[table_addr+1]&0x10)==0) return(0);else return(1);} case 9: {if((year_code[table_addr+1]&0x08)==0) return(0);else return(1);} case 10: {if((year_code[table_addr+1]&0x04)==0) return(0);else return(1);} case 11: {if((year_code[table_addr+1]&0x02)==0) return(0);else return(1);} case 12: {if((year_code[table_addr+1]&0x01)==0) return(0);else return(1);} case 13: {if((year_code[table_addr+2]&0x80)==0) return(0);else return(1);} }}uint Conversion(uchar year,uchar month,uchar day){uchar temp1,temp2,temp3,month_p;uint temp4,table_addr;uint dat_return,dat_buffer;bit flag_y;table_addr=(year-1)*3;temp1=year_code[table_addr+2]&0x60;temp1=_cror_(temp1,5);temp2=year_code[table_addr+2]&0x1f;if(temp1==0x1){temp3=temp2-1;}else{temp3=temp2+0x1f-1;}if (month<10){temp4=day_code1[month-1]+day-1;}else{temp4=day_code2[month-10]+day-1;}if ((month>0x2)&&(year%0x4==0)){temp4+=1;}if (temp4>=temp3){temp4-=temp3;month=0x1;month_p=0x1;flag_y=0;if(get_moon_day(month_p,table_addr)==0)temp1=0x1d;else temp1=0x1e;temp2=year_code[table_addr]/16;while(temp4>=temp1){temp4-=temp1;month_p+=1;if(month==temp2){flag_y=~flag_y;if(flag_y==0)month+=1;}else month+=1;if(get_moon_day(month_p,table_addr)==0)temp1=0x1d;else temp1=0x1e;}day=temp4+1;}else{temp3-=temp4;year-=1;table_addr-=0x3;month=0xc;temp2=year_code[table_addr]/16;if (temp2==0)month_p=0xc;else month_p=0xd;flag_y=0;if(get_moon_day(month_p,table_addr)==0)temp1=0x1d;else temp1=0x1e;while(temp3>temp1){temp3-=temp1;month_p-=1;if(flag_y==0)month-=1;if(month==temp2)flag_y=~flag_y;if(get_moon_day(month_p,table_addr)==0)temp1=0x1d;else temp1=0x1e;}day=temp1-temp3+1;}dat_buffer=0;dat_return=0;dat_buffer=(uint)year;dat_buffer<<=9;dat_return|=dat_buffer;dat_buffer=(uint)month;dat_buffer<<=5;dat_return|=dat_buffer;dat_return|=(uint)day;return dat_return;}/////////////////////////////////////温度函数///////////////////////////////////////////////////// Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位delay(8); //稍做延时DQ = 0; //单片机将DQ拉低delay(80); //精确延时大于480usDQ = 1; //拉高总线delay(14);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay(20);}//读一个字节ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;delay(4);}return(dat);}//写一个字节WriteOneChar(unsigned char dat) {unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;delay(5);DQ = 1;dat>>=1;}}//读取温度float ReadDQerature(void){unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChar();b=ReadOneChar();t=b;t<<=8;t=t|a;tt=t*0.0625;return(tt);}//////////////////////////////////////////////////////////////////////////////////////////////////void displayMessage(){hz_disp8(0,0,numberCode[2],0); //20 hz_disp8(0,8,numberCode[0],0); //20 hz_disp16(0,32,hz[0],0);//年hz_disp16(0,64,hz[1],0);//月hz_disp16(0,96,hz[2],0);//日hz_disp8(2,16,dian,0);//点hz_disp8(2,40,dian,0);//点hz_disp16(2,72,hz[3],0);//星hz_disp16(2,72+16,hz[4],0);//期hz_disp16(4,0,hz[5],0);//农hz_disp16(4,16,hz[6],0);//历hz_disp8(4,32,dian,0);//点hz_disp16(4,64,hz[1],0);//月hz_disp16(4,96,hz[2],0);//日hz_disp16(6,0,hz[7],0);//温hz_disp16(6,16,hz[8],0);//度hz_disp8(6,32,dian,0);//点hz_disp16(6,64,hz[9],0);//℃hz_disp16(6,80,hz[12],0);//帮hz_disp16(6,96,hz[13],0);//助hz_disp8(6,112,numberCode[15],0);//Fhz_disp8(6,120,numberCode[2],0);//2}////////////////////////////////////////////////////////////////////////////////////////////////// main(){int i=0;/*DsInit();*/delay(1000);init_lcd();Clr_Scr();EA=0;displayMessage();//定时器0设置TMOD=0x01;TH1=0x4c;TL1=0x00;EA=1;ET0=1;//允许计时器0TR0=1;//开始计时//外部中断0设置IT0=0;//低电平触发方式EX0=1;//允许中断0IT1=0;//低电平触发方式EX1=1;//允许中断1//本程序不使用点阵显示,所以关闭点阵显示,防止按键影响。