您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 西安交大可报温报时电子钟设计报告
电子系统设计报告电气43陈振斌孙鹏程西安交通大学2017-5-201、整体系统框图2、系统工作原理基于单片机STC89C52与开发平台KEIL软件,利用C语言设计相关程序。期间配合使用DS1302时钟芯片实现走时功能,使用温度传感器件DS18B20实现室温测量功能,使用ISD1760语音芯片实现录放音功能以及配合动态显示数码将相关功能以可视形式呈现,并通过按键配合实现切换显示、校时、定闹等额外功能。3、软件框图时钟显示时钟校正日历显示日历校正温度显示定闹功能报时报温数码管闪烁S1键切换模式S2键切换显示整点闹钟提示S3、S4、S5键组合实现校正开始各变量及时钟、语音芯片初始化主程序循环S1、S2键执行模式及显示切换功能及S5确认/关闭闹钟功能温度显示循环(关闭定时器)整点报时报温定时中断部分循环程序时钟、日历显示模块时钟、日历校正及定闹模块(S3、S4、S5组合)闹钟提示(数码管闪烁)4、系统使用介绍:电路板上电后,初始状态数码管显示时钟;S1键切换模式,模式0为正常显示模式,模式1为校正模式,并且取决于按下按键之前显示部分依次进入:时钟校正、日历校正、闹钟定时模块;S2键切换显示,依次为:时钟、日历、温度;S3键在进入校正模式有效,用于选择校正位;S4键在进入校正模式有效,用于对当前校正位进行数值改变,即“加1”功能;S5键在校正模式时,用于确认校正,在闹钟闪烁时,按下可关闭闹钟;S6为电路板重置键,终止程序;RST键为语音芯片重置键,中断语音芯片工作。5、已知部分缺陷及非完美解决方案:问题描述:进入校正模式时,会出现数据读取错乱,使得数码显示0~9以外的数字,如A、B、C、D等;在确认校正时同样会有几率出现该问题。推测原因:DS1302走时程序中数据会有过渡性变化,使得display_buffer[]数组的数据在读取和置入时产生问题。或置数时有数据错误。解决方案:对显示错乱部分重新进行校时,该处将置零。此后可正常校正。6、软件编写与调试时所遇到的问题及解决方案:按键按下时程序多次执行:利用“miaomiao”系列变量作为判定条件保证只执行一次程序;对显示变量display_buffer直接进行加一操作进位产生错乱:引入buffer_temp[]数组,替代校正;语音芯片不能连续播放多段语音:每段播放后延时适当时间;为使得”on”、”off”的右下角显示小数点时对SEGMENT直接进行“位与”操作只能显示o8.”、”of8”.等:引入变量s过渡;整点报时会连续两次播放语音:只在分钟显示为“59”时使得miaomiao_play变量为一,播放后置为零,保证只播放一次;报温时可能读取到设定工作温度上限(39摄氏度)的温度值且实际此时温度在上限之内:在tmread()函数里增加循环读取部分直至读到正常数值;其他组组员(于晨曦同学)提出的建议与提示:温度读取时间较长不宜加入定时中断显示;每次显示前对位码或段码(取决于置数顺序)先置零,以解决数码管残影问题。7、PCB板原理图及接线图见验收文件夹PPT,由于打印问题在此不作展示。8、源程序代码#includeat89x52.h#includestdio.h#includeabsacc.h#includeintrins.h#defineSEGMENTXBYTE[0xdfff]#defineBIT_LEDXBYTE[0xbfff]#definefosc11.0592#definetime02500#defineuintunsignedint#defineSEGMENTXBYTE[0xdfff]#defineBIT_LEDXBYTE[0xbfff]//语音部分定义开始unsignedcharbdataSR0_L;unsignedcharbdataSR0_H;unsignedcharbdataSR1;unsignedcharAPCL=0,APCH=0;unsignedcharPlayAddL=0,PlayAddH=0;unsignedcharRecAddL=0,RedAddH=0;sbitCMD=SR0_L^0;sbitFULL=SR0_L^1;sbitPU=SR0_L^2;sbitEOM=SR0_L^3;sbitINTT=SR0_L^4;sbitRDY=SR1^0;sbitERASE=SR1^1;sbitPLAY=SR1^2;sbitREC=SR1^3;unsignedcharISD_SendData(unsignedchardat);voidISD_PU(void);voidISD_Rd_Status(void);voidISD_WR_APC2(unsignedcharapcdatl,apcdath);voidISD_SET_PLAY(unsignedcharSaddl,Saddh,Eaddl,Eaddh);sbitSS=P1^4;sbitSCK=P1^7;sbitMOSI=P1^5;sbitMISO=P1^6;voidISD_Init(void);voiddelay(unsignedintt);unsignedcharget_address(unsignedchark);//快速获取部分语音地址函数//语音部分定义结束//温度部分定义开始sbitTMDAT=P3^4;voiddmsec(unsignedintcount);voidtmreset(void);voidtmstart(void);voidtmdisplay(void);voidtmread(void);//温度读取函数unsignedchartmrtemp(void);unsignedcharcodeseg_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};unsignedcharcodetran_code[]={0,1,2,3,4,5,6,7,8,9};//类型转换数组unsignedcharlast;intlast_shi=2,last_ge=6;//温度部分定义结束//时间部分定义开始unsignedchardatadisplay_bit,display_buffer[8],display_buffer1[8],ring[8]={1,5,0,0,0,1,0,0};unsignedchardatatime0_h,time0_1,TEMP;unsignedintidatatime0_times;unsignedcharget_code(unsignedchari);voiddisplay(void);voidinitial_ds1302();unsignedcharread_ds1302(charcommand);voidopen_write_bit();voidclose_write_bit();voidread_time();voidset_time();voidreset_time();//校正确认功能函数voidread_date();sbitSCL_DS1302=P2^0;sbitIO_DS1302=P2^1;sbitRST_DS1302=P2^2;unsignedcharbdatadata_ds1302;sbitbit_data0=data_ds1302^0;sbitbit_data7=data_ds1302^7;unsignedcharbdatax;sbitx0=x^0;sbitx7=x^7;//时间部分定义结束//功能部分定义开始sbitkey1=P1^0;//切换功能unsignedcharmodecg;//工作模式指示变量sbitkey2=P1^1;//切换显示unsignedchardisplaycg;//切换显示指示变量sbitkey3=P1^2;//切换校正位unsignedchartime_ajflag;//时钟校正位指示变量unsignedchartime_bitadjust;//时钟校正位显示变量unsignedchardate_ajflag;//日历校正位指示变量unsignedchardate_bitadjust;//日历校正位显示变量unsignedcharring_ajflag;//闹钟校正位指示变量unsignedcharring_bitadjust;//闹钟校正位显示变量sbitkey4=P1^3;//加位键sbitkey5=P3^2;//确认或关闭闹钟键unsignedcharmiaomiao_1,miaomiao_2,miaomiao_3,miaomiao_4,miaomiao_5,miaomiao_play;//防止多次执行步骤指示变量unsignedcharj,s;//j为部分程序循环指示变量,s为为解决onoff的加小数点显示问题而定义的SEGMENT过渡变量inttime_t=400;//数码管闪烁计数变量unsignedcharbuffer_temp[8],play_adr[8],wendu_shi,wendu_ge;//分别为校正功能过渡变量数组、语音播报地址变量、温度十位类型过渡变量及温度个位类型过渡变量//功能部分定义结束main(){modecg=0;displaycg=0;BIT_LED=0;date_ajflag=0;ring_ajflag=0;time_ajflag=0;miaomiao_1=1;miaomiao_2=1;miaomiao_3=1;miaomiao_4=1;miaomiao_5=1;miaomiao_play=1;//以上为各新定义变量的初始化TEMP=TMOD;TEMP=TEMP&0XF0;TMOD=TEMP|0X01;time0_times=-time0*fosc/12;time0_h=(time0_times/256);time0_1=(time0_times%256);TH0=time0_h;TL0=time0_1;initial_ds1302();display_bit=0x01;display_buffer[5]=0x05;display_buffer[4]=0x03;display_buffer[3]=0x09;display_buffer[2]=0x05;display_buffer[1]=0x01;display_buffer[0]=0x02;display_buffer1[7]=0x06;display_buffer1[6]=0x00;display_buffer1[5]=0x05;display_buffer1[4]=0x00;display_buffer1[3]=0x07;display_buffer1[2]=0x01;display_buffer1[1]=0x00;display_buffer1[0]=0x02;set_time();ISD_Init();dmsec(1);tmread();TR0=EA=ET0=1;do{if(key1==0){if(miaomiao_1){modecg++;modecg=modecg%2;//切换工作模式:0:显示模式;1:校正、定闹模式miaomiao_1=0;if(displaycg==0&&modecg==1){for(j=0;j8;j++)buffer_temp[j]=display_buffer[j];}if(displaycg==2&&modecg==1){for(j=0;j8;j++)buffer_temp[j]=display_buffer1[j];}if(displaycg==1&&modecg==1){ET0=1;//从主程序的温度显示进入定时中断for(j=0;j8;j++)buffer_temp[j]=ring[j];}}}elsemiaomiao_1=1;if(key2==0){if(miaomiao_2){displaycg++;displaycg=displa
本文标题:西安交大可报温报时电子钟设计报告
链接地址:https://www.777doc.com/doc-5090375 .html