最新版基于51系列单片机及DS1302时钟芯片的电子时钟C语言毕业论文Word格式文档下载.docx
《最新版基于51系列单片机及DS1302时钟芯片的电子时钟C语言毕业论文Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《最新版基于51系列单片机及DS1302时钟芯片的电子时钟C语言毕业论文Word格式文档下载.docx(15页珍藏版)》请在冰豆网上搜索。
1.1主要IC芯片选择
1.1.1微处理器选择
目前在单片机系统中,应用比较广泛的微处理器芯片主要为8XC5X系列单片机。
该系列单片机均采用标准MCS-52内核,硬件资源相互兼容,品类齐全,功能完善,性能稳定,体积小,价格低廉,货源充足,调试和编程方便,所以应用极为广泛。
例如比较常用的AT89C2052单片机,带有2KBFlash可编程、可擦除只读存储器(E2PROM)的低压、高性能8位CMOS微型计算机。
拥有15条可编程IO引脚,2个16位定时器计数器,6个中断源,可编程串行UART通道,并能直接驱动LED输出[1]。
仅仅是为了完成时钟设计或者是环境温度采集设计,应用AT89C2052单片机完全可以实现。
但是将两种功能结合在一片单片机上,就需要更多的IO引脚,故本设计采用具有32根IO引脚的AT89C52单片机。
AT89C52单片机是一款低功耗,低电压,高性能CMOS8位单片机,片内含4KB(可经受1000次擦写周期)的FLASH可编程可反复擦写的只读程序存储器(EPROM),器件采用CMOS工艺和ATMEI公司的高密度、非易失性存储器(NURAM)技术制造,其输出引脚和指令系统都与MCS-52兼容。
片内的FLASH存储器允许在系统内可改编程序或用常规的非易失性存储器编程器来编程。
因此,AT89C52是一种功能强,灵活性高且价格合理的单片机,可方便的应用在各个控制领域。
AT89C52具有以下主要性能:
1.4KB可改编程序Flash存储器;
2.全静态工作:
0——24Hz;
3.128×
8字节内部RAM;
4.32个外部双向输入输出(IO)口;
5.6个中断优先级;
2个16位可编程定时计数器;
6.可编程串行通道;
7.片内时钟振荡器。
此外,AT89C52是用静态逻辑来设计的,其工作频率可下降到0Hz,并提供两种可用软件来选择的省电方式——空闲方式(IdleMode)和掉电方式(PowerDownMode)。
在空闲方式中,CPU停止工作,而RAM、定时器计数器、串行口和中断系统都继续工作。
在掉电方式中,片内振荡器停止工作,由于时钟被“冻结”,使一切功能都暂停,只保存片内RAM中的内容,直到下一次硬件复位为止。
AT89C51为适应不同的产品需求,采用PDIP、TQFP、PLCC三种封装形式,本系统采用双列直插PDIP封装形式。
1.1.2DS1302简介
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟日历芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。
实时时钟可提供秒、分、时、日、星期、月和年,一个月小于31天时可以自动调整,且具有闰年补偿功能。
工作电压宽达2.5~5.5V。
采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。
有主电源和备份电源双引脚,而且备份电源可由大容量电容(>1F)来替代。
需要强调的是,DS1302需要使用32.768KHz的晶振[2]。
2、电子时钟硬件电路设计
电子闹钟至少要包括秒信号发生器、时间显示电路、按键电路、供电电源、闹铃指示电路等几部分。
硬件电路框图参照图2.3。
该系统使用AT89C52单片机作为核心,通过读取时钟日历芯片DS1302数据,完成此电子时钟的主要功能——时钟。
使用LM016L液晶屏显示年、月、日、时、分、秒。
图2.1多功能电子时钟硬件系统框图
键盘是为了完成时钟日历的校对和日历温度的显示功能。
由于此电子时钟要求具有闹铃功能,所以设计有闹铃电路,进行声音响铃。
整个电路使用了两种电源,+5V电源将为整个电路供电。
而+3V电源仅作为DS1302的备用电源。
当+5V电源被切断后,DS1302启用+3V电源,可以保持DS1302继续工作。
当+5V电源恢复供电,LED依旧显示当前时间,而不会因为断电使系统复位到初始化时间,避免了重新校时的麻烦。
2.1.主控部分(单片机MCS-52)
MCS-52单片机作为主控芯片,控制整个电路的运行。
其外围电路主要有两部分:
复位电路和晶体振荡器。
复位电路的功能是:
系统上电时提供复位信号,直至系统电源稳定后,撤消复位信号。
为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起的抖动而影响复位。
该设计采用含有二极管的复位电路,复位电路可以有效的解决电源毛刺和电源缓慢下降(电池电压不足)等引起的问题,在电源电压瞬间下降时可以使电容迅速放电,一定宽度的电源毛刺也可令系统可靠复位。
晶体振荡电路:
MCS-52单片机中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别为该反向放大器的输入端和输出端。
这个反向放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成自激振荡器。
外接石英晶体(或陶瓷谐振器)及电容C1、C2接在放大器的反馈回路中构成并联振荡电路。
对外接电容C1、C2虽然没有十分严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程度及温度稳定性。
图2.2主控部分电路图
2.2时钟电路设计
系统时钟应用了实时时钟日历芯片DS1302,其连接如图2.3。
该硬件电路设计简单,抗干扰能力强。
如图,AT89C52单片机P1.5直接接DS1302的RST端,上电后,AT89C51的P1.5脚自动输出高电平。
P1.6作为串行时钟接口,P1.7作为时钟数据的IO。
DS1302采用双电源供电,平时由+5V电源供电,当+5V掉电之后,由图中BT1(+3V备用电池)供电。
特别需要注意X1和X2两端连接的晶振Y1,该晶振频率为32.768KHz。
图2.3系统时钟电路
2.3整点报时功能
采用蜂鸣器闹铃结构简单,控制方便,但是发出的闹铃声音单一。
也可以在编程的时候编写一段音乐程序,待闹铃时间到时,调用该音乐程序给扬声器,便响起音乐。
不过该方法只能做一些简单音乐,并且音乐程序会占用很多单片机存储资源。
还有一种方法是采用录音放音芯片1420做闹铃,先对录放音设备录入一段音乐,当到设定时间时,单片机控制录放音设备放音。
采用录放音电路,铃声可以是预先设定的一段自己喜欢的音乐,符合电器设备人性化的要求。
且1420芯片可以分段录音,还具有语音报时功能。
另外,也可以购置一块音乐集成电路,加置在单片机和蜂鸣器之间,当单片机连接闹铃电路的管脚送出高电平时,音乐集成电路会给蜂鸣器特定脉冲,使蜂鸣器发声。
此类集成电路体积较小,使用方便,不足的是音乐简单、单一[4]。
闹铃的闹钟不是本设计中的重点,故采用最简单的方法,占用单片机一根IO口P3.7,当响铃标志位为“1”时,P3.7送一定频率脉冲,使蜂鸣器U11发出声音。
如图2.4
图2.4闹铃电路
2.4LCDLM016L液晶屏显示电路
LM016L液晶模块采用HD44780控制器,TempDat;
}
voidWDS1302(ucharucAddr,ucharucDat)
{
DS1302_RST=0;
DS1302_SCLK=0;
DS1302_RST=1;
DS1302_Write(ucAddr);
DS1302_Write(ucDat);
DS1302_SCLK=1;
}
ucharRDS1302(ucharucAddr)
ucharucDat;
ucDat=DS1302_Read();
returnucDat;
****************DS1302的初始状态的时间设定****************
voidinit_1302()
{
WDS1302(0x8e,0x00);
开保护寄存器
WDS1302(0x80,0x50);
秒
WDS1302(0x82,0x01);
分
WDS1302(0x84,0x14);
时
WDS1302(0x8A,0x03);
星期
WDS1302(0x86,0x06);
日
WDS1302(0x88,0x06);
月
WDS1302(0x8C,0x12);
年
WDS1302(0x90,0xab);
卷电流充电
WDS1302(0x8e,0x80);
关保护寄存器
************************1602驱动************************
bitlcd_bz()
bitresult;
rs=0;
rw=1;
ep=1;
_nop_();
result=(bit)(P0&
0x80);
ep=0;
returnresult;
voidlcd_wcmd(ucharcmd)
while(lcd_bz());
rw=0;
P0=cmd;
ep=0;
voidlcd_pos(unsignedcharpos)
lcd_wcmd(pos|0x80);
voidlcd_wdat(unsignedchardat)
rs=1;
P0=dat;
voidlcd_init()
lcd_wcmd(0x38);
delay
(1);
lcd_wcmd(0x0c);
lcd_wcmd(0x06);
lcd_wcmd(0x01);
*********************调时函数*************************
voidset_time()
signedcharaddress,item;
signedcharmax,mini;
if(M==0)
{
sel++;
delay(300);
if(sel==7)sel=0;
if(sel==2){address=0x82;
max=59;
mini=0;
}分
if(sel==1){address=0x84;
max=23;
}时
if(sel==6){address=0x8c;
max=99;
mini=9;
}年
if(sel==4){address=0x88;
max=12;
mini=1;
}月
if(sel==5){address=0x86;
max=31;
}日
if(sel==3){address=0x8A;
max=07;
}星期
M=1;
}
item=((RDS1302(address+1))16)*10+(RDS1302(address+1))%16;
if(U==0)
{
delay(200);
U=1;
item++;
if(D==0)
D=1;
item--;
if(W==0)
sel=0;
W=1;
if(item>
max)item=mini;
if(item<
mini)item=max;
WDS1302(0x8e,0x00);
允许写操作
WDS1302(address,(item10)*16+item%10);
写入DS1302转成BCD码
写保护,禁止写操作
*********************显示子函数************************
voidlcdshow_u(uchari,uchary)
lcd_wcmd(0x80+i);
lcd_wdat(y);
voidlcdshow_d(uchari,uchary)
lcd_wcmd(0xC0+i);
*******************显示函数****************************
voiddisplay(void)
ucharx,y;
x=RDS1302(HOUR);
时
y=x;
x=x>
>
4;
lcdshow_u(6,0x30+x);
y=y&
0x0f;
lcdshow_u(7,0x30+y);
lcdshow_u(8,'
:
'
);
x=RDS1302(MINUTE);
分
lcdshow_u(9,0x30+x);
lcdshow_u(0x0a,0x30+y);
lcdshow_u(0x0b,'
x=RDS1302(SECOND);
秒
lcdshow_u(0x0c,0x30+x);
lcdshow_u(0x0d,0x30+y);
x=RDS1302(0x8b);
lcdshow_u(0x0e,0x30+x);
lcdshow_u(0x0f,0x30+y);
x=RDS1302(0x8d);
lcdshow_d(8,0x30+x);
lcdshow_d(9,0x30+y);
lcdshow_d(0x0a,'
-'
x=RDS1302(0x89);
lcdshow_d(0x0b,0x30+x);
lcdshow_d(0x0c,0x30+y);
lcdshow_d(0x0d,'
x=RDS1302(0x87);
lcdshow_d(0x0e,0x30+x);
lcdshow_d(0x0f,0x30+y);
****************下面的if实现每到8:
10和14:
10的提醒功能****************
if((RDS1302(HOUR)==0x14&
RDS1302(MINUTE)==0x10)|(RDS1302(HOUR)==0x08&
RDS1302(MINUTE)==0x10))
SPK=0;
delay(200);
SPK=1;
for(x=45;
x>
0;
x--)
set_time();
delay(10);
**************************主函数******************************
voidmain()
uchari;
lcd_init();
delay(10);
lcd_pos(0x03);
i=0;
while(DIS1[i]!
='
\0'
)
lcd_wdat(DIS1[i]);
i++;
}
lcd_pos(0x41);
while(DIS2[i]!
lcd_wdat(DIS2[i]);
}
init_1302();
delay(1000);
for(i=0;
i<
17;
i++)
lcdshow_u(i,'
delay(150);
lcdshow_d(i,'
<
lcdshow_u(0,'
T'
lcdshow_u(1,'
i'
lcdshow_u(2,'
m'
lcdshow_u(3,'
e'
lcdshow_u(14,'
'
lcdshow_d(0,'
D'
lcdshow_d(1,'
a'
lcdshow_d(2,'
t'
lcdshow_d(3,'
lcdshow_d(6,'
2'
lcdshow_d(7,'
0'
LCD框架描绘
while
(1)
set_time();
if(sel==2){lcdshow_u(0X09,'
lcdshow_u(0x0a,'
delay(500);
if(sel==1){lcdshow_u(0X06,'
lcdshow_u(0X07,'
if(sel==3){lcdshow_u(0X0E,'
lcdshow_u(0X0F,'
if(sel==4){lcdshow_d(0x0b,'
lcdshow_d(0x0c,'
if(sel==5){lcdshow_d(0x0e,'
lcdshow_d(0x0f,'
if(sel==6){lcdshow_d(0x08,'
lcdshow_d(0x09,'
if(sel==8)display();
调时LCD闪烁显示
display();
附录C元器件清单
元器件名称
型号
数量
单片机
STC89C52
1
液晶显示屏
LCD1602
时钟芯片
DS1302
蜂鸣器
5V
晶体振荡器
32.768K
12M
排阻
A103J
按键开关
常开
3