基于51单片机控制的语音报时万年历课程设计.docx
《基于51单片机控制的语音报时万年历课程设计.docx》由会员分享,可在线阅读,更多相关《基于51单片机控制的语音报时万年历课程设计.docx(46页珍藏版)》请在冰豆网上搜索。
![基于51单片机控制的语音报时万年历课程设计.docx](https://file1.bdocx.com/fileroot1/2023-1/29/e35904a7-3b7b-4e4b-911a-4b3d91164e13/e35904a7-3b7b-4e4b-911a-4b3d91164e131.gif)
基于51单片机控制的语音报时万年历课程设计
基于51单片机控制地语音报时万年历
-----20/11/2013SDU(WH)
1.实验要求
运用单片机及相关外设实现以下功能:
1)万年历及时钟显示
2)时间日期可调
3)可对时间进行整点报时和随机报时
2.方案分析
根据实验要求,选用STC公司地8051系列,STC12C5A16S2增强型51单片机.此单片机功能强大,具有片内EEPROM、1T分频系数、片内ADC转换器等较为实用功能,故选用此款.
实验中,对日期和时间进行显示,显示地字符数较多,故选用12864LCD屏幕.该屏幕操作较为便捷,外围电路相对简单,实用性较强.
为了实现要求中地时间日期可调,故按键是不可缺少地,所以使用了较多地按键.一方面,单片机地I/O口较为充足;另一方面,按键较多,选择地余地较大,方便编程控制.
实验中,并未要求对时间和日期进行保存和掉电续运行,所以并未添加EEPROM和DS12C887-RTC芯片.实际上,对万年历来说,这是较为重要地,但为了方便实现和编程地简单,此处并未添加,而是使用单片机地定时器控制时间,精度有差别.且上电默认时间为2014-01-0109:
00:
00之后需要手动调整为正确时间.
要求中地语音报时功能,这里选用ISD1760芯片地模块来帮助实现.此模块通过软件模拟SPI协议控制.先将所需要地声音片段录入芯片地EEPROM区域,之后读出各段声音地地址段,然后在程序中定义出相应地址予以控制播放哪一声音片段.
3.电路硬件设计
实际效果图
4.程序代码部分
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"
externunsignedintcount。
externunsignedintkey_time[8]。
externunsignedcharkey_new。
externunsignedcharkey_old。
externunsignedcharstop_flag。
externunsignedcharkey_follow[8]。
externunsignedintkey_num[8]。
sbitBEEP=P3^7。
sbitISD_SS=P0^7。
sbitISD_MISO=P0^4。
sbitISD_MOSI=P0^5。
sbitISD_SCLK=P0^6。
externunsignedchardate_show[]。
externunsignedchartime_show[]。
externunsignedcharsec。
externunsignedcharmin。
externunsignedcharhour。
externunsignedcharday。
externunsignedcharmonth。
externunsignedcharyear_f。
externunsignedcharyear_l。
externunsignedcharleap_year_flag。
externunsignedcharupdate_flag。
externunsignedcharadjust_flag。
externunsignedcharkey。
unsignedcharreport()。
#endif
Main.c
#include"main.h"
unsignedintcount=0。
unsignedintkey_num[8]=0。
unsignedcharkey_new=0。
unsignedcharkey_old=0。
unsignedcharstop_flag=0。
unsignedcharkey_follow[8]=0。
unsignedcharsec=1。
unsignedcharmin=0。
unsignedcharhour=9。
unsignedcharday=1。
unsignedcharmonth=1。
unsignedcharyear_f=20。
unsignedcharyear_l=14。
unsignedcharleap_year_flag=0。
unsignedchardate_show[]="2014-01-01"。
unsignedchartime_show[]="09:
00:
00"。
unsignedcharupdate_flag=1。
unsignedcharkey=0。
unsignedcharadjust_flag=0。
unsignedcharadjust_pos=0。
unsignedcharreport_flag=0。
voidmain()
{
unsignedchari。
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。
i<10。
i++)
write_dat(date_show[i])。
lcd_pos(2,4)。
for(i=0。
i<8。
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(key&&adjust_flag)
{
if(key==1)
{
adjust_pos++。
if(adjust_pos==14)
adjust_pos=0。
}
elseif(key==2)
{
if(!
adjust_pos)
adjust_pos=13。
else
adjust_pos--。
}
elseif(key==6)
{
if(!
adjust_pos)
sec++。
elseif(adjust_pos==1)
sec=sec+10。
elseif(adjust_pos==2)
min++。
elseif(adjust_pos==3)
min=min+10。
elseif(adjust_pos==4)
hour++。
elseif(adjust_pos==5)
hour=hour+10。
elseif(adjust_pos==6)
day++。
elseif(adjust_pos==7)
day=day+10。
elseif(adjust_pos==8)
month++。
elseif(adjust_pos==9)
month=month+10。
elseif(adjust_pos==10)
year_l++。
elseif(adjust_pos==11)
year_l=year_l+10。
elseif(adjust_pos==12)
year_f++。
elseif(adjust_pos==13)
year_f=year_f+10。
}
elseif(key==7)
{
if(!
adjust_pos)
sec--。
elseif(adjust_pos==1)
sec=sec-10。
elseif(adjust_pos==2)
min--。
elseif(adjust_pos==3)
min=min-10。
elseif(adjust_pos==4)
hour--。
elseif(adjust_pos==5)
hour=hour-10。
elseif(adjust_pos==6)
day--。
elseif(adjust_pos==7)
day=day-10。
elseif(adjust_pos==8)
month--。
elseif(adjust_pos==9)
month=month-10。
elseif(adjust_pos==10)
year_l--。
elseif(adjust_pos==11)
year_l=year_l-10。
elseif(adjust_pos==12)
year_f--。
elseif(adjust_pos==13)
year_f=year_f-10。
}
elseif(key==3)
adjust_flag=0。
if(key==6||key==7)
{
if(sec>=80)
sec=0。
if(min>=80)
min=0。
if(hour>=40)
hour=0。
if(month>30)
month=1。
if(day>50)
day=0。
if(year_f>=120)
year_f=0。
if(year_l>=120)
year_l=0。
}
}
}
if(key==3)
report_flag=1。
if(report_flag)
{
clrram()。
Dingwei(2,1)。
lcd_mesg("REPORTING!
!
!
")。
report()。
clrram()。
}
}
}
voidtime0()interrupt1
{
staticunsignedchartimer=0。
TH0=(65536-50000)/256。
//定时器高八位赋初值
TL0=(65536-50000)%256。
//定时器低八位赋初值
timer++。
if(timer==20)
{
sec++。
time_show[6]=sec/10+48。
time_show[7]=sec%10+48。
if(sec>=60)
{
sec=0。
min++。
time_show[6]=sec/10+48。
time_show[7]=sec%10+48。
time_show[3]=min/10+48。
time_show[4]=min%10+48。
}
if(min>=60)
{
min=0。
hour++。
time_show[3]=min/10+48。
time_show[4]=min%10+48。
time_show[0]=hour/10+48。
time_show[1]=hour%10+48。
}
if(hour>=24)
{
hour=0。
day++。
time_show[0]=hour/10+48。
time_show[1]=hour%10+48。
date_show[8]=day/10+48。
date_show[9]=day%10+48。
}
if((day>=29&&!
leap_year_flag&&month==2)||(day==30&&leap_year_flag&&month==2)||
(day==31&&(month==4||month==6||month==9||month==11))||(month==32))
{
day=1。
month++。
date_show[8]=day/10+48。
date_show[9]=day%10+48。
date_show[5]=month/10+48。
date_show[6]=month%10+48。
}
if(month>=13)
{
month=1。
year_l++。
date_show[5]=month/10+48。
date_show[6]=month%10+48。
date_show[0]=year_f/10+48。
date_show[1]=year_f%10+48。
date_show[2]=year_l/10+48。
date_show[3]=year_l%10+48。
}
if(year_l>=100)
{
year_l=0。
year_f++。
if(((!
((year_f*100+year_l)%4))&&((year_f*100+year_l)%100))||(!
((year_f*100+year_l)%400)))
leap_year_flag=1。
else
leap_year_flag=0。
date_show[0]=year_f/10+48。
date_show[1]=year_f%10+48。
date_show[2]=year_l/10+48。
date_show[3]=year_l%10+48。
}
timer=0。
update_flag=1。
if(adjust_flag)
{
time_show[7]=sec%10+48。
time_show[6]=sec/10+48。
time_show[4]=min%10+48。
time_show[3]=min/10+48。
time_show[1]=hour%10+48。
time_show[0]=hour/10+48。
date_show[9]=day%10+48。
date_show[8]=day/10+48。
date_show[6]=month%10+48。
date_show[5]=month/10+48。
date_show[3]=year_l%10+48。
date_show[2]=year_l/10+48。
date_show[1]=year_f%10+48。
date_show[0]=year_f/10+48。
}
}
if(adjust_flag&&timer==10)
{
if(!
adjust_pos)
time_show[7]=''。
elseif(adjust_pos==1)
time_show[6]=''。
elseif(adjust_pos==2)
time_show[4]=''。
elseif(adjust_pos==3)
time_show[3]=''。
elseif(adjust_pos==4)
time_show[1]=''。
elseif(adjust_pos==5)
time_show[0]=''。
elseif(adjust_pos==6)
date_show[9]=''。
elseif(adjust_pos==7)
date_show[8]=''。
elseif(adjust_pos==8)
date_show[6]=''。
elseif(adjust_pos==9)
date_show[5]=''。
elseif(adjust_pos==10)
date_show[3]=''。
elseif(adjust_pos==11)
date_show[2]=''。
elseif(adjust_pos==12)
date_show[1]=''。
elseif(adjust_pos==13)
date_show[0]=''。
update_flag=1。
}
if(!
min&&!
sec&&!
adjust_flag)
report_flag=1。
}
unsignedcharreport()
{
PlaySoundTick(11)。
long_delay()。
if(!
min)
{
if(hour<=10)
{
PlaySoundTick(hour)。
short_delay()。
PlaySoundTick(12)。
short_delay()。
PlaySoundTick(14)。
short_delay()。
}
elseif(hour>10&&hour<20)
{
PlaySoundTick(10)。
short_delay()。
PlaySoundTick(hour-10)。
short_delay()。
PlaySoundTick(12)。
short_delay()。
PlaySoundTick(14)。
short_delay()。
}
elseif(hour==20)
{
PlaySoundTick
(2)。
short_delay()。
PlaySoundTick(10)。
short_delay()。
PlaySoundTick(12)。
short_delay()。
PlaySoundTick(14)。
short_delay()。
}
else
{
PlaySoundTick
(2)。
short_delay()。
PlaySoundTick(10)。
short_delay()。
PlaySoundTick(hour-20)。
short_delay()。
PlaySoundTick(12)。
short_delay()。
PlaySoundTick(14)。
short_delay()。
}
}
else
{
if(hour<=10)
{
PlaySoundTick(hour)。
short_delay()。
PlaySoundTick(12)。
short_delay()。
}
elseif(hour>10&&hour<20)
{
PlaySoundTick(10)。
short_delay()。
PlaySoundTick(hour-10)。
short_delay()。
PlaySoundTick(12)。
short_delay()。
}
elseif(hour==20)
{
PlaySoundTick
(2)。
short_delay()。
PlaySoundTick(10)。
short_delay()。
PlaySoundTick(12)。
short_delay()。
}
else
{
PlaySoundTick
(2)。
short_delay()。
PlaySoundTick(10)。
short_delay()。
PlaySoundTick(hour-20)。
short_delay()。
PlaySoundTick(12)。
short_delay()。
}
if(min<=10)
{
PlaySoundTick(min)。
short_delay()。
PlaySoundTick(13)。
short_delay()。
}
elseif(min>10&&min%10)
{
PlaySoundTick(min/10)。
short_delay()。
PlaySoundTick(10)。
short_delay()。
PlaySoundTick(min-10*(min/10))。
short_delay()。
PlaySoundTick(13)。
short_delay()。
}
else
{
PlaySoundTick(min/10)。
short_delay()。
PlaySoundTick(10)。
short_delay()。
PlaySoundTick(13)。
short_delay()。
}
}
report_flag=0。
time_show[7]=sec%10+48。
time_show[6]=sec/10+48。
time_show[4]=min%10+48。
time_show[3]=min/10+48。
time_show[1]=hour%10+48。
time_show[0]=hour/10+48。
date_show[9]=day%10+48。
date_show[8]=day/10+48。
date_show[6]=month%10+48。
date_show[5]=month/10+48。