- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PAGE \* MERGEFORMAT 23
基于51单片机控制的语音报时万年历SDU(WH)
实验要求
运用单片机及相关外设实现以下功能:
万年历及时钟显示
时间日期可调
可对时间进行整点报时和随机报时
方案分析
根据实验要求,选用STC公司的8051系列,STC12C5A16S2增强型51单片机。此单片机功能强大,具有片内EEPROM、1T分频系数、片内ADC转换器等较为实用功能,故选用此款。
实验中,对日期和时间进行显示,显示的字符数较多,故选用12864LCD屏幕。该屏幕操作较为便捷,外围电路相对简单,实用性较强。
为了实现要求中的时间日期可调,故按键是不可缺少的,所以使用了较多的按键。一方面,单片机的IO口较为充足;另一方面,按键较多,选择的余地较大,方便编程控制。
实验中,并未要求对时间和日期进行保存和掉电续运行,所以并未添加EEPROM和DS12C887-RTC芯片。实际上,对万年历来说,这是较为重要的,但为了方便实现和编程的简单,此处并未添加,而是使用单片机的定时器控制时间,精度有差别。且上电默认时间为2014-01-01 09:00:00 之后需要手动调整为正确时间。
要求中的语音报时功能,这里选用ISD1760芯片的模块来帮助实现。此模块通过软件模拟SPI协议控制。先将所需要的声音片段录入芯片的EEPROM区域,之后读出各段声音的地址段,然后在程序中定义出相应地址予以控制播放哪一声音片段。
电路硬件设计
实际效果图
程序代码部分
Main.. unsigned int count;
extern unsigned int key_time[8];
extern unsigned char key_new;
extern unsigned char key_old;
extern unsigned char stop_flag;
extern unsigned char key_follow[8];
extern unsigned int key_num[8];
sbit BEEP=P3^7;
sbit ISD_SS=P0^7;
sbit ISD_MISO=P0^4;
sbit ISD_MOSI=P0^5;
sbit ISD_SCLK=P0^6;
extern unsigned char date_show[];
extern unsigned char time_show[];
extern unsigned char sec;
extern unsigned char min;
extern unsigned char unsigned char day;
extern unsigned char month;
extern unsigned char year_f;
extern unsigned char year_l;
extern unsigned char leap_year_flag;
extern unsigned char update_flag;
extern unsigned char adjust_flag;
extern unsigned char key;
unsigned char report();
#endif
Main.c
#include main.=0;
unsigned char ()
{
unsigned char i;
P2=0XFF;
BEEP=0;
init();
initinal(); 调用LCD字库初始化程序
TMOD=0x01; 使用定时器T0
TH0=(65536-1000)256; 定时器高八位赋初值
TL0=(65536-1000)%256; 定时器低八位赋初值 *
EA=1; 开中断总允许
ET0=1; 允许T0中断
TR0=1; 启动定时器T0
while(1)
{
if(update_flag)
{
lcd_pos(1,0);
for(i=0;i10;i++)
write_dat(date_show[i]);
lcd_pos(2,4);
for(i=0;i8;i++)
write_dat(time_show[i]);
update_flag=0;
}
if(key!=keyscan_nor())
{
key=keyscan_nor();
if(key==8!adjust_flag)
adjust_flag=1;
if(keyadjust_flag)
文档评论(0)