数字电子时钟设计报告1250.docx
《数字电子时钟设计报告1250.docx》由会员分享,可在线阅读,更多相关《数字电子时钟设计报告1250.docx(48页珍藏版)》请在冰豆网上搜索。
![数字电子时钟设计报告1250.docx](https://file1.bdocx.com/fileroot1/2023-2/23/1cac954b-bb2e-4628-ae08-09d9fb5c6061/1cac954b-bb2e-4628-ae08-09d9fb5c60611.gif)
数字电子时钟设计报告1250
数字电子时钟语音播报系统设计报告
学院:
电子工程学院
班级:
2010电子信息工程1班
姓名:
覃阳青
学号:
201012701250
指导老师:
蒋品群
时间:
2013-4-20
数字电子时钟语音播报系统
[摘要]
本文介绍了基于ISD4004的语音播报系统。
系统由STC89系列单片机为核心,控制整个系统的协调工作。
为了使用方便,本系统采用了两种的显示方式,LCD1602和上位机,LCD1602主要用于遥控调节时间时的显示,上位机的显示界面相当简洁,达到一目了然的效果。
语音播报核心芯片是ISD4004芯片,该芯片能够实现多电平保存,并且掉电不丢失等优点。
为了方便远距离调节时间,本系统使用按键作为时间调节的工具。
同时为了让系统时间运行精度更高,该系统采用了PCF8563作为时钟芯片,该芯片运行比较稳定,而且功耗低。
单片机先将时钟芯片进行初始化,然后将读回来的数据显示在液晶屏上,并通过ISD4004进行播报。
同时为了实时监测周围环境的温度,本系统采用DS18B20芯片作为温度采集器。
[关键词]单片机数字时钟DS18B20PCF856374HC595ISD4004语音播报
上位机无线遥控
一、系统整体设计方案
1.1系统整体功能
本系统采用时钟芯片PCF8563和语音芯片ISD4004实现数字语音数字时钟,采用74HC595驱动数码管实时显示。
1.2系统实现框图
二、各功能模块
时间、温度语音播报系统是用时间芯片PCF8563、温度芯片DS18B20、语音设置,停止,录音,播放芯片ISD4004、上下位机等器件和C语言软件一起形成的可以显示时间、温度语音播报的系统。
可以通过程序控制显示时间、温度语音的运用。
可以通过录入语音,得出语音播报。
可以用在很多的领域,是一个不可现代化不可或缺的工作。
有了时间、温度语音播报系统,很多的领域就可以变得很方便。
例如在银行、商场、学校等公众场所中,它方便了大家。
2.1主控电路
2.2电源模块
2.3键盘模块
2.4显示模块
2.5温度模块
2.6时钟模块
2.7串行口模块
三、软件设计
3.1主函数部分
/****************************************
*includefiles
****************************************/
#include
#include"Pre_define.h"
#include"display595.h"
#include"delay.h"
#include"PCF8563.h"
#include"DS18B20.h"
#include"ISD4004.h"
#include"uart.h"
sbitmenu=P1^0;
sbitkey_play=P1^1;
sbitkey_add=P1^2;
sbitkey_sub=P1^3;
unsignedcharyear=0x13,mon=0x03,day=0x27,hou=0x09,min=0x25,sec=0x16,week=0x03;
unsignedcharyear1,year0,mon1,mon0,week1,week0,day1,day0,hour1,hour0,min1,min0,sec1,sec0;
unsignedcharTempH,TempL,TD,j0,j1,TT1,TT0;//字符型变量,仅有八位
inttemp;//读温度数据暂时存放的变量,整型变量,有两个字节,共十六位
unsignedcharmenuflag;
voidInit_Timer0(void);//声明初始化定时器0函数
voidsettime(unsignedcharmf);
voidvoice_H(unsignedintm1);
voidvoice_L(unsignedintm0);
voiddisplay_week(unsignedintweek);
voidplayvoice();
/**************************************/
voidmain()
{
Init_Timer0();
initial();//串口初始化
Init_pcf8563();//初始化8563
write_time_8563();//向8563写时间
while
(1)
{
if(menuflag>0)
{
read_time_8563();
settime(menuflag);
}
if(0==menuflag)
{
temp=read_temperature();//读温度
TempH=temp/16;//高十二位,除掉小数部分,剩下整数部分
TT0=TempH%10;TT1=TempH/10;
TD=temp%16;//小数部分
TD=TD*625/100;//0.0625*100;小数转化为整数显示
j1=TD/10;j0=TD%10;
display595_d3(TT1,TT0,j1,j0);//数码管显示发送的数据
delay1s();delay1s();
read_time_8563();
display595(hou/10,hou%10,min/10,min%10);//数码管显示时间
uart_send();//通过串口向上位机发送数据(年月日,时分秒)
delay1s();delay1s();
if(0==key_play)
{playvoice();}
}
}
}
3.2按键模块
voidvoice_H(unsignedintm1)
{
switch(m1)
{
case0:
{Delay_20_us(5);break;}
case1:
{StartPlay_ISD4004(0xaa);//10
Delay_20_us(25000);break;}
case2:
{StartPlay_ISD4004(0x87);//2
Delay_20_us(18000);
StartPlay_ISD4004(0xaa);//10
Delay_20_us(18000);break;}
case3:
{StartPlay_ISD4004(0x8b);//3
Delay_20_us(18000);
StartPlay_ISD4004(0xaa);//10
Delay_20_us(25000);break;}
case4:
{StartPlay_ISD4004(0x90);//4
Delay_20_us(24000);
StartPlay_ISD4004(0xaa);//10
Delay_20_us(20000);break;}
case5:
{StartPlay_ISD4004(0x95);//5
Delay_20_us(22000);
StartPlay_ISD4004(0xaa);//10
Delay_20_us(20000);break;}
case6:
{StartPlay_ISD4004(0x99);//6
Delay_20_us(22000);
StartPlay_ISD4004(0xaa);//10
Delay_20_us(20000);break;}
case7:
{StartPlay_ISD4004(0x9c);//7
Delay_20_us(24000);
StartPlay_ISD4004(0xaa);//10
Delay_20_us(20000);break;}
case8:
{StartPlay_ISD4004(0xa1);//8
Delay_20_us(24000);
StartPlay_ISD4004(0xaa);//10
Delay_20_us(20000);break;}
case9:
{StartPlay_ISD4004(0xa5);//9
Delay_20_us(24000);
StartPlay_ISD4004(0xaa);//10
Delay_20_us(20000);break;}
case10:
{StartPlay_ISD4004(0xaa);//10
Delay_20_us(2000);break;}
default:
break;
}
}
voidvoice_L(unsignedintm0)
{
switch(m0)
{
case0:
{StartPlay_ISD4004(0x7d);//0
Delay_20_us(30000);break;}
case1:
{StartPlay_ISD4004(0x83);//1
Delay_20_us(25000);break;}
case2:
{StartPlay_ISD4004(0x87);//2
Delay_20_us(25000);break;}
case3:
{StartPlay_ISD4004(0x8b);//3
Delay_20_us(25000);break;}
case4:
{StartPlay_ISD4004(0x90);//4
Delay_20_us(25000);break;}
case5:
{StartPlay_ISD4004(0x95);//5
Delay_20_us(24000);break;}
case6:
{StartPlay_ISD4004(0x99);//6
Delay_20_us(25000);break;}
case7:
{StartPlay_ISD4004(0x9c);//7
Delay_20_us(30000);break;}
case8:
{StartPlay_ISD4004(0xa1);//8
Delay_20_us(25000);break;}
case9:
{StartPlay_ISD4004(0xa5);//9
Delay_20_us(32000);break;}
default:
{StartPlay_ISD4004(0xaa);//10
Delay_20_us(30000);break;}
}
}
voiddisplay_week(unsignedintweek)
{
switch(week)
{
case0:
{Delay_20_us(10);break;}
case1:
{StartPlay_ISD4004(0x2d);//星期一
Delay_20_us(38000);break;}
case2:
{StartPlay_ISD4004(0x32);//星期二
Delay_20_us(50000);break;}
case3:
{StartPlay_ISD4004(0x3a);//星期三
Delay_20_us(50000);break;}
case4:
{StartPlay_ISD4004(0x40);//星期四
Delay_20_us(50000);break;}
case5:
{StartPlay_ISD4004(0x47);//星期五
Delay_20_us(40000);break;}
case6:
{StartPlay_ISD4004(0x4d);//星期六
Delay_20_us(45000);break;}
case7:
{StartPlay_ISD4004(0x53);//星期天
Delay_20_us(40000);break;}
default:
break;
}
}
/*********************************
函数名称:
Init_Timer0
函数功能:
初始化定时器0
************************************/
voidInit_Timer0(void)
{
TMOD=0x01;//定时器0,16位定时器
TH0=0xDC;//装定时器0初值
TL0=0x00;//定时100us
EA=1;//开全局中断
ET0=1;//开定时器0中断
TR0=1;
}
voidplayvoice()
{
temp=read_temperature();//读温度
StartPlay_ISD4004(0x5a);//欢迎使用语音播报系统
Delay_20_us(45400);
Delay_20_us(45800);
Stop_ISD4004();
Delay_20_us(20000);
key_play=1;
read_time_8563();//某月某日
year1=year/10;year0=year%10;
StartPlay_ISD4004(0x78);//今天是
Delay_20_us(38000);
display595(2,0,year1,year0);//显示年
voice_L
(2);//2andread2
StartPlay_ISD4004(0x80);//0
Delay_20_us(20000);
voice_L(year1);voice_L(year0);
StartPlay_ISD4004(0x0f);//年
Delay_20_us(28000);
mon1=mon/10;mon0=mon%10;
display595(18,mon1,mon0,18);//显示月
if((mon1>0)&(mon0==0))
{voice_H(mon1);}
else
{voice_H(mon1);voice_L(mon0);}
StartPlay_ISD4004(0x14);//月
Delay_20_us(25000);
day1=day/10;day0=day%10;
display595(18,day1,day0,18);//显示日
if((day1>0)&(day0==0))
{voice_H(day1);}
else
{voice_H(day1);voice_L(day0);}
StartPlay_ISD4004(0x19);//日
Delay_20_us(30000);
Stop_ISD4004();
Delay_20_us(10000);
week0=week%10;
display595(18,18,week0,18);
display_week(week0);//星期
Stop_ISD4004();
Delay_20_us(20000);
StartPlay_ISD4004(0x67);//当前温度为
Delay_20_us(54000);//Stop_ISD4004();
temp=read_temperature();//读温度
TempH=temp/16;//高十二位,除掉小数部分,剩下整数部分
TT0=TempH%10;TT1=TempH/10;
TD=temp%16;//小数部分
TD=TD*625/100;//0.0625*100;小数转化为整数显示
j1=TD/10;0=TD%10;
display595_d3(TT1,TT0,j1,j0);//数码管显示发送的数据
if((TT1>0)&(TT0==0))
{voice_H(TT1);}
else
{voice_H(TT1);voice_L(TT0);}
StartPlay_ISD4004(0x05);//点
Delay_20_us(35000);
if((j1>0)&(j0==0))
{voice_H(j1);}
else
{voice_H(j1);voice_L(j0);}
StartPlay_ISD4004(0x0a);//摄氏度
Delay_20_us(42000);
Stop_ISD4004();
Delay_20_us(20000);
read_time_8563();//读时间
hour1=hou/10;
hour0=hou%10;
StartPlay_ISD4004(0x70);//当前时间为
Delay_20_us(58000);
display595(18,hour1,hour0,18);//显示时
if((hour1>0)&(hour0==0))
{voice_H(hour1);}
else
{voice_H(hour1);voice_L(hour0);}
StartPlay_ISD4004(0x05);//点
Delay_20_us(35000);
read_time_8563();//读时间
min1=min/10;min0=min%10;
display595(18,min1,min0,18);//显示分
if((min1>0)&(min0==0))
{voice_H(min1);}
else
{voice_H(min1);voice_L(min0);}
StartPlay_ISD4004(0x22);//分
Delay_20_us(30000);
read_time_8563();//读时间
sec1=sec/10;sec0=sec%10;
display595(18,sec1,sec0,18);//显示秒
if((sec1>0)&(sec0==0))
{voice_H(sec1);}
else
{voice_H(sec1);voice_L(sec0);}
StartPlay_ISD4004(0x27);//秒
Delay_20_us(30000);
Stop_ISD4004();
}
//定时中断服务函数
/*********************************
函数名称:
Timer0_Interrupt
************************************/
voidTimer0_Interrupt(void)interrupt1
{
TH0=0xDC;//装定时器0初值
TL0=0x00;//定时100Us
if(menu==0)
{
Delay_20_us(3000);
if(menu==1)
{
menuflag=(menuflag==5)?
0:
(menuflag+1);
}
}
if(key_add==0)//按下加
{
read_time_8563();
Delay_20_us(4000);
if(key_add==0)
{
switch(menuflag)
{
case1:
year+=1;
display595(2,0,year/10,year%10);
year=((year/10)<<4)+((year%10)&0x0F);
if(((year%4)==0)&((year%100)>0))
{week=(week==7)?
1:
(week+2);}
elseweek=(week==7)?
1:
(week+1);break;
case2:
mon=(mon<12)?
(mon+1):
1;//mon+1
display595(mon/10,mon%10,18,18);
mon=((mon/10)<<4)+((mon%10)&0x0F);
if(((year%4)==0)&((year%100)>0))//闰年
{
switch(mon)
{
case1:
week=(week==7)?
1:
(week+3);break;
case3:
week=(week==7)?
1:
(week+3);break;
case5:
week=(week==7)?
1:
(week+3);break;
case7:
week=(week==7)?
1:
(week+3);break;
case8:
week=(week==7)?
1:
(week+3);break;
case10:
week=(week==7)?
1:
(week+3);break;
case12:
week=(week==7)?
1:
(week+2);break;
case4:
week=(week==7)?
1:
(week+2);break;
case6:
week=(week==7)?
1:
(week+2);break;
case9:
week=(week==7)?
1:
(week+2);break;
case11:
week=(week==7