基于单片机的万年历设计论文.docx
《基于单片机的万年历设计论文.docx》由会员分享,可在线阅读,更多相关《基于单片机的万年历设计论文.docx(54页珍藏版)》请在冰豆网上搜索。
基于单片机的万年历设计论文
1.引言
1.1背景
1946年2月15日,第一台电子数字计算机ENIAC问世,这标志着计算机时代的到来。
计算机的发展,经历了电子计算机、晶体管计算机、集成电路计算机、大规模集成电路计算机和超大规模集成电路计算机五个时代。
微处理器、存储器和I/O接口电路构成微型计算机,从应用形态上,微型计算机可以分为三种:
多板机(系统机)、单板机和单片机。
在一片集成电路芯片上集成微处理器、存储器和I/O接口电路,从而构成了单芯片微型计算机,即单片机。
单片机体积小、控制功能强,其非凡的嵌入式应用形态对于满足嵌入式应用需求具有独特的优势!
单片机技术发展十分迅速,产品种类以琳琅满目,其发展经过三个阶段:
其一:
单片机形成阶段。
1976年,Intel公司提出了MCS-48系列单片机。
主要特点:
在单个芯片内完成了CPU、存储器和I/O接口等部件的集成;但存储器容量较小,寻址范围小(不大于4K),无串行接口,指令系统功能不强。
其二:
单片机结构成熟阶段。
1980年,1976年,Intel公司提出MCS-51系列单片机。
主要特点:
存储器容量增加,寻址范围扩大(64K),结构体系成熟。
其三:
性能提高阶段。
近年来,个半导体厂商不断推出新型单片机芯片,典型的产品如Atmel公司的AT89C51RD2单片机。
主要特点:
控制性能优异、种类繁多。
现在,单片机芯片市场已经呈现出百发齐放、欣欣向荣的局面!
单片机应用技术已经成为电子应用系统设计中最为常用的技术手段,学习和掌握单片机应用技术具有极其重要的现实意义。
1.2应用价值
由于单片机具有良好地控制性能和灵活的潜入品质,其在各种领域都获得了极为广泛的应用。
单片机用于各种仪器仪表,一方面提高了仪器仪表的使用功能和精度,是仪器仪表智能化,同时还简化了仪器仪表的硬件结构,从而可以方便地完成与企业把产品的升级换代。
机电一体化产品是集机械技术、微电子技术、自动控制技术和计算机技术与一体,具有智能化特征的各种机电产品。
单片机还可以用于各种物理量的采集与控制,电流、电压、温度、液压、流量等物理参数的采集和控制均可以利用单片机方便地实现。
在较复杂的工业系统中,经常采用分布式测控系统完成大量的分布参数的采集。
在这一系统中,采用单片机作为分布式系统的前端采集模块,系统具有运行可靠,数据采集方便灵活,成本低廉这一系列优点。
家用电器是单片机的又一重要领域,前景十分广,另外,在交通领域中,汽车、火车、飞机、航天器等均有单片机的广泛应用。
1.3设计目的
利用单片机,时钟芯片、温度传感器、数码管等实现日期、时间、温度的显示即一个简单的万年历。
将我所学的单片机汇编语言应用及对所学知识的了解熟练运用!
加强对51系列单片机的构造了解及应用,熟悉汇编语言或C语言编程,综合掌握和理解设计各部分的工作原理、设计过程、芯片器件的选择方法、模块化编程等多项知识。
(1)通过万年历的设计掌握好对PROTEUS仿真设计的熟练使用;
(2)通过万年历的设计熟练掌握单片机的各个功能,并且对单片机有一个总体的把握,设计中对单片机各功能的了解,达到理想设计效果;
(3)设计中使用了时钟芯片DS1302、温度传感器DS18B20、LCD显示等,通过设计对他们熟练掌握;
(4)用PROTEUS仿真模拟实现具体应用使个人设计系统能够真正使用运行,遇到问题在解决问题;
(5)把理论知识与实践知识相结合,充分发挥个人能力,并在实践中得到锻炼,合作解决问题,直到弄透弄懂;
(6)提高利用已学的知识分析和解决问题的能力,加深自己对所学知识的理解运用。
2.设计方案
2.1设计任务
通过对所学知识,及对单片机的认识理解,完成一个带有温度测量功能的万年历的软件、硬件设计。
(1)万年历设计系统硬件
(2)万年历设计系统软件
2.2设计内容
(1)设计前进行总体规划,设计步骤;
(2)对各个元件的了解,画出设计原理电路图;
(3)用PROTEUS软件画出设计电路图;
(4)用KEIL软件编写程序;
(5)把C语言编写的程序转化成单片机可以识别的程序;
(6)在PROTEUS里模拟并调试程序,使其达到理想效果;
(7)填写设计任务书、说明书。
3.总体设计及核心部件简介
3.1总体设计框图
主程序流程图
万年历设计包括三大模块:
LCD显示(AMPIRE128x64)、DS1302时钟芯片与单片机时钟模块和DS18B20温度传感器与单片机温度模块。
3.2硬件设计
主控制器选用AT89C51单片机,利用AT89C51单片机的定时器/计数器定时和记数的原理,使其能精确计时。
利用中断系统使其实现开始暂停的功能。
P0口输出数据,P1.1----P1.4口接四个按钮开关,分别实现。
电路原理图设计最基本的要求是正确性,其次是布局合理,最后在正确性和布局合理的前提下力求美观。
硬件电路图按照图3.1进行设计。
DS1302AT89C51LCD显示
单片机
控制器
控制开关DS18B20
图3.1万年历硬件电路基本原理图
AT89C51各引脚主要功能简介:
(1)VSS(20脚):
接地
(2)VCC(40脚):
主电源+5V
(3)XTAL1(19脚):
接外部晶体的一端。
在片内它是振荡电路反相放大器的输入端。
在采用外部时钟时,对于HMOS单片机,该端引脚必须接地;对于CHMOS单片机,此引脚作为驱动端。
XTAL2(18脚):
接外部晶体的另一端。
在片内它是一个振荡电路反相放大器的输出端,振荡电路的频率是晶体振荡频率。
若需采用外部时钟电路,对于HMOS单片机,该引脚输入外部时钟脉冲;对于CHMOS单片机,此引脚应悬浮。
(4)RST(9脚):
单片机刚接上电源时,其内部各寄存器处于随机状态,在该脚输入24个时钟周期宽度以上的高电平将使单片机复位(RESET)
(5)PSEN(29脚):
在访问片外程序存储器时,此端输出负脉冲作为存储器读选通信号。
CPU在向片外存储器取指令期间,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是否在工作。
(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
#include
#include"zimo.h"
#include"ds1302.h"
#include"ds18b20.h"
#include"lcd12864.h"
//按键定义
sbitKEY0=P1^1;
sbitKEY1=P1^2;
sbitKEY2=P1^3;
sbitKEY3=P1^4;
//键盘函数所要用到的变量
unsignedcharkey_operate=0;
unsignedchartimer=0;
unsignedcharkey_flag;
unsignedintcounter=0;
unsignedcharLcd_t=0;//LCD刷新间隔
unsignedcharflicker=0;//调时闪烁间隔
//-------------------------
voidInitTimer0(void)//产生10ms时间间隔
{
TMOD=(TMOD&0XF0)|0X01;//定时器0工作在模式1,16Bit定时器模式
TH0=(65536-8000)/256;
TL0=(65536-8000)%256;
TR0=1;ET0=1;//开启定时器和中断
EA=1;
}
/*****************************阳历转换阴历***********************************/
codeunsignedcharyear_code[597]={
0x04,0xAe,0x53,//19010
0x0A,0x57,0x48,//19023
0x55,0x26,0xBd,//19036
0x0d,0x26,0x50,//19049
0x0d,0x95,0x44,//190512
0x46,0xAA,0xB9,//190615
0x05,0x6A,0x4d,//190718
0x09,0xAd,0x42,//190821
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,//1999294
0x0C,0x96,0x45,//2000297
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
};
//月份数据表
codeunsignedcharday_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};
codeunsignedintday_code2[3]={0x111,0x130,0x14e};
/****************************************************************************
*子函数,用于读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0
****************************************************************************/
bitGetMoonDay(unsignedcharmonth_p,unsignedshorttable_addr)
{
switch(month_p)
{
case1:
if((year_code[table_addr]&0x08)==0)return(0);
elsereturn
(1);
case2:
if((year_code[table_addr]&0x04)==0)return(0);
elsereturn
(1);
case3:
if((year_code[table_addr]&0x02)==0)return(0);
elsereturn
(1);
case4:
if((year_code[table_addr]&0x01)==0)return(0);
elsereturn
(1);
case5:
if((year_code[table_addr+1]&0x80)==0)return(0);
elsereturn
(1);
case6:
if((year_code[table_addr+1]&0x40)==0)return(0);
elsereturn
(1);
case7:
if((year_code[table_addr+1]&0x20)==0)return(0);
elsereturn
(1);
case8:
if((year_code[table_addr+1]&0x10)==0)return(0);