万年历

发布时间:   来源:文档文库   
字号:
万年历
第一组:郑建锋、叶泽兵、王海林
摘要
本设计由STC89C52RC为控制芯片,DS1302为时钟芯片,74LS138译码,8个三极管9012输出低电平控制2个共阳4位数码管,5个按键等来实现万年历的基本功能,再由程序来实现用按键来调节万年历的年月日、时分秒的功能。关键字:STC89C52RCDS130274LS138


一、方案论证与比较
方案一:用STC89C51RC来作为控制芯片,NE555做为时钟芯片,74LS138译码,8个三极管9012输出低电平控制2个共阳4位数码管,5个按键等来实现万年历的基本功能。
方案二:用STC89C52RC来作为控制芯片,DS1302做为时钟芯片,74LS138译码,8个三极管9012输出低电平控制2个共阳4位数码管,5个按键等来实现万年历的基本功能。STC89C52RC是由STC89C51RC改进而来,有STC89C51RC的所有功能,故选择STC89C52RC作为控制芯片。DS1302作为时钟芯片具有计算2100年前的年月日、时分秒的能力,还有闰年的调整能力,而NE555适合作为定时器,不适合做时钟芯片,故选择DS1302作为时钟芯片。所以选择方案二。二、原理分析和说明
信号从STC89C52RCPO口经过10K的上拉电阻来控制数码管的显示和P2口控制74LS138译码,三极管9012产生低电平来控制共阳4位数码管。P2口控制DS1302作为时钟芯片,用程序来实现数码管的年月日、时分秒显示和用程序来控制按键调节年月日、时分秒。过反复比较与论证,最终确定的系统方框图如图1所示。


P1口控制4个独立按键,4个按键分别实现年、月、日、时、分、秒的移位,加,减,确定。
P3口控制复位

P0口来控制数码
STC89C52RC
P2口的P20P21P22通过74LS138译码
DS1302时钟芯片具有计算2100年前的年、月、日、时、分秒、的能力,还有闰年的调整能力。
P2口的P23P24P25来控DS1302
74LS138控制9012现数码管的译码
1

下图为程序系统方框图

单片机1302四个独立按键在数码管显示万年历
开始
1302到单片机定义4个独立按键定义
设定初始
1302写入地址数据
键盘译码,设置
M=1?显示时间

显示日期
读写数据
数码管显示


三、各个模块介绍1
独立按键模块
VCC
R4R3R2
R110K*4
1234

Y按键4通过程序设置可控制按键1控制移位,按键23控制年、月、日、Y5Y6时、分、秒的加,减,按键4R为确定。36
1K
Y7
2时钟模块
VCC
BT1U2
R23
R24R25
10K10K10K
8765
VCC1SCLKI/ORST
1302
VCC2
X1X2GND
VCC1234
VCC
Y1
32.768K

DS1302作为时钟芯片具有计算2100年前的年月日、时分秒的能力,有闰年的调整能力。233
74LS138译码模块
3
4
1

16
R26R27R28
470*3
U3123645
ABC
R361K
GND
SASBSC
VCC74LS138
15Y0
Y0
14Y1
Y1
13Y2
Y2
12Y3
Y3
11Y4
Y4
10Y5
Y5
9Y6
Y6
7Y7
Y7
VCC8
VCC

通过程序来控制9012产生低电平来控制数码管的译码四、重要芯片资料174LS138
74LS1383线-8线译码器,共有54/74S13854/74LS138两种线路结构型式。
其工作原理如下:
Title
SizeBDate:File:
3
4
5
Number
16-Jun-20I:\\

①当一个选通端(E1)为高电平,另两个选通端(E2/(E3)为低电平
时,可将地址端(A0A1A2)的二进制编码在Y0Y7对应的输出端以低电平译出。比如:A0A1A2=110时,则Y6输出端输出低电平信号。②利用E1E2E3可级联扩展成24线译码器;若外接一个反相器还可级联扩展成32线译码器。
③若将选通端中的一个作为数据输入端时,74LS138还可作数据分配
4)可用在8086的译码电路中,扩展内存。2DS1302
DS1302是由DS1202改进而来增加了以下的特性双电源管脚用于主电源和备份电源供应Vcc1为可编程涓流充电电源附加七个字节存储器它广泛应用于电话传真便携式仪器以及电池供电的仪器仪表等
产品领域下面将主要的性能指标作一综合
实时时钟具有能计算2100年之前的秒分时日日期星期月年的能力还有闰年调整的能力318位暂存数据存储RAM

