西安交大可報(bào)溫報(bào)時(shí)電子鐘設(shè)計(jì)報(bào)告_第1頁(yè)
西安交大可報(bào)溫報(bào)時(shí)電子鐘設(shè)計(jì)報(bào)告_第2頁(yè)
西安交大可報(bào)溫報(bào)時(shí)電子鐘設(shè)計(jì)報(bào)告_第3頁(yè)
西安交大可報(bào)溫報(bào)時(shí)電子鐘設(shè)計(jì)報(bào)告_第4頁(yè)
西安交大可報(bào)溫報(bào)時(shí)電子鐘設(shè)計(jì)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩28頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、電子系統(tǒng)設(shè)計(jì)報(bào)告電氣43 陳振斌 孫鵬程西安交通大學(xué)2017-5-20鬧鐘提示 1、 整體系統(tǒng)框圖S3、S4、S5鍵組合實(shí)現(xiàn)校正整點(diǎn)S2鍵切換顯示S1鍵切換模式數(shù)碼管閃爍報(bào)時(shí)報(bào)溫溫度顯示日歷校正定鬧功能日歷顯示時(shí)鐘顯示時(shí)鐘校正2、 系統(tǒng)工作原理基于單片機(jī)STC89C52與開發(fā)平臺(tái)KEIL軟件,利用C語(yǔ)言設(shè)計(jì)相關(guān)程序。期間配合使用DS1302時(shí)鐘芯片實(shí)現(xiàn)走時(shí)功能,使用溫度傳感器件DS18B20實(shí)現(xiàn)室溫測(cè)量功能,使用ISD1760語(yǔ)音芯片實(shí)現(xiàn)錄放音功能以及配合動(dòng)態(tài)顯示數(shù)碼將相關(guān)功能以可視形式呈現(xiàn),并通過(guò)按鍵配合實(shí)現(xiàn)切換顯示、校時(shí)、定鬧等額外功能。S1、S2鍵執(zhí)行模式及顯示切換功能及S5確認(rèn)/關(guān)閉鬧

2、鐘功能時(shí)鐘、日歷校正及定鬧模塊(S3、S4、S5組合)鬧鐘提示(數(shù)碼管閃爍)定時(shí)中斷部分循環(huán)程序主程序循環(huán)時(shí)鐘、日歷顯示模塊整點(diǎn)報(bào)時(shí)報(bào)溫功能溫度顯示循環(huán)(關(guān)閉定時(shí)器)3、 軟件框圖開始各變量及時(shí)鐘、語(yǔ)音芯片初始化 4、 系統(tǒng)使用介紹:電路板上電后,初始狀態(tài)數(shù)碼管顯示時(shí)鐘;S1鍵切換模式,模式0為正常顯示模式,模式1為校正模式,并且取決于按下按鍵之前顯示部分依次進(jìn)入:時(shí)鐘校正、日歷校正、鬧鐘定時(shí)模塊;S2鍵切換顯示,依次為:時(shí)鐘、日歷、溫度;S3鍵在進(jìn)入校正模式有效,用于選擇校正位;S4鍵在進(jìn)入校正模式有效,用于對(duì)當(dāng)前校正位進(jìn)行數(shù)值改變,即“加1”功能;S5鍵在校正模式時(shí),用于確認(rèn)校正,在鬧鐘閃

3、爍時(shí),按下可關(guān)閉鬧鐘;S6為電路板重置鍵,終止程序;RST鍵為語(yǔ)音芯片重置鍵,中斷語(yǔ)音芯片工作。5、 已知部分缺陷及非完美解決方案:?jiǎn)栴}描述:進(jìn)入校正模式時(shí),會(huì)出現(xiàn)數(shù)據(jù)讀取錯(cuò)亂,使得數(shù)碼顯示09以外的數(shù)字,如A、B、C、D等;在確認(rèn)校正時(shí)同樣會(huì)有幾率出現(xiàn)該問(wèn)題。推測(cè)原因:DS1302走時(shí)程序中數(shù)據(jù)會(huì)有過(guò)渡性變化,使得display_buffer數(shù)組的數(shù)據(jù)在讀取和置入時(shí)產(chǎn)生問(wèn)題?;蛑脭?shù)時(shí)有數(shù)據(jù)錯(cuò)誤。 解決方案:對(duì)顯示錯(cuò)亂部分重新進(jìn)行校時(shí),該處將置零。此后可正常校正。6、 軟件編寫與調(diào)試時(shí)所遇到的問(wèn)題及解決方案:l 按鍵按下時(shí)程序多次執(zhí)行:利用“miaomiao”系列變量作為判定條件保證只執(zhí)行一次

