基于51单片机控制的语音报时万年历课程设计.docx

上传人:b****5 文档编号:8198135 上传时间:2023-01-29 格式:DOCX 页数:46 大小:149.33KB
下载 相关 举报
基于51单片机控制的语音报时万年历课程设计.docx_第1页
第1页 / 共46页
基于51单片机控制的语音报时万年历课程设计.docx_第2页
第2页 / 共46页
基于51单片机控制的语音报时万年历课程设计.docx_第3页
第3页 / 共46页
基于51单片机控制的语音报时万年历课程设计.docx_第4页
第4页 / 共46页
基于51单片机控制的语音报时万年历课程设计.docx_第5页
第5页 / 共46页
点击查看更多>>
下载资源
资源描述

基于51单片机控制的语音报时万年历课程设计.docx

《基于51单片机控制的语音报时万年历课程设计.docx》由会员分享,可在线阅读,更多相关《基于51单片机控制的语音报时万年历课程设计.docx(46页珍藏版)》请在冰豆网上搜索。

基于51单片机控制的语音报时万年历课程设计.docx

基于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。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 设计艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1