推荐-基于51单片机控制的语音报时万年历课程设计1 精品

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于51单片机控制的语音报时万年历

-----20/11/20XX SDU(WH)

一.实验要求

运用单片机及相关外设实现以下功能:

1)万年历及时钟显示

2)时间日期可调

3)可对时间进行整点报时和随机报时

二.方案分析

根据实验要求,选用STC公司的8051系列,STC12C5A16S2增强型51单片机。此单片机功能强大,具有片内EEPROM、1T分频系数、片内ADC转换器等较为实用功能,故选用此款。

实验中,对日期和时间进行显示,显示的字符数较多,故选用12864LCD屏幕。该屏幕操作较为便捷,外围电路相对简单,实用性较强。

为了实现要求中的时间日期可调,故按键是不可缺少的,所以使用了较多的按键。一方面,单片机的I/O口较为充足;另一方面,按键较多,选择的余地较大,方便编程控制。

实验中,并未要求对时间和日期进行保存和掉电续运行,所以并未添加EEPROM和DS12C887-RTC芯片。实际上,对万年历来说,这是较为重要的,但为了方便实现和编程的简单,此处并未添加,而是使用单片机的定时器控制时间,精度有差别。且上电默认时间为20XX-01-01 09:00:00 之后需要手动调整为正确时间。

要求中的语音报时功能,这里选用ISD1760芯片的模块来帮助实现。此模块通过软件模拟SPI协议控制。先将所需要的声音片段录入芯片的EEPROM区域,之后读出各段声音的地址段,然后在程序中定义出相应地址予以控制播放哪一声音片段。

三.电路硬件设计

实际效果图

四.程序代码部分

Main.h

#ifndef _MAIN_H

#define _MAIN_H

#include "reg52.h"

#include "INTRINS.H"

#include "math.h"

#include "string.h"

#include "key.h"

#include "led.h"

#include "12864.h"

#include "main.h"

#include "isd1700.h"

#include "sound.h"

extern 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 hour;

extern 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.h"

unsigned int count=0;

unsigned int key_num[8]=0;

unsigned char key_new=0;

unsigned char key_old=0;

unsigned char stop_flag=0;

unsigned char key_follow[8]=0;

unsigned char sec=1;

unsigned char min=0;

unsigned char hour=9;

unsigned char day=1;

unsigned char month=1;

unsigned char year_f=20;

unsigned char year_l=14;

unsigned char leap_year_flag=0;

unsigned char date_show[]="20XX-01-01"; unsigned char time_show[]="09:00:00";

unsigned char update_flag=1;

unsigned char key=0;

unsigned char adjust_flag=0;

unsigned char adjust_pos=0;

unsigned char report_flag=0;

void main()

{

unsigned char i;

P2=0XFF;

BEEP=0;

init();

initinal(); //调用LCD字库初始化程序

TMOD=0x01; //使用定时器T0

相关文档
最新文档