串行I/O口方式使得管脚数量最少宽范围工作电压2.05.5V工作电流2.0V,小于300nA
/写时钟或RAM数据时有两种传送方式单字节传送和多字节传送字符组方式8DIP封装或可选的8SOIC封装根据表面装配简单3线接口TTL兼容Vcc=5V可选工业级温度范围-40+85DS1202兼容
DS1202基础上增加的特性Vcc1有可选的涓流充电能力双电源管用于主电源和备份电源供应备份电源管脚可由电池或大容量电容输入
附加的7字节暂存存储器
1
D

五、调试
1检查电路是否能正常工作。
2通过程序来设置万年历的年、月、日、时、分、秒的交替显示,通过程序设置可控制按键1控制移位,按键2按键3控制年、月、日、时、分、秒的加,减,按键4为确定,是否能实现。3如果以上功能均能实现说明调试成功。六、结论
综上所述,本系统采用PCB板工艺制作,经过调试,系统功能均能实现,且系统的稳定性良好。其性能指标和制作工艺接近产品要求,系统不仅仅具有演示功能,而且具有较强的实用性。我们在制作板的过程中从发现问题到解决问题学会了许多东西。加强了我们动手能力。团队合作的精神在这一过程中也得到了充分的展示。我们相互讨论,分工明确,互相帮助,有条不紊的对方案进行修进和调试。七、附录1、原理图
2
3
4
5
SMG1
P00P01P02P03P04P05P06P07
R7R8R9R10R11R12R13R14
470470470470470470470470
SMG11SMG22SMG33SMG44SMG55SMG66SMG77SMG88
a
bcdefgdp
SMG11SMG22SMG33SMG44SMG55SMG66SMG77SMG88
9
6
D
SMG2a
bcdefgdp
12
11
10
12
11
10
C
12
11
10
12
11
10
9
9
C
VCC
9
R4R3R2
R110K*4
1234
1234567813121514VCC
31
191891716
U1P10/TP11/TP12P13P14P15P16P17INT1INT0T1T0EA/VPX1X2RESETRDWR
RXDTXDALE/PPSEN
STC89C52RC
P00P01P02P03P04P05P06P07P20P21P22P23P24P25P26P27
J110K
Q19014
P00P01P02P03P04P05P06P07
R26R27R28
470*3
U3123645
ABCVCC
123456789
Q29014Q39014Q49014Q59014Q69014Q79014Q89014
VCC
3938373635343332
2122232425262728
R151KR161KR171KR181KR191KR201KR211KR221K
VCC
Y716
Y6
VCC74LS138Y0Y1Y2Y3Y4Y5Y6Y7
15Y014Y113Y212Y311Y410Y59Y67Y7
Y5Y4Y3Y2Y1Y0
B
R6100
VCCC1
30p
C310uf
X112M
C2
R361K
GND
SASBSC
B
S1
R510K
30p
10113029
VCC
BT1U2
J212CON2
VCC
J312CON2
VCC
J412CON2
VCC
VCC
R23R24R25
10K10K10K
8765
VCC1SCLKI/ORST
1302
VCC2X1X2GND
VCC1234
8
Y1
32.768K

A
TitleSizeBDate:File:
18-Jul-2011SheetofG:\\二下实物\年历\年历.ddbDrawnBy:
6
Number
Revision
A
12345


2PCB

3、原件清单
810K电阻12470Ω电阻8901291K电阻5个按键
一个10uF电容230P电容112MHz晶振1DS1302一个74LS138
一个STC89C52RC24位共阳数码管110K排阻一个32.768晶振若干插针。
4、程序
#include//头文件包含特殊功能#defineucharunsignedchar//宏定义#defineuintunsignedint
sbitCLK=P2^3;//位定义,变量定义,数组的初值sbitIO=P2^4;sbitRST=P2^5;sbitACC0=ACC^0;sbitACC7=ACC^7;sbitP07=P0^7;

