单片机时钟程序.docx
《单片机时钟程序.docx》由会员分享,可在线阅读,更多相关《单片机时钟程序.docx(33页珍藏版)》请在冰豆网上搜索。
单片机时钟程序
实验目的:
通过设计电子时钟的综合实验掌握单片机编程的基本思想,学会对一些周边芯片的综合利用。
通过实验,真正理解所学知识。
实验要求:
数码管型时钟,可以显示时间、日期、星期、闰年,并有整点报时及闹铃,农历功能。
实验器材:
主要用到的芯片有:
PCF8563时钟芯片,ZLG7290键盘检测及LED显示模块,蜂鸣器及51单片机。
系统概述:
先对时钟芯片初始化,然后取出数据,进行处理,农历转换,并判断是否整点及到达定时时间,根据判断到的按键,进行相应的处理及显示。
硬件介绍:
1、ZLG7290ZLG7290是一I2C接口键盘及LED驱动管理器件,提供数据译码和循环、移位、段寻址等控制。
它可采样64个按键或传感器,单片即可完成LED显示、键盘接口的全部功能。
ZLG7290的从地址为70H,器件内部通过I2C总线访问的寄存器地址范围为00H~17H,任一寄存器都可按字节直接读写,并支持自动增址功能和地址翻转功能。
使用ZLG7290驱动数码管显示有两种方法,第一种方法是向命令缓冲区(07H-08H)写入复合指令,向07H写入命令并选通相应的数码管,向08H写入所要显示的数据,这种方法每次只能写入一个字节的数据,多字节数据的输出可在程序中用循环写入的方法实现;第二种方法是向显示缓存寄存器(10H~17H)写入所要显示的数据的段码,段码的编码规则为从高位到低位为abcdefgdp,这种方法每次可写入1~8个字节数据。
ZLG7290读普通键的入口地址和读功能键的入口地址不同,读普通按键的地址为01H,读功能键的地址为03H。
读普通键返回按键的编号,读功能键返回的不是按键编号,需要程序对返回值进行翻译,转换成功能键的编号。
2:
PCF8563时钟芯片PCF8563是PHILIPS公司生产的低功耗CMOS实时时钟/日历芯片,芯片最大总线速度为400kbits/s,每次读写数据后,其内嵌的字地址寄存器器会自动产生增量。
PCF8563可广泛应用于移动电话、便携仪器、传真机、电池电源等产品中。
PCF8563有16个8位寄存器,其中包括:
可自动增量的地址寄存器、内置32.768kHz的振荡器(带有一个内部集成电容)、分频器(用于给实时时钟RTC提供源时钟)、可编程时钟输出、定时器、报警器、掉电检测器和400kHz的I2C总线接口。
所有16个寄存器设计成可寻址的8位并行寄存器,但不是所有位都有用。
当一个RTC寄存器被读时,所有计数器的内容将被锁存,因此,在传送条件下,可以禁止对时钟/日历芯片的错读。
3:
I2C介绍
1、只要求两条总线线路:
一条串行数据线SDA,一条串行时钟线SCL;
2、每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址,主机可以作为主机发送器或主机接收器;
3、它是一个真正的多主机总线,如果两个或更多主机同时初始化,数据传输可以通过冲突检测和仲裁防止数据被破坏;
4、串行的8位双向数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s;
5、连接到相同总线的IC数量只受到总线的最大电容400pF限制。
实验原理:
选用的时钟芯片及显示模块均采用了I2C总线标准,使整个系统接线更简单,并且数据传输更简单。
程序主要由以下几部分组成:
I2C读写:
写数据ISendStr(ucharsla,ucharsuba,uchar*s,ucharno);
读数据IRcvStr(ucharsla,ucharsuba,uchar*s,ucharno);
ZLG7290数码管显示及键盘取键值:
发送数据ZLG7290_SendData(unsignedcharSubAdd,unsignedcharData);
显示数据ZLG7290_SendBuf(unsignedchar*disp_buf,unsignedcharnum);
发送命令ZLG7290_SendCmd(unsignedcharData1,unsignedcharData2);
取键值ZLG7290_GetKey();
农历转换部分,闹铃显示,整点报时等。
程序开始,首先初始化PCF8563时钟芯片,然后进入while循环,进行显示及键盘判断。
程序设置了几个全局变量,专门用于存储按键次数,达到一键多用的效果。
下面的程序根据按键的次数,选择处理不同的数据或进行不同的操作。
本程序共用了5个按键,其中1键专门用于切换显示,2键用于修改时间及星期,3
键用于调整日期,4键用于修改闹铃。
5键专门用于调整。
c程序:
#include"reg52.h"
#include"VIIC_C51.H"
#include"zlg7290.h"
#include"intrins.h"
#include"18b20.h"//温度:
ReadTemperature()
#definePCF85630xA2//定义器件地址
#defineWRADDR0x00//定义写单元的首地址
#defineRDADDR0x02//定义读单元的首地址
#defineucharunsignedchar
#defineuintunsignedint
unsignedcharTempH,TempL;
uinttemp;
sbitKEY_INT=P3^2;
sbitRST=P1^0;
sbitP1_3=P1^3;
ucharnum[9]={0x00,0x12};
unsignedchardisp_buf[8]={0,0,0,0,0,0,0,0};//显示缓存
unsignedcharrd[7];//定义缓冲接收区
unsignedcharnao[3]={0x00,0x00,0x00};
ucharyear_moon,month_moon,day_moon,week;//农历声明
unsignedcharKEY;//保存键值
intswich_date=0;
inti,j,k;
voidConversion(bitc,ucharyear,ucharmonth,ucharday);
//闹铃
unsignedcharcodeTABLE[]={0x82,0x01,0x81,0x94,0x84,0xB4,0xA4,0x04,
0x82,0x01,0x81,0x94,0x84,0xC4,0xB4,0x04,
0x82,0x01,0x81,0xF4,0xD4,0xB4,0xA4,0x94,
0xE2,0x01,0xE1,0xD4,0xB4,0xC4,0xB4,0x04,
0x82,0x01,0x81,0x94,0x84,0xB4,0xA4,0x04,
0x82,0x01,0x81,0x94,0x84,0xC4,0xB4,0x04,
0x82,0x01,0x81,0xF4,0xD4,0xB4,0xA4,0x94,
0xE2,0x01,0xE1,0xD4,0xB4,0xC4,0xB4,0x04,0};
unsignedintcodeTABLE1[]={64260,64400,64524,64580,64684,64777,64820,64898,
64968,65030,65058,65110,65157,65178,65217};
unsignedcharth0_temp,tl0_temp;
//农历
codeucharyear_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
};
codeucharday_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};
codeuintday_code2[3]={0x111,0x130,0x14e};
bitc_moon;
bitget_moon_day(ucharmonth_p,uinttable_addr)
{
uchartemp;
switch(month_p)
{
case1:
{
temp=year_code[table_addr]&0x08;
if(temp==0)
return(0);
else
return
(1);
}
case2:
{
temp=year_code[table_addr]&0x04;
if(temp==0)
return(0);
else
return
(1);
}
case3:
{
temp=year_code[table_addr]&0x02;
if(temp==0)
return(0);
else
return
(1);
}
case4:
{
temp=year_code[table_addr]&0x01;
if(temp==0)
return(0);
else
return
(1);
}
case5:
{
temp=year_code[table_addr+1]&0x80;
if(temp==0)
return(0);
else
return
(1);
}
case6:
{
temp=year_code[table_addr+1]&0x40;
if(temp==0)
return(0);
else
return
(1);
}
case7:
{
temp=year_code[table_addr+1]&0x20;
if(temp==0)
return(0);
else
return
(1);
}
case8:
{
temp=year_code[table_addr+1]&0x10;
if(temp==0)
return(0);
else
return
(1);
}
case9:
{
temp=year_code[table_addr+1]&0x08;
if(temp==0)
return(0);
else
return
(1);
}
case10:
{
temp=year_code[table_addr+1]&0x04;
if(temp==0)
return(0);
else
return
(1);
}
case11:
{
temp=year_code[table_addr+1]&0x02;
if(temp==0)
return(0);
else
return
(1);
}
case12:
{
temp=year_code[table_addr+1]&0x01;
if(temp==0)
return(0);
else
return
(1);
}
case13:
{
temp=year_code[table_addr+2]&0x80;
if(temp==0)
return(0);
else
return
(1);