电子时钟设计报告docx文档格式.docx
《电子时钟设计报告docx文档格式.docx》由会员分享,可在线阅读,更多相关《电子时钟设计报告docx文档格式.docx(27页珍藏版)》请在冰豆网上搜索。
![电子时钟设计报告docx文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/26/70b6caa0-df27-4b22-beb8-94da0db8ce6b/70b6caa0-df27-4b22-beb8-94da0db8ce6b1.gif)
2.1.2整点报时功能
采用蜂鸣器闹铃结构简单,控制方便,但是发出的闹铃声音单一。
也可以在编程的时候编写一段音乐程序,待闹铃时间到时,调用该音乐程序给扬声器,便响起音乐。
不过该方法只能做一些简单音乐,并且音乐程序会占用很多单片机存储资源。
还有一种方法是采用录音放音芯片1420做闹铃,先对录放音设备录入一段音乐,当到设定时间时,单片机控制录放音设备放音。
采用录放音电路,铃声可以是预先设定的一段自己喜欢的音乐,符合电器设备人性化的要求。
且1420芯片可以分段录音,还具有语音报时功能。
另外,也可以购置一块音乐集成电路,加置在单片机和蜂鸣器之间,当单片机连接闹铃电路的管脚送出高电平时,音乐集成电路会给蜂鸣器特定脉冲,使蜂鸣器发声。
此类集成电路体积较小,使用方便,不足的是音乐简单、单一。
闹铃的闹钟不是本设计中的重点,故采用最简单的方法,占用单片机一根I/O口P1.7,中间用PNP型三极管S9012连接P1.7和蜂鸣器。
当P1.7引脚为低电平时,S9012的发射极和集电极导通,使蜂鸣器发声。
当响铃标志位为“1”时,P1.7送一定频率脉冲,使蜂鸣器U11发出声音。
如图2.3所示
图2.3闹铃电路
2.2器件的功能与作用
2.2.1微处理器选择
目前在单片机系统中,应用比较广泛的微处理器芯片主要为8XC5X系列单片机。
该系列单片机均采用标准MCS-52内核,硬件资源相互兼容,品类齐全,功能完善,性能稳定,体积小,价格低廉,货源充足,调试和编程方便,所以应用极为广泛。
例如比较常用的AT89C2052单片机,带有2KBFlash可编程、可擦除只读存储器(E2PROM)的低压、高性能8位CMOS微型计算机。
拥有15条可编程I/O引脚,2个16位定时器/计数器,6个中断源,可编程串行UART通道,并能直接驱动LED输出。
仅仅是为了完成时钟设计或者是环境温度采集设计,应用AT89C2052单片机完全可以实现。
但是将两种功能结合在一片单片机上,就需要更多的I/O引脚,故本设计采用具有32根I/O引脚的AT89C52单片机。
AT89C52单片机是一款低功耗,低电压,高性能CMOS8位单片机,片内含4KB(可经受1000次擦写周期)的FLASH可编程可反复擦写的只读程序存储器(EPROM),器件采用CMOS工艺和ATMEI公司的高密度、非易失性存储器(NURAM)技术制造,其输出引脚和指令系统都与MCS-52兼容。
片内的FLASH存储器允许在系统内可改编程序或用常规的非易失性存储器编程器来编程。
因此,AT89C52是一种功能强,灵活性高且价格合理的单片机,可方便的应用在各个控制领域[6]。
AT89C52具有以下主要性能:
1.4KB可改编程序Flash存储器;
2.全静态工作:
0——24Hz;
3.128×
8字节内部RAM;
4.32个外部双向输入/输出(I/O)口;
5.6个中断优先级;
2个16位可编程定时计数器;
6.可编程串行通道;
7.片内时钟振荡器。
此外,AT89C52是用静态逻辑来设计的,其工作频率可下降到0Hz,并提供两种可用软件来选择的省电方式——空闲方式(IdleMode)和掉电方式(PowerDownMode)。
在空闲方式中,CPU停止工作,而RAM、定时器/计数器、串行口和中断系统都继续工作。
在掉电方式中,片内振荡器停止工作,由于时钟被“冻结”,使一切功能都暂停,只保存片内RAM中的内容,直到下一次硬件复位为止。
AT89C51为适应不同的产品需求,采用PDIP、TQFP、PLCC三种封装形式,本系统采用双列直插PDIP封装形式。
2.2.2DS1302简介
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟日历芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。
实时时钟可提供秒、分、时、日、星期、和年,一个小于31天时可以自动调整,且具有闰年补偿功能。
工作电压宽达2.5~5.5V。
采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。
有主电源和备份电源双引脚,而且备份电源可由大容量电容(>1F)来替代。
需要强调的是,DS1302需要使用32.768KHz的晶振。
DS1302引脚说明
图2.4DS1302芯片引脚图
其的引脚功能参照表2.1
表2.1DS1302引脚功能说明
引脚号
名称
功能
1
VCC1
备份电源输入
2
X1
32.768KHz晶振输入
3
X2
晶振输出
4
GND
地
5
RST
控制移位寄存器/复位
6
I/O
数据输入/输出
7
SCLK
串行时钟
8
VCC2
主电源输入
3系统软件设计
3.1程序流程设计
图3.1程序流程图
3.2程序代码
#include<
reg52.h>
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitdata1=P3^7;
ucharTh;
ucharTl;
ucharmode;
ucharfuhao,flag1=2,flag2,flag3,flag4=0;
unsignedlongnum=0;
ucharbuffer[8];
uchardata_7seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x89,0x86,0xc7,0xbf,0xff,0xb6};
ucharcodewm[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
ucharhour,min,sec,nz_hour,nz_min,nz_sec;
sbitshi=P1^0;
sbitfen=P1^1;
sbitmiao=P1^2;
sbitrst=P1^4;
sbitsck=P1^5;
sbitio=P1^6;
sbitbeep=P1^7;
sbitwen=P3^0;
sbitclk=P3^1;
sbitmiaobiao=P3^2;
sbitnaozhong=P3^3;
unsignedcharjp=0;
//n为节拍常数变量
unsignedcharcodemusic_tab[]={
0x18,0x30,0x1C,0x10,//格式为:
频率常数,节拍常数,频率常数,节拍常数,
0x20,0x40,0x1C,0x10,
0x18,0x10,0x20,0x10,
0x1C,0x10,0x18,0x40,
0x1C,0x20,0x20,0x20,
0x1C,0x20,0x18,0x20,
0x20,0x80,0xFF,0x20,
0x30,0x1C,0x10,0x18,
0x20,0x15,0x20,0x1C,
0x20,0x20,0x20,0x26,
0x40,0x20,0x20,0x2B,
0x20,0x26,0x20,0x20,
0x20,0x30,0x80,0xFF,
0x20,0x20,0x1C,0x10,
0x18,0x10,0x20,0x20,
0x26,0x20,0x2B,0x20,
0x30,0x20,0x2B,0x40,
0x20,0x30,0x1C,0x10,
0x18,0x20,0x15,0x20,
0x26,0x40,0x20,0x20,
0x2B,0x20,0x26,0x20,
0x20,0x20,0x30,0x80,
0x20,0x10,0x1C,0x10,
0x20,0x20,0x26,0x20,
0x2B,0x20,0x30,0x20,
0x2B,0x40,0x20,0x15,
0x1F,0x05,0x20,0x10,
0x1C,0x10,0x20,0x20,
0x20,0x20,0x30,0x30,
0x18,0x40,0x1C,0x20,
0x20,0x20,0x26,0x40,
0x13,0x60,0x18,0x20,
0x15,0x40,0x13,0x40,
0x18,0x80,0x00
};
/*函数声明:
*/
voidwrite_ds1302_byte(uchardat);
voidwrite_ds1302(ucharadd,uchardat);
ucharread_ds1302(ucharadd);
voidread_rtc();
voidset_rtc();
voiddisplay();
voiddelay(intn);
voidshow();
voidfmzz();
voiddelay_pl(unsignedcharm)//控制频率延时
{
unsignedi=3*m;
while(--i);
}
voiddelayms(unsignedchara)//毫秒延时子程序
while(--a);
voiddelay_15us(ucharn)
{
while(n)
_nop_();
n--;
}
/*DS1302单字节写入:
voidwrite_ds1302_byte(uchardat)
uchari;
for(i=0;
i<
8;
i++)
sck=0;
io=dat&
0x01;
dat=dat>
>
1;
sck=1;
/*DS1302多字节写入:
voidwrite_ds1302(ucharadd,uchardat)
rst=0;
rst=1;
write_ds1302_byte(add);
write_ds1302_byte(dat);
io=1;
/*DS1302读取:
ucharread_ds1302(ucharadd)
uchari,value;
value=value>
if(io)value=value|0x80;
returnvalue;
/*调整时间:
voidset_rtc()
if(shi==0)delay(100);
if(shi==0)
hour=(hour>
4)*10+(hour&
0x0f);
hour++;
if(hour==24)hour=0;
hour=((hour/10)<
<
4)+(hour%10);
write_ds1302(0x84,hour);
while(shi==0);
if(fen==0)delay(100);
if(fen==0)
min=(min>
4)*10+(min&
min++;
if(min==60)min=0;
min=((min/10)<
4)+(min%10);
write_ds1302(0x82,min);
while(fen==0);
if(miao==0)delay(100);
if(miao==0)
sec=(sec>
4)*10+(sec&
sec++;
if(sec==60)sec=0;
sec=((sec/10)<
4)+(sec%10);
write_ds1302(0x80,sec);
while(miao==0);
/*读取时间:
voidread_rtc()
hour=read_ds1302(0x85);
min=read_ds1302(0x83);
sec=read_ds1302(0x81);
/*显示时间:
voiddisplay()
unsignedinta=1;
P2=0x01;
P0=data_7seg[hour/16];
delay(a);
P2=0x02;
P0=data_7seg[hour%16];
P2=0x04;
P0=data_7seg[13];
P2=0x08;
P0=data_7seg[min/16];
P2=0x10;
P0=data_7seg[min%16];
P2=0x20;
P2=0x40;
P0=data_7seg[sec/16];
P2=0x80;
P0=data_7seg[sec%16];
/*蜂鸣:
voidfmzz()
uinti;
100;
beep=!
beep;
delay
(1);
/*延时程序:
voiddelay(intn)
unsignedinti,j;
for(i=0;
n;
for(j=0;
j<
120;
j++)
{;
/*显示学号:
voidshow()
unsignedintm;
for(m=0;
m<
20;
m++)
uinta=10;
P0=data_7seg[10];
P0=data_7seg[11];
P0=data_7seg[12];
P0=data_7seg[0];
///////////////////////////////////////////////////////////////////////////////////////////////
voiddispmiaobiao(uchar*p)
uchart;
for(t=0;
t<
t++)
P2=wm[t];
P0=data_7seg[p[t]];
if(t==5)
P0&
=0x7f;
delay
(2);
voiddata_chuli(uchar*p)
p[7]=num%10;
p[6]=num%100/10;
p[5]=num%1000/100;
p[4]=num%10000/1000;
p[3]=num%100000/10000;
p[2]=num%1000000/100000;
p[1]=num%10000000/1000000;
p[0]=num%100000000/1000000;
if(p[0]==0)
p[0]=14;
if(p[1]==0)
p[1]=14;
if(p[2]==0)
p[2]=14;
if(p[3]==0)
p[3]=14;
if(p[4]==0)
p[4]=14;
voidtimer0()interrupt1
TH0=-10000/256;
TL0=-10000%256;
num++;
if(num==10000000)num=0;
voidTimer1()interrupt3
{TH1=0xd8;
TL1=0xef;
jp--;
////////////////////////////////////////////////////////////////////////////////////////////
voidset_naozhong()
nz_hour=(nz_hour>
4)*10+(nz_hour&
nz_hour++;
if(nz_hour==24)nz_hour=0;
nz_hour=((nz_hour/10)<
4)+(nz_hour%10);
nz_min=(nz_min>
4)*10+(nz_min&
nz_min++;
if(nz_min==60)nz_min=0;
nz_min=((nz_min/10)<
4)+(nz_min%10);
nz_sec=(nz_sec>
4)*10+(nz_sec&
nz_sec++;
if(nz_sec==60)nz_sec=0;
nz_sec=((nz_sec/10)<
4)+(nz_sec%10);
voidnz_display()
unsignedinta=2;
P0=data_7seg[nz_hour/16];
P0=data_7seg[nz_hour%16];
P0=data_7seg[nz_min/16];
P0=data_7seg[nz_min%16];
P0=data_7seg[nz_sec/16];
P0=data_7seg[nz_sec%16];
/////////////////////////////////////////////////////////////////////////////////////////////////////
voidmain()
unsignedcharp,m;
//m为频率常数变量
unsignedchari=0;