1、 目录 1.引言 1 1.1背景 1 1.2应用价值 1 1.3设计目的 2 2.设计方案 3 2.1设计任务 3 2.2设计内容 3 3.总体设计及核心部件简介 3 3.1总体设计框图 3 3.2硬件设计 5 3.3软件设计 6 3.3.1主程序: 6 3.3.2LCD12864显示 27 3.3.3DS18B20程序段 32 3.3.4DS1302程序段 35 3.4时钟芯片DS1302 40 3.4.1 DS1302芯片相关知识 40 3.5温度传感器DS18B20 43 3.5.1DS18B20芯片相关知识 4
2、3 3.6显示LCD12864 45 3.6.1LCD12864的基本知识 45 4.仿真与调试 48 6.参考文献 50 附录1.电路硬件仿真图 50 附录2.元器件清单 50 50 1.引言 1.1背景 1946年2月15日,第一台电子数字计算机ENIAC问世,这标志着计算机时代的到来。计算机的发展,经历了电子计算机、晶体管计算机、集成电路计算机、大规模集成电路计算机和超大规模集成电路计算机五个时代。微处理器、存储器和I/O接口电路构成微型计算机,从应用形态上,微型计算机可以分为三种:多板机(系统机)、单板机和单片机。在一片集成电路芯片上集成微处理器、存储器和I
3、/O接口电路,从而构成了单芯片微型计算机,即单片机。 单片机体积小、控制功能强,其非凡的嵌入式应用形态对于满足嵌入式应用需求具有独特的优势!单片机技术发展十分迅速,产品种类以琳琅满目,其发展经过三个阶段:其一:单片机形成阶段。1976年,Intel公司提出了MCS-48系列单片机。主要特点:在单个芯片内完成了CPU、存储器和I/O接口等部件的集成;但存储器容量较小,寻址范围小(不大于4K),无串行接口,指令系统功能不强。其二:单片机结构成熟阶段。1980年,1976年,Intel公司提出MCS-51系列单片机。主要特点:存储器容量增加,寻址范围扩大(64K),结构体系成熟。其三:性能提高阶段
4、近年来,个半导体厂商不断推出新型单片机芯片,典型的产品如Atmel公司的AT89C51RD2单片机。主要特点:控制性能优异、种类繁多。 现在,单片机芯片市场已经呈现出百发齐放、欣欣向荣的局面!单片机应用技术已经成为电子应用系统设计中最为常用的技术手段,学习和掌握单片机应用技术具有极其重要的现实意义。 1.2应用价值 由于单片机具有良好地控制性能和灵活的潜入品质,其在各种领域都获得了极为广泛的应用。单片机用于各种仪器仪表,一方面提高了仪器仪表的使用功能和精度,是仪器仪表智能化,同时还简化了仪器仪表的硬件结构,从而可以方便地完成与企业把产品的升级换代。机电一体化产品是集机械技术、微
5、电子技术、自动控制技术和计算机技术与一体,具有智能化特征的各种机电产品。单片机还可以用于各种物理量的采集与控制,电流、电压、温度、液压、流量等物理参数的采集和控制均可以利用单片机方便地实现。在较复杂的工业系统中,经常采用分布式测控系统完成大量的分布参数的采集。在这一系统中,采用单片机作为分布式系统的前端采集模块,系统具有运行可靠,数据采集方便灵活,成本低廉这一系列优点。家用电器是单片机的又一重要领域,前景十分广,另外,在交通领域中,汽车、火车、飞机、航天器等均有单片机的广泛应用。 1.3设计目的 利用单片机,时钟芯片、温度传感器、数码管等实现日期、时间、温度的显示即一个简单的万年历。将我所
6、学的单片机汇编语言应用及对所学知识的了解熟练运用!加强对51系列单片机的构造了解及应用,熟悉汇编语言或C语言编程,综合掌握和理解设计各部分的工作原理、设计过程、芯片器件的选择方法、模块化编程等多项知识。 (1) 通过万年历的设计掌握好对PROTEUS仿真设计的熟练使用; (2) 通过万年历的设计熟练掌握单片机的各个功能,并且对单片机有一个总体的把握,设计中对单片机各功能的了解,达到理想设计效果; (3) 设计中使用了时钟芯片DS1302、温度传感器DS18B20、LCD显示等,通过设计对他们熟练掌握; (4)用PROTEUS仿真模拟实现具体应用使个人设计系统能够真正使用运行,遇到问题在
7、解决问题; (5)把理论知识与实践知识相结合,充分发挥个人能力,并在实践中得到锻炼,合作解决问题,直到弄透弄懂; (6)提高利用已学的知识分析和解决问题的能力,加深自己对所学知识的理解运用。 2.设计方案 2.1设计任务 通过对所学知识,及对单片机的认识理解,完成一个带有温度测量功能的万年历的软件、硬件设计。 (1)万年历设计系统硬件 (2)万年历设计系统软件 2.2设计内容 (1) 设计前进行总体规划,设计步骤; (2) 对各个元件的了解,画出设计原理电路图; (3) 用PROTEUS软件画出设计电路图; (4) 用
8、KEIL软件编写程序; (5) 把C语言编写的程序转化成单片机可以识别的程序; (6) 在PROTEUS里模拟并调试程序,使其达到理想效果; (7) 填写设计任务书、说明书。 3.总体设计及核心部件简介 3.1总体设计框图 开始 开中断:初始化 显示开机图画 调节标志 调节值 关中断 读温度 调节标志 数据处理 5 4 2 1 3 7 其它它 6
9、 显示数据 月 年 周 日 秒 分 时 开中断 主程序流程图 退出中断 万年历设计包括三大模块:LCD显示(AMPIRE128x64)、DS1302时钟芯片与单片机时钟模块和DS18B20温度传感器与单片机温度模块。 3.2硬件设计 主
10、控制器选用AT89C51单片机,利用AT89C51单片机的定时器/计数器定时和记数的原理,使其能精确计时。利用中断系统使其实现开始暂停的功能。P0口输出数据,P1.1----P1.4口接四个按钮开关,分别实现。电路原理图设计最基本的要求是正确性,其次是布局合理,最后在正确性和布局合理的前提下力求美观。硬件电路图按照图3.1进行设计。 DS1302 AT89C51 LCD显示
11、 单片机 控制器 控制开关 DS18B20 图3.1 万年历硬件电路基本原理图 AT89C51各引脚主要功能简介: (1)VSS(20脚):接地 (2)VCC(40脚): 主电源+5V (3)XTAL1(19脚):接外部晶体的一端。在片内它是
12、振荡电路反相放大器的输入端。在采用外部时钟时,对于HMOS单片机,该端引脚必须接地;对于CHMOS单片机,此引脚作为驱动端。 XTAL2(18脚):接外部晶体的另一端。在片内它是一个振荡电路反相放大器的输出端,振荡电路的频率是晶体振荡频率。若需采用外部时钟电路,对于HMOS单片机,该引脚输入外部时钟脉冲;对于CHMOS单片机,此引脚应悬浮。 (4) RST(9脚): 单片机刚接上电源时,其内部各寄存器处于随机状态,在该脚输入24个时钟周期宽度以上的高电平将使单片机复位(RESET) (5)PSEN(29脚): 在访问片外程序存储器时,此端输出负脉冲作为存储器读选通信号。CPU在向片外存储
13、器取指令期间,PSEN信号在12个时钟周期中两次生效。不过,在访问片外数据存储器时,这两次有效PSEN信号不出现。PSEN端同样可驱动8个LSTTL负载。我们根据PSEN、ALE和XTAL2输出端是否有信号输出,可以判别AT89C51是否在工作。 (6)ALE/PROG(30脚):在访问片外程序存储器时,此端输出负脉冲作为存储器读选通信号。CPU在向片外存储器取指令期间,PSEN信号在12个时钟周期中两次生效。不过,在访问片外数据存储器时,这两次有效PSEN信号不出现。PSEN端同样可驱动8个LSTTL负载。我们根据PSEN、ALE和XTAL2输出端是否有信号输出,可以判别80C51是否在工
14、作。
(7)EA/VPP(31脚):当EA端输入高电平时,CPU从片内程序存储器地址0000单元开始执行程序。当地址超出4KB时,将自动执行片外程序存储器的程序。当EA输入低电平时,CPU仅访问片外程序存储器。在对87C51EPROM编程时,此引脚用于施加编程电压VPP。
(8)输入/输出引脚:
1)P0.0—P0.7 (39脚—32脚)
2)P1.0—P1.7 (01脚—08脚)
3)P2.0—P2.7 (26脚—21脚)
4)P3.0—P3.7 (10脚—17脚)
3.3软件设计
3.3.1主程序:
#include 15、1.h>
#include 16、lag;
unsigned int counter=0;
unsigned char Lcd_t = 0; //LCD刷新间隔
unsigned char flicker = 0; //调时闪烁间隔
//-------------------------
void InitTimer0(void)//产生10ms时间间隔
{
TMOD = (TMOD & 0XF0) | 0X01; //定时器0工作在模式1,16Bit定时器模式
TH0 = (65536 - 8000)/256;
TL0 = (65536 - 8000)%256;
TR0 17、 =1; ET0 =1;//开启定时器和中断
EA = 1;
}
/*****************************阳历转换阴历***********************************/
code unsigned char year_code[597]={
0x04,0xAe,0x53, //1901 0
0x0A,0x57,0x48, //1902 3
0x55,0x26,0xBd, //1903 6
18、 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
19、 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, 20、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, //19 21、22
0x06,0xA5,0x50, //1923
0x06,0xd4,0x45, //1924
0x4A,0xdA,0xB8, //1925
0x02,0xB6,0x4d, //1926
0x09,0x57,0x42, //1927
0x24,0x97,0xB7, //1928
22、 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,0x 23、44, //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
24、 0x0B,0x55,0x4f, //1942
0x05,0x6A,0x45, //1943
0x4A,0xAd,0xB9, //1944
0x02,0x5d,0x4d, //1945
0x09,0x2d,0x42, //1946
0x2C,0x95,0xB6, //1947
0 25、x0A,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, 26、//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
27、 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,0x9 28、5,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
29、
0x4d,0x26,0xB7, //1974
0x0d,0x25,0x4B, //1975
0x8d,0x52,0xBf, //1976
0x0B,0x54,0x52, //1977
0x0B,0x6A,0x47, //1978
0x69,0x6d,0x3C, //1979
30、 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, 31、 //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
32、 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 33、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 34、 //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
35、 0x4B,0x55,0x37, //2012
0x0A,0xd5,0x4A, //2013
0x95,0x5A,0xBf, //2014
0x04,0xBA,0x53, //2015
0x0A,0x5B,0x48, //2016
0x65,0x2B,0xBC, //2017
0x0 36、5,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, // 37、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
38、 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, 39、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
40、 0x7A,0x4B,0xBe, //2044
0x0A,0x4B,0x51, //2045
0x0A,0xA5,0x46, //2046
0x5B,0x52,0xBA, //2047
0x06,0xd2,0x4e, //2048
0x0A,0xdA,0x42, //2049
41、 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, 42、 //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
43、 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,0 44、x2e,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, //207 45、5
0x05,0x5A,0x45, //2076
0x4A,0x5d,0x38, //2077
0x0A,0x5B,0x4C, //2078
0x05,0x2B,0x42, //2079
0x3A,0x93,0xB6, //2080
0x06,0x93,0x49, //2081
46、 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,0x3 47、8, //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
48、 0x04,0xAe,0x45, //2095
0x4A,0x4e,0xB9, //2096
0x0A,0x4d,0x4C, //2097
0x0d,0x15,0x41, //2098
0x2d,0x92,0xB5, //2099
};
//月份数据表
code unsigned char day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78 49、0x97,0xb5,0xd4,0xf3};
code unsigned int day_code2[3]={0x111,0x130,0x14e};
/****************************************************************************
* 子函数,用于读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0
****************************************************************************/
bit GetMoonDay(unsigned 50、char month_p,unsigned short table_addr)
{
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) re