4、程序;l 對(duì)顯示變量display_buffer直接進(jìn)行加一操作進(jìn)位產(chǎn)生錯(cuò)亂:引入buffer_temp數(shù)組,替代校正;l 語(yǔ)音芯片不能連續(xù)播放多段語(yǔ)音:每段播放后延時(shí)適當(dāng)時(shí)間;l 為使得”on”、” off” 的右下角顯示小數(shù)點(diǎn)時(shí)對(duì)SEGMENT直接進(jìn)行“位與”操作只能顯示o8.”、” of8”. 等:引入變量s過(guò)渡;l 整點(diǎn)報(bào)時(shí)會(huì)連續(xù)兩次播放語(yǔ)音:只在分鐘顯示為“59”時(shí)使得miaomiao_play變量為一,播放后置為零,保證只播放一次;l 報(bào)溫時(shí)可能讀取到設(shè)定工作溫度上限(39攝氏度)的溫度值且實(shí)際此時(shí)溫度在上限之內(nèi):在tmread()函數(shù)里增加循環(huán)讀取部分直至讀到正常數(shù)值;l 其他組

5、組員(于晨曦同學(xué))提出的建議與提示:溫度讀取時(shí)間較長(zhǎng)不宜加入定時(shí)中斷顯示;每次顯示前對(duì)位碼或段碼(取決于置數(shù)順序)先置零,以解決數(shù)碼管殘影問(wèn)題。7、 PCB板原理圖及接線圖見驗(yàn)收文件夾PPT,由于打印問(wèn)題在此不作展示。8、 源程序代碼#include #include #include #include #define SEGMENT XBYTE0xdfff#define BIT_LED XBYTE0xbfff#define fosc 11.0592#define time0 2500#define uint unsigned int#define SEGMENT XBYTE0xdfff#de

6、fine BIT_LED XBYTE0xbfff/語(yǔ)音部分定義開始unsigned char bdata SR0_L;unsigned char bdata SR0_H;unsigned char bdata SR1;unsigned char APCL=0,APCH=0;unsigned char PlayAddL=0,PlayAddH=0;unsigned char RecAddL=0,RedAddH=0;sbit CMD=SR0_L0;sbit FULL=SR0_L1;sbit PU=SR0_L2;sbit EOM=SR0_L3;sbit INTT=SR0_L4;sbit RDY=SR1

7、0;sbit ERASE=SR11;sbit PLAY=SR12;sbit REC=SR13;unsigned char ISD_SendData(unsigned char dat);void ISD_PU(void);void ISD_Rd_Status(void);void ISD_WR_APC2(unsigned char apcdatl,apcdath);void ISD_SET_PLAY(unsigned char Saddl,Saddh,Eaddl,Eaddh);sbit SS=P14;sbit SCK=P17;sbit MOSI=P15;sbit MISO=P16;void I

8、SD_Init(void);void delay(unsigned int t);unsigned char get_address(unsigned char k);/快速獲取部分語(yǔ)音地址函數(shù)/語(yǔ)音部分定義結(jié)束/溫度部分定義開始sbit TMDAT=P34;void dmsec(unsigned int count);void tmreset(void);void tmstart(void);void tmdisplay(void);void tmread(void);/溫度讀取函數(shù)unsigned char tmrtemp(void);unsigned char code seg_code

9、=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00;unsigned char code tran_code=0,1,2,3,4,5,6,7,8,9; /類型轉(zhuǎn)換數(shù)組unsigned char last;int last_shi=2,last_ge=6;/溫度部分定義結(jié)束/時(shí)間部分定義開始unsigned char data display_bit,display_buffer8,display_buffer18,ring8=1,5,0,0,0,1,0,0;unsigned

10、char data time0_h,time0_1,TEMP;unsigned int idata time0_times;unsigned char get_code(unsigned char i);void display(void);void initial_ds1302();unsigned char read_ds1302(char command);void open_write_bit();void close_write_bit();void read_time();void set_time();void reset_time();/校正確認(rèn)功能函數(shù)void read_da

11、te();sbit SCL_DS1302=P20;sbit IO_DS1302=P21;sbit RST_DS1302=P22;unsigned char bdata data_ds1302;sbit bit_data0=data_ds13020;sbit bit_data7=data_ds13027;unsigned char bdata x;sbit x0=x0;sbit x7=x7;/時(shí)間部分定義結(jié)束/功能部分定義開始sbit key1=P10;/切換功能unsigned char modecg;/工作模式指示變量sbit key2=P11;/切換顯示unsigned char disp

