




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于51单片机控制的语音报时万年历1 实验要求运用单片机及相关外设实现以下功能:1) 万年历及时钟显示2) 时间日期可调3) 可对时间进行整点报时和随机报时2 方案分析根据实验要求,选用stc公司的8051系列,stc12c5a16s2增强型51单片机。此单片机功能强大,具有片内eeprom、1t分频系数、片内adc转换器等较为实用功能,故选用此款。实验中,对日期和时间进行显示,显示的字符数较多,故选用12864lcd屏幕。该屏幕操作较为便捷,外围电路相对简单,实用性较强。为了实现要求中的时间日期可调,故按键是不可缺少的,所以使用了较多的按键。一方面,单片机的i/o口较为充足;另一方面,按键较
2、多,选择的余地较大,方便编程控制。实验中,并未要求对时间和日期进行保存和掉电续运行,所以并未添加eeprom和ds12c887-rtc芯片。实际上,对万年历来说,这是较为重要的,但为了方便实现和编程的简单,此处并未添加,而是使用单片机的定时器控制时间,精度有差别。且上电默认时间为2014-01-01 09:00:00 之后需要手动调整为正确时间。要求中的语音报时功能,这里选用isd1760芯片的模块来帮助实现。此模块通过软件模拟spi协议控制。先将所需要的声音片段录入芯片的eeprom区域,之后读出各段声音的地址段,然后在程序中定义出相应地址予以控制播放哪一声音片段。3 电路硬件设计实际效果图
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.hextern unsigned int count;extern unsigned int key_time8;extern unsigned char key_new;extern unsig
4、ned char key_old;extern unsigned char stop_flag;extern unsigned char key_follow8;extern unsigned int key_num8;sbit beep=p37;sbit isd_ss=p07;sbit isd_miso=p04;sbit isd_mosi=p05;sbit isd_sclk=p06;extern unsigned char date_show;extern unsigned char time_show;extern unsigned char sec;extern unsigned cha
5、r 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();#endifmain
6、.c#include main.hunsigned int count=0;unsigned int key_num8=0;unsigned char key_new=0;unsigned char key_old=0;unsigned char stop_flag=0;unsigned char key_follow8=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
7、char year_l=14;unsigned char leap_year_flag=0;unsigned char date_show=2014-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();initin
8、al(); /调用lcd字库初始化程序tmod=0x01; /使用定时器t0th0=(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_showi);lcd_pos(2,4);for(i=0;i=80)sec=0;if(min=80)min=0;if(hour=40)hour=0;if(month30)m
9、onth=1;if(day50)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();void time0() interrupt 1static unsigned char timer=0;th0=(65536-50000)/256; /定时器高八位赋初值tl0=(65536-50000)%256; /定时器低八位赋初值timer+;if(time
10、r=20)sec+;time_show6=sec/10+48;time_show7=sec%10+48;if(sec=60)sec=0;min+;time_show6=sec/10+48;time_show7=sec%10+48;time_show3=min/10+48;time_show4=min%10+48; if(min=60)min=0;hour+;time_show3=min/10+48;time_show4=min%10+48;time_show0=hour/10+48;time_show1=hour%10+48;if(hour=24)hour=0;day+;time_show0=
11、hour/10+48;time_show1=hour%10+48;date_show8=day/10+48;date_show9=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_show8=day/10+48;date_show9=day%10+48;date_show5=month/10+48;date_show6=month%10+48;if(m
12、onth=13)month=1;year_l+;date_show5=month/10+48;date_show6=month%10+48;date_show0=year_f/10+48;date_show1=year_f%10+48;date_show2=year_l/10+48;date_show3=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 lea
13、p_year_flag=0;date_show0=year_f/10+48;date_show1=year_f%10+48;date_show2=year_l/10+48;date_show3=year_l%10+48;timer=0;update_flag=1;if(adjust_flag)time_show7=sec%10+48;time_show6=sec/10+48;time_show4=min%10+48;time_show3=min/10+48;time_show1=hour%10+48;time_show0=hour/10+48;date_show9=day%10+48;date
14、_show8=day/10+48;date_show6=month%10+48;date_show5=month/10+48;date_show3=year_l%10+48;date_show2=year_l/10+48;date_show1=year_f%10+48;date_show0=year_f/10+48;if(adjust_flag&timer=10)if(!adjust_pos)time_show7= ;else if(adjust_pos=1)time_show6= ;else if(adjust_pos=2)time_show4= ;else if(adjust_pos=3)
15、time_show3= ;else if(adjust_pos=4)time_show1= ;else if(adjust_pos=5)time_show0= ;else if(adjust_pos=6)date_show9= ;else if(adjust_pos=7)date_show8= ;else if(adjust_pos=8)date_show6= ;else if(adjust_pos=9)date_show5= ;else if(adjust_pos=10)date_show3= ;else if(adjust_pos=11)date_show2= ;else if(adjus
16、t_pos=12)date_show1= ;else if(adjust_pos=13)date_show0= ;update_flag=1;if(!min&!sec&!adjust_flag)report_flag=1; unsigned char report()playsoundtick(11);long_delay();if(!min)if(hour10&hour20)playsoundtick(10);short_delay();playsoundtick(hour-10);short_delay();playsoundtick(12);short_delay();playsound
17、tick(14);short_delay();else if(hour=20)playsoundtick(2);short_delay();playsoundtick(10);short_delay();playsoundtick(12);short_delay();playsoundtick(14);short_delay();elseplaysoundtick(2);short_delay();playsoundtick(10);short_delay();playsoundtick(hour-20);short_delay();playsoundtick(12);short_delay(
18、);playsoundtick(14);short_delay();else if(hour10&hour20)playsoundtick(10);short_delay();playsoundtick(hour-10);short_delay();playsoundtick(12);short_delay();else if(hour=20)playsoundtick(2);short_delay();playsoundtick(10);short_delay();playsoundtick(12);short_delay();elseplaysoundtick(2);short_delay
19、();playsoundtick(10);short_delay();playsoundtick(hour-20);short_delay();playsoundtick(12);short_delay(); if(min10&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_de
20、lay();playsoundtick(10);short_delay();playsoundtick(13);short_delay();report_flag=0;time_show7=sec%10+48;time_show6=sec/10+48;time_show4=min%10+48;time_show3=min/10+48;time_show1=hour%10+48;time_show0=hour/10+48;date_show9=day%10+48;date_show8=day/10+48;date_show6=month%10+48;date_show5=month/10+48;
21、date_show3=year_l%10+48;date_show2=year_l/10+48;date_show1=year_f%10+48;date_show0=year_f/10+48;return 0;isd1700.h#ifndef _isd1760_h#define _isd1760_h#include main.h#define isd1700_pu 0x01#define isd1700_stop 0x02#define isd1700_rest 0x03#define isd1700_clr_int 0x04#define isd1700_rd_staus 0x05#defi
22、ne isd1700_rd_play_ptr 0x06#define isd1700_pd 0x07#define isd1700_rd_rec_ptr 0x08#define isd1700_devid 0x09#define isd1700_play 0x40#define isd1700_rec 0x41#define isd1700_erase 0x42#define isd1700_g_erase 0x43#define isd1700_rd_apc 0x44#define isd1700_wr_apc1 0x45#define isd1700_wr_apc2 0x65#define
23、 isd1700_wr_nvcfg 0x46#define isd1700_ld_nvcfg 0x47#define isd1700_fwd 0x48#define isd1700_chk_mem 0x49#define isd1700_extclk 0x4a#define isd1700_set_play 0x80#define isd1700_set_rec 0x81#define isd1700_set_erase 0x82#define null 0x00#define isd_led 0x10extern unsigned char data isd_comm_ram_c7;exte
24、rn void init(void);extern void delay_isd(int x);extern void comm_sate(void);extern void rest_isd_comm_ptr(void);extern unsigned char t_r_comm_byte(unsigned char comm_data );extern void isd1700_par2_comm(unsigned char comm_par, unsigned int data_par);extern void isd1700_npar_comm(unsigned char comm_p
25、ar,comm_byte_count); extern void isd1700_7byte_comm(unsigned char comm_par, unsigned int star_addr, unsigned int end_addr);extern void spi_pu (void);extern void spi_stop (void);extern void spi_rest ( void );extern void spi_clr_int(void);extern void spi_rd_staus(void);extern void spi_rd_play_ptr(void
26、);extern void spi_pd(void);extern void spi_rd_rec_ptr(void);extern void spi_devid(void);extern void spi_play(void);extern void spi_rec (void);extern void spi_erase (void);extern void spi_g_erase (void);extern void spi_rd_apc(void);extern void spi_wr_apc1 (void);extern void spi_wr_apc2 (void);extern
27、void spi_wr_nvcfg (void);extern void spi_ld_nvcfg (void);extern void spi_fwd (void);extern void spi_chk_mem(void);extern void spi_currrowaddr(void);extern void seril_back_sate(unsigned char byte_number);extern void spi_set_opt(unsigned char spi_set_comm);void init(void);#endifisd1700.c/#pragma src#i
28、nclude isd1700.h#include sound.h#define uchar unsigned char #define uint unsigned intsbit dac_sync=p20;sbit dac_sclk=p21;sbit dac_din =p22;bit re_fig;uchar data comm_temp;uchar data isd_comm_ram7;uchar data isd_comm_ram_c7;uchar data *isd_comm_ptr;uchar data *back_data_ptr;void init(void);void isd_d
29、elay(int x);void comm_sate(void);void rest_isd_comm_ptr(void);uchar t_r_comm_byte( uchar comm_data );void isd1700_par2_comm(uchar comm_par, uint data_par);void isd1700_npar_comm(uchar comm_par,comm_byte_count); /no parameter commvoid isd1700_7byte_comm(uchar comm_par, uint star_addr, uint end_addr);
30、void spi_pu (void);void spi_stop (void);void spi_rest ( void );void spi_clr_int(void);void spi_rd_staus(void);void spi_rd_play_ptr(void);void spi_pd(void);void spi_rd_rec_ptr(void);void spi_devid(void);void spi_play(void);void spi_rec (void);void spi_erase (void);void spi_g_erase (void);void spi_rd_
31、apc(void);void spi_wr_apc1 (void);void spi_wr_apc2 (void);void spi_wr_nvcfg (void);void spi_ld_nvcfg (void);void spi_fwd (void);void spi_chk_mem(void);void spi_currrowaddr(void);void seril_back_sate(uchar byte_number);void spi_set_opt(uchar spi_set_comm);void comm_sate(void) uchar sate_temp;uint apc
32、_temp; if(ri) sate_temp=sbuf; if(sate_temp=0x09) spi_devid(); if(sate_temp=0x44) spi_rd_apc(); if(sate_temp=0x40) spi_play(); if(sate_temp=0x04) spi_clr_int(); if(sate_temp=0x05) spi_rd_staus(); if(sate_temp=0x43) spi_g_erase(); if(sate_temp=0x01) spi_pu (); if(sate_temp=0x02) spi_stop(); if(sate_te
33、mp=0x03) spi_rest (); if(sate_temp=0x06) spi_rd_play_ptr(); if(sate_temp=0x07) spi_pd(); if(sate_temp=0x08) spi_rd_rec_ptr(); if(sate_temp=0x41) spi_rec(); if(sate_temp=0x42) spi_erase(); if(sate_temp=0x45) spi_wr_apc1 (); if(sate_temp=0x65) spi_wr_apc2 (); if(sate_temp=0x46) spi_wr_nvcfg (); if(sat
34、e_temp=0x47) spi_ld_nvcfg (); if(sate_temp=0x48) spi_fwd (); if(sate_temp=0x49) spi_chk_mem(); if(sate_temp=0x60) spi_currrowaddr(); if(sate_temp=0x80) spi_set_opt(isd1700_set_play|isd_led); /spi_set_opt(isd1700_set_play); if(sate_temp=0x81) spi_set_opt(isd1700_set_rec|isd_led);/spi_set_opt(isd1700_
35、set_rec); isd_comm_ram_c0=isd1700_set_rec ; seril_back_sate(1); if(sate_temp=0x82) spi_set_opt(isd1700_set_erase|isd_led);/spi_set_opt(isd1700_set_erase); if(sate_temp=isd1700_wr_apc2) ri=0; while(!ri); apc_temp=sbuf; apc_temp=apc_temp8; ri=0; while(!ri); apc_temp|=sbuf; ri=0; isd_ss=0; isd1700_par2_comm(isd1700_wr_apc2,apc_temp); isd_ss=1; ri=0; if(re_fig) rest_isd_comm_ptr();sate_temp=0;do sbuf=*back_data_ptr+; while(!ti); ti=0; while(+sate_temp=2); re_fig=0; void spi_set_opt(uchar spi_set_comm) uint start_addr,end_addr; ri=0; while(!ri); start_addr=sbuf; start_addr=start_addr8;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年天津市滨海新区天津开发区第一中学物理高二下期末教学质量检测试题含解析
- 工业厂房设备租赁合同
- 福建省泉州市南安市侨光中学2025届高二物理第二学期期末统考模拟试题含解析
- 山西省孝义市实验中学2025届物理高一下期末质量检测模拟试题含解析
- 2025版生物科技项目策划与研发委托合同
- 二零二五年度高空电梯安装工程劳务分包合同示例
- 2025版碧桂园特色小镇建设项目总承包施工合同书
- 2025版安能物流月结服务企业升级版合同
- 二零二五年度金融科技领域人才聘用合同
- 2025版拆墙工程施工人员管理协议书合同范本
- 科研助理合同协议书
- 患者身份识别制度培训
- 绿化工程挂靠合同协议
- 父亲同意孩子户口迁到母亲协议书5篇
- 《诸子百家教学课件》课件
- T-SHWSHQ 01-2023《医疗卫生机构安全生产标准化管理规范》
- 房屋美化合同协议
- 四年级音体美试卷及答案
- 混凝土外观质量规范要求
- 数控操作工培训内容
- 危重孕产妇抢救报告制度
评论
0/150
提交评论