sbitP37=P3^7;//提示音sbitP14=P1^4;//移位sbitP15=P1^5;//加键sbitP16=P1^6;//减键sbitP17=P1^7;//定时启动uchar
a[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};//0.1.2.3.4.5.6.7.8.9.-.的定义ucharb[6]={0x15,0x01,0x00,0x11,0x06,0x15},c[6];//初值110615.150100uchars[12]={9,0,1,3,4,6,7};//移位提示标识uchard[8];//暂存时间uchare[8];//暂存日期
ucharw[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//
ucharmm,m,tt=0,yi=0,k,di,gao,l;uintii;
voiddelay(uintt//延时子程序{
while(t--//t个周期{
uchari;
for(i=0;i<125;i++;//一个周期1ms}}
voidsz(ucharl{
P2=s[l];
P0=a[0];P37=0;delay(200;
P0=a[11];P37=1;delay(200;P0=a[0];P37=0;delay(200;
P0=a[11];P37=1;delay(200;}
/********按键扫描程序******************/
voidkscx(uintmm{
switch(mm
{case1:{TR0=0;tt=0x8e;yi++;sz(yi;if(yi==7yi=1;}break;//按下按钮"1"设置时钟的年月日时分秒

case2:k=2;delay(150;break;下按钮"2",电子时钟设置数据可"+"case3:k=3;delay(150;break;"3"电子时钟设置数据可"-"
case4:TR0=1;tt=0x00,yi=0;break;子时钟确认设置数据default:break;}}
voidkeydeal(//译码程序{
if(P14==0kscx(1;if(P15==0kscx(2;if(P16==0kscx(3;if(P17==0kscx(4;
if(tt==0x8e{
if(yi==1&&m==0的个位{di=c[0]&0x0f;gao=(c[0]&0xf0>>4;if(k==2{di++;c[0]=(gao<<4+di;(调整后的时间重新赋予c[0]}if(k==3{di--;c[0]=(gao<<4+di;}k=0;}if(yi==2&&m==0{di=c[0]&0x0f;
//////按下按钮"4",电//调时间与日期//调时间秒//c[0]的重新赋值//c[0]的重新赋值//调秒的十位
gao=(c[0]&0xf0>>4;if(k==2{gao++;c[0]=(gao<<4+di;//c[0]的重新赋值}if(k==3{gao--;c[0]=(gao<<4+di;//c[0]的重新赋值}k=0;}
if(yi==3&&m==0//调分的个位{
di=c[1]&0x0f;
gao=(c[1]&0xf0>>4;if(k==2{di++;c[1]=(gao<<4+di;//c[1]的重新赋值}if(k==3{di--;c[1]=(gao<<4+di;//c[1]的重新赋值}k=0;}
if(yi==4&&m==0//调分的十位{
di=c[1]&0x0f;
gao=(c[1]&0xf0>>4;if(k==2{gao++;c[1]=(gao<<4+di;//c[1]的重新赋值}if(k==3{gao--;c[1]=(gao<<4+di;//c[1]的重新赋值}k=0;

}if(yi==5&&m==0//调小时的个位{di=c[2]&0x0f;gao=(c[2]&0xf0>>4;if(k==2{di++;c[2]=(gao<<4+di;//c[2]的重新赋值(调整后的时间重新赋c[2]}if(k==3{di--;c[2]=(gao<<4+di;//c[2]的重新赋值(调整后的时间重新赋c[2]}k=0;}
if(yi==6&&m==0//调小时的十位{di=c[2]&0x0f;gao=(c[2]&0xf0>>4;if(k==2{gao++;c[2]=(gao<<4+di;//c[2]的重新赋值(调整后的时间重新赋c[2]}if(k==3{gao--;c[2]=(gao<<4+di;//c[2]的重新赋值(调整后的时间重新赋c[2]}k=0;}
if(yi==1&&m==1//调日的个位{di=c[3]&0x0f;gao=(c[3]&0xf0>>4;if(k==2{di++;c[3]=(gao<<4+di;//c[3]的重新赋值(调整后的时间重新赋c[3]

}if(k==3{di--;c[3]=(gao<<4+di;//c[3]的重新赋值(调整后的时间重新赋c[3]}k=0;}if(yi==2&&m==1//调日的十位{di=c[3]&0x0f;gao=(c[3]&0xf0>>4;if(k==2{gao++;c[3]=(gao<<4+di;//c[3]的重新赋值(调整后的时间重新赋c[3]}if(k==3{gao--;c[3]=(gao<<4+di;//c[3]的重新赋值(调整后的时间重新赋c[3]}k=0;}if(yi==3&&m==1//调月的个位{di=c[4]&0x0f;gao=(c[4]&0xf0>>4;if(k==2{di++;c[4]=(gao<<4+di;//c[4]的重新赋值(调整后的时间重新赋c[4]}if(k==3{di--;c[4]=(gao<<4+di;//c[4]的重新赋值(调整后的时间重新赋c[4]}k=0;}
if(yi==4&&m==1//调月的十位

{di=c[4]&0x0f;gao=(c[4]&0xf0>>4;if(k==2{gao++;c[4]=(gao<<4+di;//c[4]的重新赋值(调整后的时间重新赋c[4]}if(k==3{gao--;c[4]=(gao<<4+di;//c[4]的重新赋值(调整后的时间重新赋c[4]}k=0;}
if(yi==5&&m==1//调年的个位{di=c[5]&0x0f;
gao=(c[5]&0xf0>>4;if(k==2{di++;c[5]=(gao<<4+di;}if(k==3{di--;c[5]=(gao<<4+di;}k=0;}
if(yi==6&&m==1//调年的十位{di=c[5]&0x0f;
gao=(c[5]&0xf0>>4;if(k==2{gao++;c[5]=(gao<<4+di;}if(k==3{gao--;c[5]=(gao<<4+di;}

k=0;}}}
voidxie(ucharu//写入一Byte数据,8{
uchari;ACC=u;
for(i=8;i>0;i--//8{
IO=ACC0;CLK=1;CLK=0;
ACC=ACC>>1;}}
uintr(//读出一Byte数据,8{uchari;
for(i=8;i>0;i--//8{
ACC=ACC>>1;ACC7=IO;CLK=1;CLK=0;}
return(ACC;}
voidw1302(ml,shu//DS1302写入数据{
RST=0;CLK=0;RST=1;
xie(ml;//写入地址xie(shu;//写入数据CLK=1;RST=0;}
ucharr1302(ml//读取DS1302某地址的数据{ucharrq;RST=0;

CLK=0;RST=1;
xie(ml;//写入要读地址
rq=r(;//把地址里的内容读出CLK=1;RST=0;returnrq;}
/**********************************/voidmain(//主函数{
TMOD=0x01;TH0=0xec;TL0=0x78;EA=1;
ET0=1;TR0=1;
w1302(0x8e,0x00;//控制命令,WP=0,写操作w1302(0x80,b[2];//把秒的初值写入秒寄存器w1302(0x82,b[1];//把分的初值写入分寄存器w1302(0x84,b[0];//把小时的初值写入时寄存器w1302(0x86,b[5];//把日的初值写入日寄存器w1302(0x88,b[4];//把月的初值写入月寄存器w1302(0x8c,b[3];//把年的初值写入年寄存器w1302(0x8e,0x80;//控制命令,WP=1,写保护while(1{
/***************************************/
w1302(tt,0x00;//时间的暂停,与时间的开始,由键0x28,0x48控制
w1302(0x80,c[0];w1302(0x82,c[1];w1302(0x84,c[2];w1302(0x86,c[3];w1302(0x88,c[4];w1302(0x8c,c[5];w1302(0x8e,0x80;
/***************************************/
c[0]=r1302(0x81;//读出初值并存入数组cc[1]=r1302(0x83;c[2]=r1302(0x85;c[3]=r1302(0x87;c[4]=r1302(0x89;c[5]=r1302(0x8d;

keydeal(;
/***************************************/
d[1]=(c[0]&0xf0>>4;//时间秒,分,时BCD码的转换d[0]=c[0]&0x0f;d[2]=10;
d[4]=(c[1]&0xf0>>4;d[3]=c[1]&0x0f;d[5]=10;
d[7]=(c[2]&0xf0>>4;d[6]=c[2]&0x0f;
/***************************************/
e[1]=(c[3]&0xf0>>4;//日期日,月,年BCD码的转换e[0]=c[3]&0x0f;e[2]=10;
e[4]=(c[4]&0xf0>>4;e[3]=c[4]&0x0f;e[5]=10;
e[7]=(c[5]&0xf0>>4;e[6]=c[5]&0x0f;
/***************************************/if(m==0//显示时间{ucharh;for(h=0;h<8;h++{P0=a[d[h]];P2=h;delay(2;}}
/***************************************/if(m==1//显示日期{ucharg;for(g=0;g<8;g++{P0=a[e[g]];P2=g;delay(2;}}}}
time0_int(voidinterrupt1//定时器0中断服务1{TH0=0xec;//计时50ms一次

}
TL0=0x78;ii++;
if(ii==1500//7.5s清零一次ii=0;
if(ii<=1000//0-5s显示时间m=0;
else//5-7.5s显示日期m=1;

本文来源:https://www.2haoxitong.net/k/doc/f149593510661ed9ad51f36e.html

《万年历.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式