基于51单片机可语音播放万用表的设计
- 格式:doc
- 大小:122.00 KB
- 文档页数:4
基于51单片机的语音识别系统设计的设计思路
基于51单片机的语音识别系统设计一般分为以下几个部分:
1. 语音输入模块:这一部分需要一个语音输入模块,用于采集用户的语音信号。
一般常用的语音输入模块有麦克风、语音识别芯片等。
2. 信号处理模块:对采集到的语音信号进行预处理和特征提取处理,以便进行后续的识别处理。
主要的处理过程包括信号滤波、特征提取、特征参数处理、信号识别等。
3. 语音识别模块:根据信号处理后得到特征参数,使用语音识别算法对输入的语音进行识别,将语音信号转换成文本信息,表示用户交互的意图。
4. 控制处理模块:通过上述处理得到用户的控制信息,根据不同的控制信号执行对应的操作,如控制LED灯、语音合成等。
5. 外围控制模块:根据用户的需求,可以添加外围控制模块,包括LED灯、电机、蜂鸣器等,以实现更多实际应用需求。
整个系统的设计需要详细分析每个模块的功能和实现,根据实际应用需求进行硬件选型和系统设计,同时对系统进行综合测试和性能评估。
基于51单片机控制的语音报时万年历一.实验要求运用单片机及相关外设实现以下功能:1)万年历及时钟显示2)时间日期可调3)可对时间进行整点报时和随机报时二.方案分析根据实验要求,选用STC公司的8051系列,STC12C5A16S2增强型51单片机。
此单片机功能强大,具有片内EEPROM、1T分频系数、片内ADC转换器等较为实用功能,故选用此款。
实验中,对日期和时间进行显示,显示的字符数较多,故选用12864LCD屏幕。
该屏幕操作较为便捷,外围电路相对简单,实用性较强。
为了实现要求中的时间日期可调,故按键是不可缺少的,所以使用了较多的按键。
一方面,单片机的I/O口较为充足;另一方面,按键较多,选择的余地较大,方便编程控制。
实验中,并未要求对时间和日期进行保存和掉电续运行,所以并未添加EEPROM和DS12C887-RTC芯片。
实际上,对万年历来说,这是较为重要的,但为了方便实现和编程的简单,此处并未添加,而是使用单片机的定时器控制时间,精度有差别。
且上电默认时间为2014-01-01 09:00:00 之后需要手动调整为正确时间。
要求中的语音报时功能,这里选用ISD1760芯片的模块来帮助实现。
此模块通过软件模拟SPI协议控制。
先将所需要的声音片段录入芯片的EEPROM区域,之后读出各段声音的地址段,然后在程序中定义出相应地址予以控制播放哪一声音片段。
三.电路硬件设计实际效果图四.程序代码部分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"extern unsigned int count;extern unsigned int key_time[8]; extern unsigned char key_new; extern unsigned char key_old; extern unsigned char stop_flag; extern unsigned char key_follow[8]; extern unsigned int key_num[8];sbit BEEP=P3^7;sbit ISD_SS=P0^7;sbit ISD_MISO=P0^4;sbit ISD_MOSI=P0^5;sbit ISD_SCLK=P0^6;extern unsigned char date_show[]; extern unsigned char time_show[]; extern unsigned char sec;extern unsigned char 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.c#include "main.h"unsigned int count=0;unsigned int key_num[8]=0;unsigned char key_new=0;unsigned char key_old=0;unsigned char stop_flag=0;unsigned char key_follow[8]=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 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();initinal(); //调用LCD字库初始化程序TMOD=0x01; //使用定时器T0TH0=(65536-1000)/256; //定时器高八位赋初值TL0=(65536-1000)%256; //定时器低八位赋初值*/ EA=1; //开中断总允许ET0=1; //允许T0中断TR0=1; //启动定时器T0while(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;}else if(key==2){if(!adjust_pos)adjust_pos=13;elseadjust_pos--;}else if(key==6){if(!adjust_pos)sec++;else if(adjust_pos==1)sec=sec+10;else if(adjust_pos==2)min++;else if(adjust_pos==3)min=min+10;else if(adjust_pos==4)hour++;else if(adjust_pos==5)hour=hour+10;else if(adjust_pos==6)day++;else if(adjust_pos==7)day=day+10;else if(adjust_pos==8)month++;else if(adjust_pos==9)month=month+10;else if(adjust_pos==10)year_l++;else if(adjust_pos==11)year_l=year_l+10;else if(adjust_pos==12)year_f++;else if(adjust_pos==13)year_f=year_f+10; }else if(key==7){if(!adjust_pos)sec--;else if(adjust_pos==1)sec=sec-10;else if(adjust_pos==2)min--;else if(adjust_pos==3)min=min-10;else if(adjust_pos==4)hour--;else if(adjust_pos==5)hour=hour-10;else if(adjust_pos==6)day--;else if(adjust_pos==7)day=day-10;else if(adjust_pos==8)month--;else if(adjust_pos==9)month=month-10;else if(adjust_pos==10)year_l--;else if(adjust_pos==11)year_l=year_l-10;else if(adjust_pos==12)year_f--;else if(adjust_pos==13)year_f=year_f-10;}else if(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();}}}void time0() interrupt 1{static unsigned char timer=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)%40 0)))leap_year_flag=1;elseleap_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]=' ';else if(adjust_pos==1)time_show[6]=' ';else if(adjust_pos==2)time_show[4]=' ';else if(adjust_pos==3)time_show[3]=' ';else if(adjust_pos==4)time_show[1]=' ';else if(adjust_pos==5)time_show[0]=' ';else if(adjust_pos==6)date_show[9]=' ';else if(adjust_pos==7)date_show[8]=' ';else if(adjust_pos==8)date_show[6]=' ';else if(adjust_pos==9)date_show[5]=' ';else if(adjust_pos==10)date_show[3]=' ';else if(adjust_pos==11)date_show[2]=' ';else if(adjust_pos==12)date_show[1]=' ';else if(adjust_pos==13)date_show[0]=' ';update_flag=1;}if(!min&&!sec&&!adjust_flag)report_flag=1;}unsigned char report(){PlaySoundTick(11);long_delay();if(!min){if(hour<=10){PlaySoundTick(hour);short_delay();PlaySoundTick(12);short_delay();PlaySoundTick(14);short_delay();}else if(hour>10&&hour<20){PlaySoundTick(10);short_delay();PlaySoundTick(hour-10);short_delay();PlaySoundTick(12);short_delay();PlaySoundTick(14);short_delay();}else if(hour==20){PlaySoundTick(2);short_delay();PlaySoundTick(10);short_delay();PlaySoundTick(12);short_delay();PlaySoundTick(14);short_delay();}else{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();}else if(hour>10&&hour<20){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();}else{PlaySoundTick(2);short_delay();short_delay();PlaySoundTick(hour-20);short_delay();PlaySoundTick(12);short_delay();}if(min<=10){PlaySoundTick(min);short_delay();PlaySoundTick(13);short_delay();}else if(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;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;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 #define 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 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_C[7];extern 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_par,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);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 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#include "isd1700.h"#include "sound.h"#define uchar unsigned char#define uint unsigned intsbit DAC_sync=P2^0;sbit DAC_sclk=P2^1;sbit DAC_din =P2^2;bit re_fig;uchar data comm_temp;uchar data ISD_COMM_RAM[7];uchar data ISD_COMM_RAM_C[7];uchar data *isd_comm_ptr;uchar data *back_data_ptr;void init(void);void isd_delay(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 comm void isd1700_7byte_comm(uchar comm_par, uint star_addr, uint end_addr);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_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_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_temp==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(sate_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_SET_REC);ISD_COMM_RAM_C[0]=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_temp<<8;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_addr<<8;RI=0;while(!RI);start_addr|=SBUF;RI=0;while(!RI);end_addr=SBUF;end_addr=start_addr<<8;RI=0;while(!RI);end_addr|=SBUF;RI=0;ISD_SS=0;isd1700_7byte_comm(spi_set_comm, start_addr, end_addr);ISD_SS=1;}void spi_pu (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_PU,2);ISD_SS=1;}void spi_stop (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_STOP,2);ISD_SS=1;ISD_COMM_RAM_C[0]=ISD1700_STOP ;seril_back_sate(1);}void spi_Rest (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_REST,2);ISD_SS=1;}void spi_CLR_INT(void){ISD_SS=0;isd1700_Npar_comm(ISD1700_CLR_INT,2);ISD_SS=1;}void spi_RD_STAUS(void){ uchar i;ISD_SS=0;isd1700_Npar_comm(ISD1700_RD_STAUS,3);ISD_SS=1;i=ISD_COMM_RAM_C[1];//j=ISD_COMM_RAM_C[2];ISD_COMM_RAM_C[1]=ISD_COMM_RAM_C[0];ISD_COMM_RAM_C[0]=i;seril_back_sate(3);}void spi_CurrRowAddr(void){ uchar i;ISD_SS=0;isd1700_Npar_comm(ISD1700_RD_STAUS,3);ISD_SS=1;i=ISD_COMM_RAM_C[1];ISD_COMM_RAM_C[1]=ISD_COMM_RAM_C[0]>>5|ISD_COMM_RAM_C[1]<<3;ISD_COMM_RAM_C[0]= i >>5;seril_back_sate(3);}void spi_RD_play_ptr(void){ uchar i;ISD_SS=0;isd1700_Npar_comm(ISD1700_RD_PLAY_PTR,4);ISD_SS=1;i=ISD_COMM_RAM_C[3]&0x03;ISD_COMM_RAM_C[3]=ISD_COMM_RAM_C[2];ISD_COMM_RAM_C[2]=i;seril_back_sate(4);}void spi_pd(void){ISD_SS=0;isd1700_Npar_comm(ISD1700_PD,2);ISD_SS=1;}void spi_RD_rec_ptr(void){ uchar i;ISD_SS=0;isd1700_Npar_comm(ISD1700_RD_REC_PTR,4);ISD_SS=1;i=ISD_COMM_RAM_C[3]&0x03;ISD_COMM_RAM_C[3]=ISD_COMM_RAM_C[2];ISD_COMM_RAM_C[2]=i;seril_back_sate(4);}void spi_devid(void){ISD_SS=0;isd1700_Npar_comm(ISD1700_DEVID,3);ISD_SS=1;ISD_COMM_RAM_C[2]=ISD_COMM_RAM_C[2]&0xf8;seril_back_sate(3);}void spi_play(void){ISD_SS=0;isd1700_Npar_comm(ISD1700_PLAY|ISD_LED,2);ISD_SS=1;}void spi_rec (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_REC|ISD_LED,2);ISD_SS=1;ISD_COMM_RAM_C[0]=ISD1700_REC ;seril_back_sate(1);}void spi_erase (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_ERASE|ISD_LED,2);ISD_SS=1;}void spi_G_ERASE (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_G_ERASE|ISD_LED,2);ISD_SS=1;}void spi_rd_apc(void){ISD_SS=0;isd1700_Npar_comm(ISD1700_RD_APC,4);ISD_SS=1;seril_back_sate(4);}void spi_wr_apc1 (void){}void spi_wr_apc2 (void){ISD_SS=0;isd1700_par2_comm(ISD1700_WR_APC2, 0x0400);ISD_SS=1;}void spi_wr_nvcfg (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_WR_NVCFG,2);ISD_SS=1;}void spi_ld_nvcfg (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_LD_NVCFG ,2);ISD_SS=1;}void spi_fwd (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_FWD,2);ISD_SS=1;}void spi_chk_mem(void){ISD_SS=0;isd1700_Npar_comm(ISD1700_CHK_MEM,2);ISD_SS=1;}void seril_back_sate(uchar byte_number){uchar sate_temp;rest_isd_comm_ptr();sate_temp=0;do{SBUF=*back_data_ptr++;while(!TI);TI=0;}while(++sate_temp<byte_number);}void rest_isd_comm_ptr(void){isd_comm_ptr=ISD_COMM_RAM;back_data_ptr=ISD_COMM_RAM_C;}void isd1700_Npar_comm (uchar comm_par,comm_byte_count) {uchar i;i=0;ISD_COMM_RAM[0]=comm_par;isd_comm_ptr=&ISD_COMM_RAM[1];do{*isd_comm_ptr++=NULL;}while(++i<comm_byte_count-1);rest_isd_comm_ptr();i=0;do{*back_data_ptr++=T_R_comm_byte(*isd_comm_ptr++);i++;}while(i<comm_byte_count);}void isd1700_par2_comm(uchar comm_par, uint data_par){uchar i;ISD_COMM_RAM[0]=comm_par;ISD_COMM_RAM[1]=data_par;ISD_COMM_RAM[2]=data_par>>8;rest_isd_comm_ptr();i=0;do{*back_data_ptr++=T_R_comm_byte(*isd_comm_ptr++);i++;}while(i<3);}void isd1700_7byte_comm(uchar comm_par, uint star_addr, uint end_addr) {uchar i;ISD_COMM_RAM[0]=comm_par;ISD_COMM_RAM[1]=NULL;ISD_COMM_RAM[2]=star_addr;ISD_COMM_RAM[3]=star_addr>>8;ISD_COMM_RAM[4]=end_addr;ISD_COMM_RAM[5]=end_addr>>8;ISD_COMM_RAM[6]=NULL;rest_isd_comm_ptr();i=0;do{*back_data_ptr++=T_R_comm_byte(*isd_comm_ptr++);i++;}while(i<=7);}uchar T_R_comm_byte( uchar comm_data ){uchar bit_nuber;uchar temp;bit_nuber=0;temp=0;do{ISD_SCLK=0;isd_delay(1);if((comm_data>>bit_nuber&0x01)!=0){ISD_MOSI=1;}else{ISD_MOSI=0;}if(ISD_MISO){temp=(temp>>1)|0x80;}else{temp=temp>>1;}ISD_SCLK=1;isd_delay(1);}while(++bit_nuber<=7);ISD_MOSI=0;return (temp);}void isd_delay(int x){uchar i;for(; x>=1; x--){for(;i<=20;i++);}}void init(void){TMOD=0x21;SCON=0x50;TL0=0x00; //25msTH0=0x70; //25msTH1=0xE8;TL1=0xE8; //波特率:1200bps(12MHz:0xE6 11.0592MHz:0xE8)ET0=1;EA=1;TR1=1;IT0 = 0;EX0 = 0;spi_pu();spi_devid();}12864.h#ifndef _12864_H#define _12864_H#include "main.h"sbit RS =P3^2;sbit RW=P3^3;sbit EN=P3^4;void buzy();void TransferData(char data1,bit DI);void Dingwei(unsigned char line,unsigned char row);void delayms(unsigned int n);void delay(unsigned int m);void lcd_mesg(unsigned char code *adder1);void displayonechar(unsigned int data2);void initinal(void) ; //LCD字库初始化程序void clrram(void);void lcd_pos(unsigned char ,unsigned char );void write_dat(unsigned char);extern unsigned char time_show[];extern unsigned int aaa;#endif12864.c#include "12864.h"#define DataPort P1void initinal(void) //LCD字库初始化程序{TransferData(0x30,0); //8BIT设置,RE=0: basic instruction setTransferData(0x08,0); //Display on ControlTransferData(0x10,0); //Cursor Display Control光标设置TransferData(0x0C,0); //Display Control,D=1,显示开TransferData(0x01,0); //Display Clear}void buzy(){DataPort=0xff;RW=1;RS=0;EN=1;while(DataPort&0x80);EN=0;}void Dingwei(unsigned char line,unsigned char row) //定位在哪行哪列显示{unsigned int i;switch(line){case 1: i=0x80+row;break;case 2: i=0x90+row;break;case 3: i=0x88+row;break;case 4: i=0x98+row;break;default: i=0x80;break;}TransferData(i,0);delay(1);}void lcd_mesg(unsigned char code *addr) //传送一个字符串{while(*addr>0){TransferData(*addr,1);addr++;}}void TransferData(char data1,bit DI) //传送数据或者命令,当DI=0,传送命令,当DI=1,传送数据.{buzy();RW=0;RS=DI;DataPort=data1;EN=1;EN=0;}void delayms(unsigned int n) //延时10×n毫秒程序{unsigned int i,j;for(i=0;i<3*n;i++)for(j=0;j<2000;j++);}void delay(unsigned int m) //延时程序,微妙级{while(m--){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}}void write_cmd(unsigned char cmd){RS=0;RW=0;EN=0;P1=cmd;delayms(1);EN=1;delayms(1);EN=0;}void write_dat(unsigned char dat){RS=1;RW=0;EN=0;P1=dat;delayms(1);EN=1;delayms(1);EN=0;}void lcd_pos(unsigned char x,unsigned char y){unsigned char pos;if(x==0)x=0x80;else if(x==1)x=0x90;else if(x==2)x=0x88;else if(x==3)x=0x98;pos=x+y;write_cmd(pos);}void clrram(void){write_cmd(0x30);write_cmd(0x01);}Sound.h#ifndef _SOUND_H#define _SOUND_H#include "main.h"//以下为语音信息对应播放起始地址定义,A为开始,B为结束#define sound_0A 0x0012#define sound_0B 0x0017#define sound_1A 0x0019#define sound_1B 0x0025#define sound_2A 0x0027#define sound_2B 0x002e#define sound_3A 0x002f#define sound_3B 0x0039#define sound_4A 0x003b#define sound_4B 0x0048#define sound_5A 0x004a#define sound_5B 0x004f#define sound_6A 0x0052#define sound_6B 0x0159#define sound_7A 0x005c#define sound_7B 0x0062#define sound_8A 0x0065#define sound_8B 0x0131#define sound_9A 0x006f#define sound_9B 0x015F#define sound_10A 0x0079#define sound_10B 0x015E#define sound_11A 0x0082#define sound_11B 0x018A#define sound_12A 0x0091#define sound_12B 0x0100#define sound_13A 0x009f#define sound_13B 0x0100#define sound_14A 0x00ac#define sound_14B 0x0100void GetSound(unsigned char soundtick); void PlaySoundTick(unsigned char number); void delay_isd(unsigned int time);void short_delay();void long_delay();#endifSound.c#include "sound.h"void GetSound(unsigned char soundtick){ISD_SS=0;switch(soundtick){case 0:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_0A, sound_0B); }break;case 1:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_1A, sound_1B); }break;case 2:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_2A, sound_2B); }break;case 3:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_3A, sound_3B); }break;case 4:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_4A, sound_4B); }break;case 5:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_5A, sound_5B); }break;case 6:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_6A, sound_6B); }break;case 7:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_7A, sound_7B); }break;case 8:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_8A, sound_8B); }break;case 9:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_9A, sound_9B); }break;case 10:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_10A, sound_10B); }break;case 11:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_11A, sound_11B); }break;case 12:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_12A, sound_12B); }break;case 13:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_13A, sound_13B); }break;case 14:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_14A, sound_14B); }break;default: break;}ISD_SS=1;}void PlaySoundTick(unsigned char number) {spi_stop ();delay_isd(30000);GetSound(number);}void delay_isd(unsigned int time){while(time--!=0);}void short_delay(){delay_isd(30000);delay_isd(30000);delay_isd(30000);delay_isd(30000);delay_isd(30000);delay_isd(30000);delay_isd(30000);delay_isd(30000);delay_isd(30000);}void long_delay(){short_delay();short_delay();short_delay();short_delay();}Key.h#ifndef _KEY_H#define _KEY_H#include "main.h"sbit KEY1=P2^0;sbit KEY2=P2^1;sbit KEY3=P2^2;sbit KEY4=P2^3;sbit KEY5=P2^4;sbit KEY6=P2^5;sbit KEY7=P2^6;sbit KEY8=P2^7;sbit KEY_SURE=P3^6;void key_delay(unsigned char z); unsigned char keyscan_nor();#endifKey.c#include "key.h"unsigned char keyscan_nor() {if(!KEY1){key_delay(20);if(!KEY1){LED1=0;return 1;}}if(!KEY2){key_delay(20);if(!KEY2){LED2=0;return 2;}}if(!KEY3){key_delay(20);if(!KEY3){LED3=0;return 3;}}if(!KEY4){key_delay(20);if(!KEY4){LED4=0;return 4;}}if(!KEY5){key_delay(20);if(!KEY5){LED5=0;return 5;}}if(!KEY6){key_delay(20);if(!KEY6){LED6=0;return 6;}}if(!KEY7){key_delay(20);if(!KEY7){LED7=0;return 7;}}if(!KEY8){key_delay(20);if(!KEY8){LED8=0;return 8;}}return 0;}void key_delay(unsigned char z) {unsigned char x,y;for(x=z;x>0;x--)for(y=110;y>0;y--); }五.参与制作人员ZYL毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
语音录放系统总体设计及主要芯片说明目录摘要 (I)ABSTRACT (II)绪论 (1)1 语音录放系统总体设计及主要芯片说明 (4)1.1总体方案论证 (4)1.2器件选择 (5)1.2.1 单片机的选择 (5)1.2.2 语音芯片选择 (6)1.3AT89C51芯片说明 (7)1.3.1 AT89C51的主要参数 (7)1.3.2 AT89C51的引脚功能说明 (8)1.4ISD2560语音芯片 (9)1.4.1 ISD2560的引脚功能 (9)1.4.2 ISD2560的操作模式 (10)1.4.3 ISD2560的分段录放音 (11)1.4.5 ISD2560的应用电路 (12)1.5LM386集成功率放大器芯片说明 (13)1.5.1 LM386电子特性 (13)1.5.2 LM386的引脚说明 (14)2 语音录放系统硬件电路设计 (16)2.1系统硬件电路总体设计 (16)2.2AT89C51的外围电路设计 (16)2.2.1 晶振电路设计 (16)2.2.2 复位电路设计 (17)2.3语音电路设计 (18)2.4功放电路设计 (19)2.5键盘输入电路和状态显示电路设计 (19)3 语音录放系统软件设计 (21)3.1主要变量说明 (21)3.2主程序工作原理及流程图 (21)3.3子程序流程图及代码 (23)3.3.1 录音子程序 (23)3.3.2 放音子程序 (24)结束语 (26)致谢............................................................................................ 错误!未定义书签。
参考文献 (27)附录1 (28)附录2 (30)摘要在智能仪器仪表或自动控制设备中,增加语音功能能极大地提高人机界面的友好性,方便用户操作。
在许多场合需要将语音合成、语音识别、语音存储和回放技术和单片机结合在一起。
基于51单片机的数字万用表设计摘要本文介绍一种以AT89S52单片机为核心的智能型数字式多用表,该系统采用AD0808为采样元件,对待测交直流电压信号进行实时采样,数据处理,输出显示,并可以直流电流和电阻,且具有键盘选择测量对象、量程和自动量程转换功能。
关键词:A/D转换器,单片机,模拟开关,自动量程转换第一章前言功能:实现交直流测量,量程自动转换,过电压自动报警。
仿真及编译软件:Proteus,Keil ,Wave主要元件:AT89C52,CD4511,AD0808,7段数码管(8个),蜂鸣器预定性能指标:直流电压:范围-40—+50V,精度20mv,实时无间断测量,4%。
交流信号:测量范围-5—+5V,频率范围:300Hz到100Khz误差5%。
初步方案及进展:小组成员及任务分配:组长:陈文豹硬件电路设计参数确定和调试组员:庞明软件程序设计邓玉龙资料查询并辅助电路设计数字万用表设计分析本设计可以分为直流电压测量电路;交流/直流转换电路;电流/电压转换电路;电阻/电压转换电路;功能控制和数据显示电路这五个的主要电路模块。
在设计直流电压测量电路时,利用反相比例运算电路,加上自己设计的四选一模拟开关,组成了一个直流电压测量电路。
但该电路在实践中存在问题,不能实现预期的结果。
做了适当的修改,改为由电阻、模拟开关和运放组成放大倍数可调的比例电路。
由于无论是指针式万用表还是普通的真有效值或平均值响应的数字万用表,其交流电压档的频率特性都较差,一般只能测量几十赫兹到几千赫兹的低频电压。
我发现对于指针式万用表造成频率特性较差的原因主要是万用表的分压电阻采用精密电阻器,其本身的分布电容较大,在对高频电压信号进行测量时,由于分布电容的容抗大为减少使得测量值明显低于实际电压值,而对于数字万用表除上述原因以外,另一主要原因是受平均值响应,转换器本身频率特性的限制。
但此缺陷可通过采用宽频带运算放大器加以改善。
因此,消除分压电阻器分布电容的影响就可以提高万用表工作频率的上限,大大改善其频率特性。
摘要近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,但仅单片机方面的知识是不够的,还应根据具体硬件结构、软硬件结合,来加以完善。
计算器在人们的日常生活中是比较常见的电子产品之一,并且语音技术的进展给这种应用需要提供了一种有力的技术支持,逐渐被广大用户所接受,并广泛用于各种需要语音响应的场合。
基于这样的理念,本次设计是用AT89C51单片机、LCD显示器、控制按键、语音芯片ISD2560为元件来设计的具有语音播报功能的简易计算器。
利用此设计熟悉单片机微控制器及C语言编程,对其片资源及各个I/O端口的功能和基本用途的了解。
掌握Microsoft Visual C++ 6.0应用程序开发环境,常用的LCD显示器的使用方法和一般键盘的使用方法。
关键字:AT89C51、ISD2560、LCD、控制按键AbstractWith the rapid development of science and technology in recent years, the application of SCM is a growing, while driving more traditional control detection technology updates. In real-time detection and automatic control of microcomputer application system, the microcontroller is often used as a core component, but only SCM knowledge is not enough, the structure should be based on specific hardware, software and hardware combination to be improved.Calculator in people's daily lives is one of the more common electronic products, and progress in speech technology to such applications need to provide a strong technical support, have been gradually accepted by the majority of users, and is widely used for various needs Voice response applications. Based on this concept, this design is AT89C51 microcontroller, LCD display, control buttons, voice chip ISD2560 devices designed for the voice broadcast function with a simple calculator. Familiar with using this microcontroller design and C language programming microcontrollers, resources and all of its chip I / O port functions and basic use of the understanding. Master the Microsoft Visual C + + 6.0 application development environment, the common use of LCD displays and general use of the keyboard.Keywords: AT89C51、ISD2560 、LCD control buttons目录摘要 (I)Abstract (II)引言 (1)1 绪论 (2)1.1 系统开发背景 (2)1.2 系统开发意义 (2)1.3 设计内容和章节分配 (2)2 系统方案设计 (3)2.1 功能介绍 (3)2.1.1 基本功能 (3)2.1.2 扩展功能 (3)2.2 方案论证与比较 (3)2.2.1 控制部分的设计方案论证与选择 (3)2.2.2 显示电路的设计方案论证与选择 (4)2.2.3 键盘设计方案与选择 (5)2.3 系统组成 (6)2.4 总体设计思想 (7)3 主要芯片介绍 (8)3.1 AT89C51选择及介绍: (8)3.2 ISD2560选择及介绍: (10)3.3 开发工具的选择及介绍: (12)4 硬件电路设计 (14)4.1 复位电路 (14)4.2 时钟电路 (14)4.3 显示电路 (15)4.4 语音电路 (15)4.5 按键电路 (17)5 软件设计 (20)5.1 AT89C51单片机中断允许控制 (20)5.2 LCD1602控制 (20)5.2.1 LCD1602字符发生存储器(CGROM) (20)5.2.2 LCD1602显示数据寄存器(DDRAM) (21)5.3 计算器软件设计 (23)5.3.1 系统总流程图 (23)5.3.2 算术运算程序设计 (24)5.3.3 按键程序设计 (25)5.3.4 显示程序设计 (25)5.3.5 错误处理及提示程序设计 (25)5.4 语音播报软件设计 (26)5.4.1 分段录放音 (27)5.4.2 程序流程图 (27)5.5 仿真与调试 (30)5.5.1 KEIL uVision调试 (30)5.5.2 Proteus 对于本设计的仿真 (33)结论 (35)致谢 (36)参考文献 (37)附录 (38)附录A (38)附录B (39)附录C (40)附录D (41)附录E (50)引言当今社会,随着人们物质生活的不断提高,电子产品已经走进了家家户户,无论是生活或学习,还是娱乐和消遣几乎样样都离不开电子产品,大型复杂的计算能力是人脑所不能胜任的,而且比较容易出错。
基于C51的万年历语音温度计的设计汪桂珍(宿迁泽达职业技术学院江苏宿迁223800)【摘要】:本文阐述了由单片机AT89C2051控制I2C按键扫描与数码管驱动芯片ZLG7290、I2C万年历芯片PCF8563、1-Wire数字温度传感器DS18B20、语音芯片ZY1420A实现万年历显示的语音温度计的方案,并给出了电路原理图。
【关键词】:单片机;I2C总线;万年历PCF8563;1-Wire总线;DS18B20;语音控制;数字温度计;自INTEL公司的MCS-51系列单片机问世以来,单片机以其体积小、集成度高、应用灵活、运行可靠、价格低廉等特点,在工业控制、工业测量、家用电器、智能仪器仪表、安全系统、信息系统、通信等诸多领域具有广泛的用途。
本文论述了一种多功能的温度计的实现方案。
1、系统功能及硬件设计万年历语音温度计具有年、月、日、小时、分钟、秒的显示和当前环境温度的显示及温度语音提示功能,成品体积小巧,可置于室内或随身携带。
当系统运行时,数码管显示时间(时/分/秒),按下K1键数码管显示日期(年/月/日),K1键负责时间和日期的显示切换,按下K2键显示当前温度,并有语音播报当前温度。
51单片机AT89C2051在工业生产控制、智能仪表、信息家电等诸多领域中都有着广泛的应用,AT89C2051引脚只有20个,适用于并不需要较多端口的场合,万年历语音温度计中单片机与外围器件都是采用串行通信,一共所需要的端口只有13个,所以选用只有20个引脚的AT89C2051单片机。
万年历语音温度计共有四大功能模块组成:温度采集模块(核心芯片DS18B20)、时钟/日期模块(核心芯片PCF8563)、按键与数码显示模块(核心芯片ZLG7290)、语音模块(核心芯片ISD1402)。
1.1温度采集模块DALLAS公司生产的1-Wire(即单总线器件)DS18B20数字温度计负责温度的采集。
DS18B20的DQ引脚连单片机的P3.3引脚。
基于单⽚机的语⾳播报万⽤表设计基于单⽚机的语⾳播报万⽤表设计随着语⾳技术的发展,在数字万⽤表中增加语⾳播报功能,将为测量提供⽅便.系统采⽤单⽚机对⾼精度A/D转换模块对参数的测量提⾼了万⽤表测量精度,以LCD12864为显⽰模块加强数据显⽰,同时增加ISD4003作为语⾳播报芯⽚进⾏测量参数进⾏播报,实现了万⽤表数值的精确显⽰及播报,进⼀步提⾼万⽤表的实⽤性.1.引⾔万⽤表是⼀种最常⽤的电⼯测量仪表,⽬前主要使⽤的有两种,即模拟以指针万⽤表和数字式万⽤表.这两种万⽤表使⽤时存在⼀个共同的问题,就是测量时必须⽤眼睛观看被测点和刻度盘或数据显⽰屏,容易造成在观测测量结果时表笔脱离被测点,或者造成表笔⾦属极在相邻电路上短路.随着语⾳技术的发展,在数字万⽤表中增加语⾳播报功能,为万⽤表使⽤性能的实质性进步开辟了⼀条新的途径,有了语⾳播报数值功能,可以告诉测量数值和单位准确的确认读数的结果,⼤⼤减少读数出错的可能.不仅如此,本设计通过⾼精度A/D转换,提⾼万⽤表的测量精度,对其他电⼦仪器的改进有着重要的意义.2.系统硬件设计2.1 系统设计框图语⾳播报万⽤表,最主要⽬的是对万⽤表测得数值进⾏显⽰和播放.系统采⽤模块结构设计,主要由微处理器模块.万⽤表测量电路.⾼精度A/D电路.语⾳电路.显⽰电路以及按键电路模块组成,整体框图如图1所⽰.在图1 中,系统微处理器处理器采⽤AT89S52,它是⼀种低功耗.⾼性能CMOS8位微控制器,具有8K在系统可编程Flash存储器,使得AT89S52为众多嵌⼊式控制应⽤系统提供⾼灵活.超有效的解决⽅案.万⽤表测量电路将各种测量值转化为电压信号,在通过⾼精度A/D电路将模拟信号转换为数字信号传送给单⽚机,再由单⽚机进⾏算法处理后输出到显⽰电路,LCD显⽰测得的电压值,语⾳播放电路根据单⽚机算法运算后寻找存储该数值对应的语⾳信号进⾏播报.2.2 ⾼精度A/D转换模块万⽤表的实现采⽤将各种测量数值转化为直流电压值,再将直流电压值通过⾼精度A/D转换为数字信号,进⼊单⽚机进⾏处理及输出.提⾼万⽤表精度的电压表的核⼼提⾼A/D转换的精度,系统采⽤16位A/D转换器AD7705将模拟电压转换为对应的数字量,并送⼊单⽚机,单⽚机对该数字量进⾏规格化处理.AD7705是16位AD转换器,外接晶体振荡器.精密基准源和少量去耦电容,即可连续进⾏AD转换.它采⽤了Σ-Δ技术,可以获得16位⽆误码数据输出.AD7705采⽤的三线串⾏接⼝,能够⽅便地与各种微控制器连接,也⽐并⾏接⼝⽅式⼤⼤节省了CPU的IO⼝[3]?采⽤AT89S52控制AD7705,对桥式传感信号进⾏模数转换,能直接将传感器测量到的微⼩信号进⾏AD转换.该器件还具有⾼分辨率.宽动态范围.⾃校准.优良的抗噪声性能以及低电压低功耗等特点,⾮常适合仪表测量.采⽤16位A/D可将测量电压值精度根据数字信号±1的误差,数据输出公式为,1/65535*5V=0.00007V,也就是说在不改变电压量程时,可达到0.1mV的精度.单⽚机与A/D转换的连接如图2所⽰.2.3 万⽤表测量模块万⽤表测量范围包括直流电压.交流电压.直流电流.交流电流.电阻及电容等参数.为了扩⼤万⽤表的测量范围,增加电阻分流.分压等功能,该部分设计原理基本相同,本设计未作改进.在交直流转换及电阻测量⽅⾯的设计进⾏改进,提⾼测量稳定性.数字万⽤表中交流电压测量电路是在直流电压测量电路的基础上,在分压器或分流器之后加⼊⼀级交流-直流(AC-DC)变换器形成的,主要由集成运算放⼤器.整流⼆极管.RC滤波器等组成,还包含⼀个能调整输出电压⾼低的电位器,⽤来对交流电压进⾏校准之⽤,如图3为所⽰.系统中的电阻档采⽤的是⽐例测量法,由稳压管ZD提供测量基准电压,流过标准电阻0 R和被测电阻X R 的电流基本相等.所以A/D转换器的参考电压RFE U 和输⼊电压IN U 有如下关系:其电路如图4所⽰.2.4 显⽰电路模块为了能够更好的现实各种数字和符号,采⽤了12864LCD显⽰器等组成显⽰模块.AT89S52通过将电压信号的⼆进制值进⾏算法转换后的数值通过IO⼝输出到LCD显⽰实时数值,电路如图5所⽰.2.5 语⾳播放模块语⾳模块采⽤ISD4003语⾳录放芯⽚,是美国ISD公司推出的产品.该系列语⾳芯⽚采⽤多电平直接模拟存储专利技术,声⾳不需要A/D转换和压缩,每个采样值直接存储在⽚内的闪烁存储器中.ISD4003语⾳芯⽚采⽤CMOS技术,内含晶体振荡器.防混叠滤波器.平滑滤波器.⾃动静噪.⾳频功率放⼤器及⾼密度多电平闪烁存储陈列等,因此只需很少的外围器件就可构成⼀个完整的声⾳录放系统.芯⽚设计是基于所有操作由微控制器控制,操作命令通过串⾏通信接⼝送⼊.采样频率可为4.0Hz、5.3Hz、6.4Hz、8.0kHz,频率越低,单⽚录放语⾳时间8~16min.语⾳录放模块电路主要由L M 3 8 6功放电路.isd4003语⾳电路组成.LM386功放电路在放⾳电路中,输出端选⽤低电压通⽤集成功率放⼤器作为扬声器的驱动电路.isd4003语⾳电路,录⾳时通过外部按键控制录⾳的开始和停⽌.录完后,每段语⾳信号都存储在⼀个不同的地址段,播放的时候,只要找到该段语⾳的起始地址就能播放出相应的语⾳信号,语⾳录放电路如图6所⽰.3.软件设计万⽤表开启时进⼊测量及显⽰状态,并将显⽰的数值及对应的测量范围进⾏数字播报,主程序流程图如图7所⽰.语⾳播报程序设计将根据AD采集的电压信号进⾏算法转换后的数值寻找存储在语⾳芯⽚中的语⾳信息.每段语⾳都有⼀个不同的存储地址,要播放相应的语⾳信息,只要找到该语⾳信号的存储地址即可.流程图如图8所⽰.4.结论通过采⽤了⾼精度A/D转换模块对参数的测量提⾼了万⽤表测量精度,同时采⽤12864显⽰及语⾳播报芯⽚将通过语⾳和显⽰多种⼈机交互⽅式为测量提供⽅便,将进⼀步提⾼万⽤表的实⽤性.因此具有⾃动语⾳播报数值功能的语⾳万⽤表,会有较⼤的需求,设计具有较好的应⽤前景.。
基于89C51单片机的语音播报伏特表传统的伏特表在我们的日常生活及科学研究中起到了其独特的作用,但是在科学技术日新月异、集成芯片在日常生活中的应用越来越广泛的今天显得比较落伍:①它们的量程往往在出厂以前就限定好的,不能根据具体使用场合进行相应调整;②测量精度有限;③不能够将测量结果用语音播放出来。
本文将介绍一种由单片机最小系统、模-数转换电路、语音电路、LED显示电路组成的单片机式语音播报伏特表。
1、硬件设计整个系统的组成可以分成四大部分:单片机、模-数转换电路、语音电路、LED显示电路。
下面就主要的部分进行具体介绍。
1.1、单片机目前流行的单片机很多,其中89C51自带有片内ROM和一定数量的RAM,一般不需要扩展片外的存储器,并且能和MCS—51产品兼容。
本设计选择89C51单片机,如下图所示:图1 89C51单片机本设计选用简单基本的经典复位电路,它利用电容和电阻的充放电来产生一个达到时间要求的连续低电压,并输入到单片机的复位管脚。
1.2、模-数转换电路模-数转换选择8位的ADC即AD0809,模块分布如图 1-2,测量范围由REF(-)和REF(+)接的电压决定,使用的时候可以根据具体的需求更改测量量程。
工作原理如下:首先,地址控制模块中,由单片机送来“通道控制信号”选择我们所需要的通道,随后ALE信号锁定该通道。
此时,外界的模拟输入就可以通过“模拟输入开关”进入AD转换器。
这时,只要START信号一有效马上就开始进行AD转换。
AD转换的过程其实就是一个“和参考电压比较,逐次逼近”的过程。
由“256电阻阶梯”模块提供参考电压,并在“开关阵列”的控制下,和输入进行比较,直到在“S.A.R.”模块中得到一个比较精确的数字化输出值,这时由“控制/定时模块”发送EOC信号通知外部AD转换完毕。
唐山工业职业技术学院毕业设计说明书设计题目:单片机控制的语音录放器学生姓名:**08应电11专业:应用电子技术设计指导教师___于东东 __________ _ 设计辅导教师____于东东____ ________ _(完成日期) 2011 年 4 月 12 日前言随着人类社会的不断进步,随着语音芯片的普及,语音录放被广泛应用于车站报站器,语音型数字万用表,出租车语音报站器,排队机等,并且面向家庭个人使用的方向发展,更加人性化。
随着电子技术的广泛应用,其自动化程度越来越高,使用范围越来越广,前景十分喜人。
自动语音提示技术是计算机语音处理技术的一种应用,属于语音再生合成技术范畴。
录放系统具有电路简明、应用方便、单片录放、不怕掉电、音色纯正、性价比高等特性,与此相关的语音系统已广泛地用于通信、工控、医疗、报警示讯等领域。
同时,随着大规模语音处理集成电路的发展,在传统的控制领域,语音提示的应用也越来越广泛。
语音是人类最自然、方便、快捷的交流方式,让人和机器能够通过自然语音进行交流是人们长期以来的梦想。
随着单片机的技术的日益发展,人们已经不再满足于键盘输入,屏显输出这样传统的输入/输出方式,希望拥有更友好的人机界面,更便捷的操作方式。
具有语音功能的单片机系统于是应运而生,而且得到了广泛的应用。
近年来计算机在各行业的日益普及应用,给各行业带来了崭新的面貌。
与此同时用户逐步对各种计算机应用系统提出了更高的要求,他们希望自己的系统有更高的自动化程度和更方便的人机界面。
语音技术的进展给这种应用需要提供了一种有力的技术支持,逐渐被广大用户所接受,并广泛用于各种需要语音响应的场合。
智能仪器、仪表、监控设备、工业控制系统等都有这种需求。
所以研究语音录放器对生产,生活都有极其重要的意义。
语音芯片的发展是极其迅速的,语音IC有很多种类,随着技术的发展,新产品不断涌现,原来可望而不可及的昂贵品种也能进入廉价的市场领域,原来设计控制都极为复杂的品种也随着集成技术的发展变得非常简单,因此,语音IC领域充满了生机和活力。
基于51单片机可语音播放万用表的设计
伴随着工业科技的不断进步,社会蓬勃发展已愈发迅速。
在各个领域都致力于提高生产的工作效率和提升产品的品质性能的大环境下,电子测量领域也尤为突出,紧跟新兴技术的步伐,不断进行革新和发展。
作为基础测量仪器的数字万用表用途广泛,其基本测量功能就包括交直流电压、交直流电流、电阻、频率等。
并不断推广到日常测量的方方面面。
但国内生产的数字万用表产品因为技术原因构造简单、功能单一、智能度低,不能满足消费者的需求。
因此,本设计以语音播报为切入点,提出一种高效率、智能化、抗干扰能力强的基于51单片机可语音播放万用表的设计。
标签:数字万用表;STC89C52;语音播报;LCD显示
在当今科学技术日新月异的大爆炸时代,各种新型电子产品出现在市面上,极大地便利了我们的日常生活,提高了工作效率,提升了生活品质。
但伴随的问题也屡见不鲜,所以电子产品需要经过相关测试仪器的合格检测才能投放到市场。
而且当电子产品出现故障需要检测维修时,也需要使用测量仪器。
因此,尽快研制先进的测量仪器成为电子行业进程中的重中之重。
目前,数字万用表由于数显、检测及集成电路技术的高速发展,逐渐趋向小物理尺寸化、数字化、智能化、操作简易化。
而且在数字万用表中添加语音播放功能,也为万用表在使用性能方面实质性的开辟了一条新路径。
拥有了语音播放数值功能后,可以得到被测量数值和单位的准确读取结果,大大减少读数出错的可能性,降低了使用者的上手难度,变得更加简易快捷。
所以对可语音播放万用表的研究,在电子测量领域中意义重大。
1 系统总体结构
本系统主要由STC89C52主控制器模块、测量电路模块、A/D转换模块、按键控制电路模块、语音播放模块和LCD液晶显示模块组成。
2 系统硬件电路设计
测量电路:本模块是由转换開关和电压、电流、电阻测量电路组成。
通过转换开关可以选择测电压、电流或电阻。
直流电压测量电路由电阻分压电路和表头构成,通过改变串联的分压电阻的阻值而改变其量程,将基本量程200mV的量程扩展为三量程的直流电压档。
而直流电流测量电路由基本表和起双向限幅过压保护作用的运放器构成,组成基本量程200mA的三量程的直流电流档。
电阻测量电路采用TL431稳压管调节电压来测量电阻,通过TL431达到可控精密稳压,代替稳压二极管,构成多量程的电阻测量电路。
按键控制电路:采用独立按键,三个按键与单片机接口P3 、P3 、P3 相连。
按键S3是进行模式调选,包括:电压voltage、电流current、电阻resistan 的调选。
而另外两个按键S4和S5则控制量程的选择,即“量程+”一档和“量程-”
一档。
A/D转换电路:采用高精度、差分输入A/D转换芯片MCP3421。
具有4种模式的PGA增益,将模拟信号进行放大,之后再进行转化。
SCL接口串行时钟输入为高电平时,开始进行读写指令。
本设计选择连续转换模式,即每隔500ms 读取。
即将被测量的模拟信号转化数字信号。
而与单片机相连的并联的电阻则是给负载提供电流,使输出显示高电平。
主控制器电路:以STC89C52单片机作为主控芯片,配以振荡电路和上电复位电路形成主控电路。
主要控制语音播放电路和LCD显示电路。
通过P0 、P0 将被测量A\D转化的数字信号和按键控制电路相连的P3 、P3 、P3 所选择IO口进行处理和语法判断被测信号是否超量程:(1)当没超量程时,单片机可通过P1 -P1 、P2 -P2 控制LCD液晶显示屏显示准确数值和单位,并且通过P3 -P3 口与语音播放电路相连控制其语音播放出相应提示;(2)当超过量程时,单片机则通过相对应的IO口使LCD显示和与语音播放已超量程的警告提示。
实现语音播放和液晶显示读数。
语音播报电路:该语音播放电路由JQ8400-fl语音芯片为核心。
其用途是通过与MCU相连的RX和TX进行信号指令串行的接收和发送,当接收到播放信号时,busy忙信号置于高电平有效,执行片内程序指令,开始语音播放。
显示电路:使用工业字符型液晶显示被测量的数值和单位。
液晶显示上下两行内容,每行显示4*4个字符,可显示数字字母特殊符号。
该4脚为ADDR0通过跳线帽与P1 相连,但该引脚为高电平时,液晶接受到的是数据,为低电平时,则接受的是命令。
5脚为读写选择段,用法相似,当高电平时读取数据或指令,而低电平则写入数据或指令。
当6脚置1时,表示LCD响应,开始实现液晶显示功能。
LCD液晶显示屏第一行左侧显示所选模式(voltage、current和resistan 三种模式),右侧显示所选量程。
第二行显示被测量的数值和单位。
3 软件设计
主程序包括了单片机处理数据程序、数模信号转换程序、LCD液晶显示程序和语音播放程序。
该设计重点是对被测量的进行A/D转换成数字信号,交由单片机处理,根据按键选择的合适量程,控制可视化显示和语音播报。
被测量数值超量程的话,会显示超量程提示,并语音播放出来。
程序流程图如图2所示。
4 结论
该设计由主控制器STC89C52、电压测量、电流测量、电阻测量电路及转换开关组成的测量电路、MCP3421A/D转换电路、语音播放JQ8400-if模块、LCD 液晶显示和独立按键组成。
该设计主要实现被测量数据的液晶显示和语音播放,使普通数字万用表成为一个“会讲话的万用表”。
让使用者眼看耳听双重确认结果,减少误读率,丰富测试过程中的趣味。
经测试,线电压有效值达到24V,频率为50Hz,实测精度为0.1,具有测量、显示功能以及智能语音播报功能。
设计
满足了基本要求和发挥要求。
所研制实物的整体电路结构简单、性能稳定、运行可靠。
参考文献
[1]沈骏,雒军,陈奎然,王槐诚.万用表辅助语音报档装置的设计[J].山东工业技术,2015(20).
[2]周艳.基于单片机的万用表设计[J].科技视界,2015(04):117-118.
[3]门宏.图解万用表测量技术与技巧[M].机械工业出版社,2014.
[4]孙立群.万用表使用从入门到精通[M].人民邮电出版社,2012.
[5]罗银波,高敬东,胡柏青,等.基于LabVIEW 的数字万用表设计与实现[J].科学技术与工程,2011(19):4592-4596。