12、laycg;/切換顯示指示變量sbit key3=P12;/切換校正位unsigned char time_ajflag;/時(shí)鐘校正位指示變量unsigned char time_bitadjust;/時(shí)鐘校正位顯示變量unsigned char date_ajflag;/日歷校正位指示變量unsigned char date_bitadjust;/日歷校正位顯示變量unsigned char ring_ajflag;/鬧鐘校正位指示變量unsigned char ring_bitadjust;/鬧鐘校正位顯示變量sbit key4=P13;/加位鍵sbit key5=P32;/確認(rèn)或關(guān)閉鬧鐘

13、鍵unsigned char miaomiao_1,miaomiao_2,miaomiao_3,miaomiao_4,miaomiao_5,miaomiao_play;/防止多次執(zhí)行步驟指示變量unsigned char j,s;/j為部分程序循環(huán)指示變量,s為為解決on off的加小數(shù)點(diǎn)顯示問(wèn)題而定義的SEGMENT過(guò)渡變量int time_t=400;/數(shù)碼管閃爍計(jì)數(shù)變量unsigned char buffer_temp8,play_adr8,wendu_shi,wendu_ge;/分別為校正功能過(guò)渡變量數(shù)組、語(yǔ)音播報(bào)地址變量、溫度十位類型過(guò)渡變量及溫度個(gè)位類型過(guò)渡變量/功能部分定義結(jié)束m

14、ain() 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_t

15、imes%256); TH0=time0_h;TL0=time0_1; initial_ds1302(); display_bit=0x01; display_buffer5=0x05; display_buffer4=0x03; display_buffer3=0x09; display_buffer2=0x05; display_buffer1=0x01; display_buffer0=0x02; display_buffer17=0x06; display_buffer16=0x00; display_buffer15=0x05; display_buffer14=0x00; disp

16、lay_buffer13=0x07; display_buffer12=0x01; display_buffer11=0x00; display_buffer10=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_tempj=display_b

17、ufferj;if(displaycg=2&modecg=1) for(j=0;j8;j+) buffer_tempj=display_buffer1j;if(displaycg=1&modecg=1) ET0=1;/從主程序的溫度顯示進(jìn)入定時(shí)中斷 for(j=0;j8;j+) buffer_tempj=ringj; else miaomiao_1=1; if(key2=0) if(miaomiao_2) displaycg+;displaycg=displaycg%3;/切換顯示部分:0:時(shí)鐘;1:溫度/定鬧;2:日歷 miaomiao_2=0;if(displaycg=0&modecg=1

18、) for(j=0;j8;j+) buffer_tempj=display_bufferj;/每次切換對(duì)buffer_temp賦予當(dāng)前的變量值if(displaycg=2&modecg=1) for(j=0;j8;j+) buffer_tempj=display_buffer1j; if(displaycg=1&modecg=1) for(j=0;j200) BIT_LED=0x00; SEGMENT=0x00; time_t-; else display(); time_t-;if(time_t=0) time_t=400; else display(); /時(shí)間部分開始unsigned c

19、har get_code(unsigned char i) unsigned char p; switch(i) case 0: p=0x3F; break; case 1: p=0x06; break; case 2: p=0x5B; break; case 3: p=0x4F; break; case 4: p=0x66; break; case 5: p=0x6D; break; case 6: p=0x7D; break; case 7: p=0x07; break; case 8: p=0x7F; break; case 9: p=0x67; break; case 10: p=0x

20、77; break; case 11: p=0x7C; break; case 12: p=0x39; break; case 13: p=0x5E; break; case 14: p=0x79; break; case 15: p=0x71; break; default: break; return(p);unsigned char get_address(unsigned char k) unsigned char p; switch(k) case 0x00: p=1; break; case 0x01: p=7; break; case 0x02: p=13; break; cas

21、e 0x03: p=19; break; case 0x04: p=25; break; case 0x05: p=31; break; case 0x06: p=37; break; case 0x07: p=43; break; case 0x08: p=49; break; case 0x09: p=55; break; default: break; return(p);void display(void) unsigned char i; /由于時(shí)鐘和日歷部分顯示差別,故使用不同的display_bit與i的對(duì)應(yīng)函數(shù) if(displaycg=2) switch(display_bi

22、t) case 1: i=0; break; case 2: i=1; break; case 4: i=2; break; case 8: i=3; break; case 16: i=4; break; case 32: i=5; break; case 64: i=6; break; case 128: i=7; break; default: break; else switch(display_bit) case 1: i=0; break; case 2: i=1; break; case 4: i=2; break; case 8: i=2; break; case 16: i=

