isd4004语音程序.doc_第1页
isd4004语音程序.doc_第2页
isd4004语音程序.doc_第3页
isd4004语音程序.doc_第4页
isd4004语音程序.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#include /51单片机头文件#include /汇编函数指令#include ISD4004_drive.h /语音芯片驱动 #include LCD_drive.h /液晶驱动#include DS18B20_drive.h /DS18B20驱动 #define uchar unsigned char #define uint unsigned intsbit K1 = P34; /K1键,模式选择按键 sbit K2 = P35; /K2键,按下K2键,录音或放音按键 count值加 sbit K3 = P36; /K3键,按下K3键,录音或放音按键 count减少sbit K4 = P37; /K4键,播放键 uint keystate; /模式的状态 uchar ovflog; /溢出声明bit temp_flag ; /判断DS18B20是否正常标志位,正常时为1,不正常时为0 uchar temp_comp; /用来存放测量温度的整数部分 uchar disp_buf8=0; /显示缓冲uchar temp_data2 = 0x00,0x00; /用来存放温度数据的高位和低位 uchar hour=23,min=59,sec=45; /定义小时、分钟和秒变量 uchar count_10ms; /定义10ms计数器uchar code line1_data = DS18B20 OK ; /DS18B20正常时第1行显示的信息uchar code line2_data = TEMP: ; /DS18B20正常时第2行显示的信息 uchar code menu1_error = DS18B20 ERR ; /DS18B20出错时第1行显示的信息 uchar code menu2_error = TEMP: - ; /DS18B20出错时第2行显示的信息 uchar code line3_data = Recording Voice; /定义第1行显示的字符 uchar code line4_data= Num:; uchar code line5_data = Welcome ZangChuq; uchar code line6_data = Graduate Design; sbit BEEP=P10; /定义蜂鸣器 bit K1_FLAG=0; /定义按键标志位当按下K1键时该位置1K1键未按下时该位为0。 uchar code line1_data_time = -LCD Clcok-; /定义第1行显示的字符 uchar code line2_data_time = *; /定义第2行显示的字符 uchar disp_buf_time6=0x00, 0x00, 0x00, 0x00, 0x00, 0x00; /定义显示缓冲单元 uchar disp_buf12=0x00,0x00; /定义显示缓冲单元,并赋值uchar code addh_tab73=00,00,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01, 02,02,02,02,02,02,02,02,02,02,02,02,02,02,02, 03,03,03,03,03,03,03,03,03,03,03,03,03,03,03, 04,04,04,04,04,04,04,04,04,04,04,04,04,04,04, 05,05,05,05,05,05,05,05,05,05,05 ;/ISD4004高位地址表 uchar code addl_tab73=00,22,00,07,14,21,28,35,42,49,56,63,70,77,84,91,98, 00,07,14,21,28,35,42,49,56,63,70,77,84,91,98, 00,07,14,21,28,35,42,49,56,63,70,77,84,91,98, 00,07,14,21,28,35,42,49,56,63,70,77,84,91,98, 00,07,14,21,28,35,42,49,56,63,70 ;/ISD4004低位地址表 uchar count=1; /站计数器,初始为第1站 /*以下是函数声明,由于本例采用的函数较多,应加入函数声明部分*/ void TempDisp(); /温度值显示函数声明 void MenuError(); /DS18B20出错菜单函数声明 void MenuOk(); /DS18B20正常菜单函数声明 void Delay_ms(uint xms); void time_char_disp();/*以下是蜂鸣器响一声函数*/void beep() BEEP=0; /蜂鸣器响Delay_ms(100); BEEP=1; /关闭蜂鸣器 Delay_ms(100); /*以下是转换函数,负责将走时数据转换为适合LCD显示的数据*/ void LCD_conv_time(uchar in1,in2,in3 ) /形参in1、in2、in3接收实参hour,min、sec传来的数据 disp_buf_time0=in1/10+0x30; /小时十位数据 disp_buf_time1=in1%10+0x30; /小时个位数据 disp_buf_time2=in2/10+0x30; /分钟十位数据 disp_buf_time3=in2%10+0x30; /分钟个位数据 disp_buf_time4=in3/10+0x30; /秒十位数据 disp_buf_time5=in3%10+0x30; /秒个位数据*指示灯闪烁函数*/ void LED_flash1() /约18秒的延时 uint i; for(i=0;i10;i+) LED=1; Delay_ms(200); LED=0; Delay_ms(200); void LED_flash2() /约1.5秒的延时 uint i;for(i=0;i127) /大于127即高4位为全1,即温度为负值 temp_data0=(temp_data0)+1; /取反加1,将补码变成原码 if(temp_data0)=0xff) /若大于或等于0xff temp_data1=(temp_data1)+1; /取反加1 else temp_data1=temp_data1; /否则只取反 sign=1; /置符号标志位为1 temp =temp_data0&0x0f; /取小数位 disp_buf0=(temp *10/16)+0x30; /将小数部分变换为ascii码 temp_comp =(temp_data0&0xf0)4)|(temp_data1&0x0f)73)count=1; /若录完第8站,则返回到第1站 if(K3=0) Delay_ms(10); if (K3=0) while(!K3); /等待K1键释放 count-; /指向下一地址 if(count=0) count=73; /若录完第8站,则返回到第1站 if (K4=0) Delay_ms(10); if (K4=0) while(!K4); /等待K1键释放 if(count=1) isd_powerup(); /ISD上电 isd_poweroff(); /掉电 isd_powerup(); /上电 Delay_ms(500); /延迟500ms录音 isd_setrec(addl_tabcount-1,addh_tabcount-1); /设置ISD低位和高位地址表 Delay_ms(100); isd_rec(); /发送rec指令 LED_flash1(); LED=1; count+; /指向下一地址 isd_stop(); /发送停止命令 if(count73)count=1; /若录完第8站,则返回到第1站 else isd_powerup(); /ISD上电 isd_poweroff(); /掉电 isd_powerup(); /上电 Delay_ms(500); /延迟500ms录音 isd_setrec(addl_tabcount-1,addh_tabcount-1); /设置ISD低位和高位地址表 Delay_ms(100); isd_rec(); /发送rec指令 LED_flash2(); LED=1; count+; /指向下一地址 isd_stop(); /发送停止命令 if(count73)count=1; /若录完第8站,则返回到第1站 EA=1; /录音完毕打开中断 void time_char_disp() uchar i; /清屏函数在LCD驱动程序软件包中 lcd_wcmd(0x00|0x80); /设置显示位置为第1行第0列 i=0; while(line1_data_time i!= 0) /在第1行显示-LCD Clcok- lcd_wdat(line1_data_timei); /显示第1行字符 i+; /指向下一字符 lcd_wcmd(0x40|0x80); /设置显示位置为第2行第0列 i=0; while(line2_data_timei!= 0) /在第2行03列显示* lcd_wdat(line2_data_timei); /显示第2行字符 i+; /指向下一字符 lcd_wcmd(0x4c|0x80); /设置显示位置为第2行第12列 i=0; while(line2_data_timei != 0) /在第2行12列之后显示* lcd_wdat(line2_data_timei); /显示第2行字符 i+; /指向下一字符 /*以下是定时器T0初始化函数*/void timer0_init() TMOD=0x11; /定时器0、1工作方式1 TH0=0xf8;TL0=0xcc; /定时时间为2ms计数初值 TH1 = 0xdc;TL1 = 0x00; / 装定时器T1计数初值,定时时间为10ms EA=1;ET0=1; /开总中断和定时器T0、1中断 TR0=1; /T0开始运行 ET1=1; /开总中断和定时器T1中断 TR1 = 1; /启动定时器T1 /*按键处理函数*/ void Key_process() if(K1=0) Delay_ms(10); /若K2键按下,延时10ms,防抖动 if (K1=0) while(!K1); /等待K2键释放 keystate+; /指向下一刂? if(keystate3) keystate=0; /若播放完第10站,则返回到第1站 else if(keystate=0)&(K4=0) Delay_ms(10); if(keystate=0)&(K4=0) while(!K4); isd_setplay(addl_tab0,addh_tab0); /设置ISD低位和高位地址表 isd_play(); /发送放音指令 LED=0; /开LED灯 Delay1(20); while(ISD_INT=1) ;/若放音完毕则中断信号ISD_INT=0,若放音未完毕,则等待中断信号 LED=1; /关LED灯 isd_stop(); /发送停止命令 if (ovflog=check_ovf() isd_poweroff(); /检查芯片是否溢出如溢出则停止放音芯片复位 else if(keystate=3)&(K4=0) ) Delay_ms(10); if(keystate=3)&(K4=0) ) while(!K4);isd_setplay(addl_tab4,addh_tab4); /设置ISD低位和高位地址表 isd_play(); /发送放音指令 LED=0; /开LED灯 Delay1(20); while(ISD_INT=1);/若放音完毕则中断信号ISD_INT=0,若放音未完毕,则等待中断信号 LED=1; /关LED灯 isd_stop(); /发送停止命令 if (ovflog=check_ovf() isd_poweroff(); /检查芯片是否溢出如溢出则停止放音芯片复位 isd_setplay(addl_tabhour+13,addh_tabhour+13); /设置ISD低位和高位地址表 isd_play(); /发送放音指令 LED=0; /开LED灯 Delay1(20); while(ISD_INT=1);/若放音完毕则中断信号ISD_INT=0,若放音未完毕,则等待中断信号 LED=1; /关LED灯 isd_stop(); /发送停止命令 if (ovflog=check_ovf() isd_poweroff(); /检查芯片是否溢出如溢出则停止放音芯片复位 isd_setplay(addl_tab6,addh_tab6); /设置ISD低位和高位地址表 isd_play(); /发送放音指令 LED=0; /开LED灯 Delay1(20); while(ISD_INT=1);/若放音完毕则中断信号ISD_INT=0,若放音未完毕,则等待中断信号 LED=1; /关LED灯 isd_stop(); /发送停止命令 if (ovflog=check_ovf() isd_poweroff(); /检查芯片是否溢出如溢出则停止放音芯片复位 isd_setplay(addl_tabmin+13,addh_tabmin+13); /设置ISD低位和高位地址表 isd_play(); /发送放音指令 LED=0; /开LED灯 Delay1(20); while(ISD_INT=1);/若放音完毕则中断信号ISD_INT=0,若放音未完毕,则等待中断信号 LED=1; /关LED灯 isd_stop(); /发送停止命令 if (ovflog=check_ovf() isd_poweroff(); /检查芯片是否溢出如溢出则停止放音芯片复位isd_setplay(addl_tab7,addh_tab7); /设置ISD低位和高位地址表 isd_play(); /发送放音指令 LED=0; /开LED灯 Delay1(20); while(ISD_INT=1);/若放音完毕则中断信号ISD_INT=0,若放音未完毕,则等待中断信号 LED=1; /关LED灯 isd_stop(); /发送停止命令 if (ovflog=check_ovf() isd_poweroff(); /检查芯片是否溢出如溢出则停止放音芯片复位 else if(keystate=2)&(K4=0) Delay_ms(10); if(keystate=2)&(K4=0) while(!K4); isd_setplay(addl_tab1,addh_tab1); /设置ISD低位和高位地址表 isd_play(); /发送放音指令 LED=0; /开LED灯 Delay1(20); while(ISD_INT=1) ;/若放音完毕则中断信号ISD_INT=0,若放音未完毕,则等待中断信号 LED=1; /关LED灯 isd_stop(); /发送停止命令 if (ovflog=check_ovf() isd_poweroff(); /检查芯片是否溢出如溢出则停止放音芯片复位 isd_setplay(addl_tabtemp_comp+13,addh_tabtemp_comp+13); /设置ISD低位和高位地址表 isd_play(); /发送放音指令 LED=0; /开LED灯 Delay1(20); while(ISD_INT=1) ;/若放音完毕则中断信号ISD_INT=0,若放音未完毕,则等待中断信号 LED=1; /关LED灯 isd_stop(); /发送停止命令 if (ovflog=check_ovf() isd_poweroff(); /检查芯片是否溢出如溢出则停止放音芯片复位 isd_setplay(addl_tab2,addh_tab2); /设置ISD低位和高位地址表 isd_play(); /发送放音指令 LED=0; /开LED灯 Delay1(20); while(ISD_INT=1) ;/若放音完毕则中断信号ISD_INT=0,若放音未完毕,则等待中断信号LED=1; /关LED灯 isd_stop(); /发送停止命令 if (ovflog=check_ovf() isd_poweroff(); /检查芯片是否溢出如溢出则停止放音芯片复位 isd_setplay(addl_tabdisp_buf0-0x30+13,addh_tabdisp_buf0-0x30+13); /设置ISD低位和高位地址表 isd_play(); /发送放音指令 LED=0; /开LED灯 Delay1(20); while(ISD_INT=1) ;/若放音完毕则中断信号ISD_INT=0,若放音未完毕,则等待中断信号 LED=1; /关LED灯 isd_stop(); /发送停止命令 if (ovflog=check_ovf() isd_poweroff(); /检查芯片是否溢出如溢出则停止放音芯片复位 isd_setplay(addl_tab3,addh_tab3); /设置ISD低位和高位地址表 isd_play(); /发送放音指令 LED=0; /开LED灯 Delay1(20); while(ISD_INT=1) ;/若放音完毕则中断信号ISD_INT=0,若放音未完毕,则等待中断信号 LED=1; /关LED灯 isd_stop(); /发送停止命令 if (ovflog=check_ovf() isd_poweroff(); /检查芯片是否溢出如溢出则停止放音芯片复位 void key_timechange() if(K2=0) /若按下K2键 Delay_ms(10); /延时去抖 if(K2=0) while(!K2); /等待K2键释放 beep(); hour+; /小时调整 if(hour=24) hour = 0; if(K3=0) /若按下K3键 Delay_ms(10); if(K3=0) while(!K3); /等待K3键释放 beep(); min+; /分钟调整 if(min=60) min = 0; /*以下是主函数*/ void main(void) P0=0xff; P1=0xff; P2=0xff; P3=0xff; /端口初始化 timer0_init(); /调定时器T0初始化函数 lcd_init(); lcd_clr(); keystate=0; while(1) Key_process(); if(keystate=3) time_char_disp(); Delay_ms(5); key_timechange(); else if(keystate=1) lcd_clr(); Recorder(); /如果keystate=1则转入录音部分 else if (keystate=2) GetTemperture(); /读取温度数据 if(temp_flag=0) MenuError(); /显示出错信息函数TempDisp(); else if(temp_flag=1) /若DS18B20正常,则往下执行 TempConv(); /将温度转换为适合LCD显示的数据 MenuOk(); /显示温度值菜单 /*以下是定时器T0中断函数*/ void timer0() interrupt 1 TH0=0xf8; TL0=0x30; /重置计数初值,定时时间为2ms NumConv(); /调数值转换函数 LCD_conv_time(hour,min,sec); /调走时转换函数 LCD_disp (); /调显示函数 /*以下是定时器T1中断函数, 用于产生用于产生秒、分钟和小时信号*/ void timer1() interrupt 3 TH1 = 0xdc;TL0 = 0x00; /重装计数初值,定时时间为10ms count_10ms+; /10ms计数器加1 if(count_10ms = 100) count_10ms = 0; /计数100次后恰好为1s,此时10ms计数器清0 sec+; /秒加1 if(sec = 60) se

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论