资源描述
目录
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芯片相关知识 43
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/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总体设计框图
开始
开中断:初始化
显示开机图画
调节标志
调节值
关中断
读温度
调节标志
数据处理
5
4
2
1
3
7
其它它
6
显示数据
月
年
周
日
秒
分
时
开中断
主程序流程图
退出中断
万年历设计包括三大模块:LCD显示(AMPIRE128x64)、DS1302时钟芯片与单片机时钟模块和DS18B20温度传感器与单片机温度模块。
3.2硬件设计
主控制器选用AT89C51单片机,利用AT89C51单片机的定时器/计数器定时和记数的原理,使其能精确计时。利用中断系统使其实现开始暂停的功能。P0口输出数据,P1.1----P1.4口接四个按钮开关,分别实现。电路原理图设计最基本的要求是正确性,其次是布局合理,最后在正确性和布局合理的前提下力求美观。硬件电路图按照图3.1进行设计。
DS1302 AT89C51 LCD显示
单片机
控制器
控制开关 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 <reg51.h>
#include <absacc.h>
#include "zimo.h"
#include "ds1302.h"
#include "ds18b20.h"
#include "lcd12864.h"
//按键定义
sbit KEY0 = P1^1;
sbit KEY1 = P1^2;
sbit KEY2 = P1^3;
sbit KEY3 = P1^4;
//键盘函数所要用到的变量
unsigned char key_operate = 0;
unsigned char timer =0;
unsigned char key_flag;
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 =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
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 unsigned char day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};
code unsigned int day_code2[3]={0x111,0x130,0x14e};
/****************************************************************************
* 子函数,用于读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0
****************************************************************************/
bit GetMoonDay(unsigned 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
展开阅读全文