23、3; break; case 32: i=3; break; case 64: i=4; break; case 128: i=5; break; default: break; /時(shí)鐘顯示開始 if(modecg=0&displaycg=0) BIT_LED=0;/每次顯示對(duì)位碼置零,以消除顯示殘影問(wèn)題,下同 if(display_bit=0x04|display_bit=0x20) SEGMENT=0x40; /此為時(shí)鐘顯示時(shí)加“-”的判定 else SEGMENT=get_code(display_bufferi); BIT_LED=display_bit; if(display_bit

24、=64) display_bit=display_bit*2; else display_bit=0x01; /時(shí)鐘顯示結(jié)束/日歷顯示開始if(modecg=0&displaycg=2) BIT_LED=0; SEGMENT=get_code(display_buffer1i); BIT_LED=display_bit; if(display_bit0x09) buffer_temp3=0x00; buffer_temp2+; if(buffer_temp25) buffer_temp2=0; if(time_bitadjust=0x02) buffer_temp1+;if(buffer_te

25、mp10x09) buffer_temp1=0x00; buffer_temp0+; if(buffer_temp0=2&buffer_temp13)|(buffer_temp02)/如此判定條件是為了消除從display_buffer中讀取到的buffer_temp可能得到超出范圍數(shù)字的bug,下同 buffer_temp0=0; buffer_temp1=0; miaomiao_4=0; else miaomiao_4=1; BIT_LED=0; if(display_bit=0x04|display_bit=0x20) SEGMENT=0x40; else if(display_bit=

26、time_bitadjust) SEGMENT=get_code(buffer_tempi)+0x80;/被選擇到的校正位右下角小數(shù)點(diǎn)開啟顯示else SEGMENT=get_code(buffer_tempi); BIT_LED=display_bit; if(display_bit0x09) buffer_temp7=0x00; buffer_temp6+; if(buffer_temp6=3&buffer_temp71)|(buffer_temp6)3) buffer_temp6=0; buffer_temp7=1; if(date_bitadjust=0x20) buffer_temp

27、5+;if(buffer_temp50x09) buffer_temp5=0x00; buffer_temp4+; if(buffer_temp4=1&buffer_temp52)|(buffer_temp41) buffer_temp5=1; buffer_temp4=0; if(date_bitadjust=0x08) buffer_temp3+;if(buffer_temp30x09) buffer_temp3=0x00; if(date_bitadjust=0x04) buffer_temp2+;if(buffer_temp20x09) buffer_temp2=0x00; miaom

28、iao_4=0; else miaomiao_4=1; BIT_LED=0; if(display_bit=date_bitadjust) SEGMENT=get_code(buffer_tempi)+0x80;else SEGMENT=get_code(buffer_tempi); BIT_LED=display_bit; if(display_bit0x09) buffer_temp3=0x00; buffer_temp2+; if(buffer_temp25) buffer_temp2=0; if(ring_bitadjust=0x02) buffer_temp1+;if(buffer_

29、temp10x09) buffer_temp1=0x00; buffer_temp0+; if(buffer_temp0=2&buffer_temp13)|(buffer_temp02) buffer_temp0=0; buffer_temp1=0; if(ring_bitadjust=0x80) buffer_temp5+;buffer_temp5=buffer_temp5%2; /對(duì)應(yīng)鬧鐘開關(guān)的指示變量ring5的切換,0為關(guān)閉,1為開啟; miaomiao_4=0; else miaomiao_4=1; BIT_LED=0; if(display_bit=0x04) s=0x40; el

30、se if(display_bit=0x20|display_bit=0x40|display_bit=0x80) if(buffer_temp5=0) if(display_bit=0x20) s=0x3F; if(display_bit=0x40) s=0x71; if(display_bit=0x80) s=0x71; else if(display_bit=0x20) s=0x00; if(display_bit=0x40) s=0x3F; if(display_bit=0x80) s=0x37; /on off 的顯示else s=get_code(buffer_tempi); if

31、(display_bit=ring_bitadjust) SEGMENT=s|0x80; else SEGMENT=s; BIT_LED=display_bit; if(display_bit=64) display_bit=display_bit*2; else display_bit=0x01; void close_write_bit() char i; SCL_DS1302=0; _nop_(); RST_DS1302=1; /_nop_(); _nop_(); data_ds1302=0x8e; for(i=1;i1; data_ds1302=0x80; IO_DS1302=0; for(i=1;i1; void open_write_bit() char i; SCL_DS1302=0; _nop_(); RST_DS1302=1; _nop_(); _nop_(); data_ds1302=0x8e; for(i=1;i1; data_ds1302=0x00; IO_DS1302=0; for(i=1;i1; voi

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論