隨著電子技術的發展,各種各樣的系統越來越接近自動化了,本系統設計一套采用智能升旗系統來代替人工的系統,并解決演奏速度不同步的問題,將使操作起來非常方便,能大大提高了質量和效率。
該系統以Atmel公司生產的AT89S52單片機為核心,利用ISD4004作為語音存儲芯片,實現長時間的存儲語音,利用MC3479驅動步進電機,準確完成
實驗效果表明:系統可全自動的實現升旗,同時完成語音播放,具有方便實用價值,具有一定經濟價值。
2系統方案設計 1
2.1 系統總體方案
2.2 系統功能介紹 2
2.3 主控芯片介紹 2
3 硬件系統設計 3
3.1硬件設計思路 3
3.2模塊電路設計 3
3.2.1顯示模塊 4
3.2.2語音模塊 5
3.2.3語音放大模塊
3.2.4電機驅動模塊 6
3.2.5電源模塊 7
3.2.6控制模塊 8
4 軟件系統的設計
4.1 軟件系統組成
4.2鍵盤顯示軟件設計
4.3步進電機程序設計 10
4.4語音程序設計 11
5 總結 12
附錄1系統原理圖 14
附錄2系統部分軟件 15
附錄3系統實物圖 19
本系統以Atmel公司生產的AT89S52單片機為核心,實現了在自動升旗過程,脫離了傳統的人工,只需控制按鍵就可以完成全過程,操作方便、快捷。系統功能齊全,既可當作實驗系統提供給學生用,如高校實驗室使用;又可添加部分硬件構成其他工業應用產品。系統可以實現室內外自動升旗、解決大家在操作時候帶來的不便,完成時菜單操作簡單。而且,我們在實際設計中還預留了很多的功能接口,以便于系統功能的擴展,如利用傳感器檢測環境變化實現自動化。因此,系統的使用性和多功能性得到了很好的體現。
2.1 系統總體方案 本系統的開發以為單片機為控制核心,綜合考慮了單片機的性能、系統成本及使用人群等方面的因素。同時也語音播放的效果,設計出一種經濟、實用且功能強大的升旗系統。系統由JTAG接口、語音回放、鍵盤、顯示、功率放大等模塊構成。系統框圖如圖2.1所示。
圖2.1 2.2 系統功能介紹 通過以上方案,系統能夠完成如下功能:鍵盤輸入,鍵盤是一個系統和外界交互的橋梁,鍵盤部分實現了鍵盤的控制的輸入;顯示,和鍵盤一樣,顯示模塊在人機交互時發揮著不可忽視的作用,該部分完成了單片機系統內部數據的輸出顯示;語音播放是升旗中不可缺少的部分,通過ISD4004實現語音的回放功能,由于系統的語音芯片輸出功率大小不夠,通過TDA2030語音放大模塊實現語音的放大,應用喇叭輸出;同時利用MC3479芯片驅動步進電機,實現自動升旗的效果,通過對步進電機的控制,可以準確的實現對高度的控制,通過對電機的計算可以實現對高度的測量,以便顯示當前的高度。
2.3 主控芯片介紹 本設計中用的單片機是Atmel公司生產的AT89S52單片機。它是一個低功耗,高性能CMOS 8位單片機,片內含4k Bytes ISP的可反復擦寫1000次的Flash只讀程序存儲器,器件采用Atmel公司的高密度、非易失性存儲技術制造,兼容標準MCS-51指令系統及80C51引腳結構,芯片內集成了通用8位中央處理器和ISP Flash存儲單元。AT89S52具有如下特點:40個引腳,4k Bytes Flash片內程序存儲器,128 bytes的隨機存取數據存儲器(RAM),32個外部雙向輸入/輸出(I/O)口,5個中斷優先級2層中斷嵌套中斷,2個16位可編程定時計數器,2個全雙工串行通信口,看門狗(WDT)電路,片內時鐘振蕩器。 此外,AT89S52設計和配置了振蕩頻率可為0Hz并可通過軟件設置省電模式。空閑模式下,CPU暫停工作,而RAM定時計數器,串行口,外中斷系統可繼續工作,掉電模式凍結振蕩器而保存RAM的數據,停止芯片其它功能直至外中斷激活或硬件復位。同時該芯片還具有PDIP、TQFP和PLCC等三種封裝形式,以適應不同產品的需求。
3 硬件系統設計 3.1硬件設計思路 為迎合本產品的設計目的,我們以Atmel公司廉價的AT89S51/52為核心,來構建一個廉價的自動控制系統。要求方便操作,所以本系統將采用按鍵操作,以實現操作簡單,為設計方便,用模塊化設計。設一塊主模塊,若干實驗子模塊,主模塊的引腳盡量由用接口引出,根據系統的要求,如果在主模塊上不方便實現,選用相應的子模塊與主模塊接上,進行實驗本系統要求要有明確的設計思路,不追求主模塊的全面性,考慮在主模塊上保留不占I/O口電路的同時,對不易于在主模塊上設計的電路部分按子模塊設計。這樣的設計能使電路更容易的升級,只要增加相應的電路子模塊即可。本系統的設計的創新點也在于此——追求系統的方便性。
3.2模塊電路設計 3.2.1 顯示模塊 鍵盤和顯示往往是一個控制系統的重要部分,同時也是最難做的一部分。在本系統中,為了節約端口,同時簡化程序編寫和保證系統工作的穩定性,我們采用了鍵盤和傳口輸入,并口輸出芯片74LS164,提供串人——并出的原理,其圖3.2.1如下:
圖3.2.1 3.2.2 語音模塊 系統采用語音回放芯片ISD4004, ISD4004系列工作電壓3V,單片錄放時間8至16分鐘,音質好,適用于移動電話及其他便攜式電子產品中。芯片采用CMOS技術,內含振蕩器、防混淆濾波器、平滑濾波器、音頻放大器、自動靜噪及高密度多電平閃爍存貯陣列。芯片設計是基于所有操作必須由微控制器控制,操作命令可通過串行通信接口(SPI或Microwire)送入。芯片采用多電平直接模擬量存儲技術, 每個采樣值直接存貯在片內閃爍存貯器中,因此能夠非常真實、自然地再現語音、音樂、音調和效果聲,避免了一般固體錄音電路因量化和壓縮造成的量化噪聲和"金屬聲"。采樣頻率可為 4.0,5.3,6.4,8.0kHz,頻率越低,錄放時間越長,而音質則有所下降,片內信息存于閃爍存貯器中,可在斷電情況下保存100年(典型值),反復錄音10萬次。下面對ISD4004的引腳說明:制輸入口依次為:SS,MOSI,MISO,RAC,INT,SCLK,VCC,GND。 片選(SS):此端為低,即向該ISD4004 芯片發送指令,兩條指令之間為高電平。 串行輸入(MOSI):此端為串行輸入端,主控制器應在串行時鐘上升沿之前半個周期將數據放到本端,供ISD 輸入。 串行輸出(MISO):ISD 的串行輸出端。ISD 未選中時,本端呈高阻態。 串行時鐘(SCLK):ISD 的時鐘輸入端,由主控制器產生,用于同步MOSI 和MISO 的數據傳輸。 數據在SCLK 上升沿鎖存到ISD,在下降沿移出ISD。 行地址時鐘(RAC):漏極開路輸出。每個RAC 周期表示ISD 存儲器的操作進行了一行(ISD4004系列中的存貯器共2400 行)。該信號保持高電平的時間為175ms,低電平時間為25ms。在快進模式,RAC 可保持高電平218.75μs,低電平31. 25μs。該端可用于存儲管理技術。 中斷(INT):本端為漏極開路輸出。ISD 在任何操作(包括快進)中檢測到EOM或IVF 時,本端變低并保持。中斷狀態在下一個SPI周期開始時清除。中斷狀態也可用RINT 指令讀取。 ISD的工作電壓是3V,模塊中加了分壓電路,電源輸入5V。 信號輸入有兩個端口,一個是MIC輸入,另一個是模擬信號直接輸入。模塊采用單端輸入,信號由耦合電容輸入,最大幅度為峰峰值32mV。 其原理圖3.2.2如下: 圖3.2.2
3.2.3 語音放大模塊 本系統采用語音放大芯片TDA2030,其原理如圖3.2.3所示下: 圖3.2.3 3.2.4 電機驅動模塊 系統采用MC3479來驅動步進電機,下面對MC3479的驅動模塊做如下說明,MC3479適用于驅動兩相電機(四線和六線,尤其適用于四線,),此模塊用于驅動我們實驗室兩相四線的42BYGH103電機。實驗室的六線電機還需要調整一下接線,并把兩個抽頭懸空。該芯片輸入端TTL和 CMOS 兼容。 P1_0輸出低電平時電機正轉,輸出高電平時反轉。P1_1輸出低電平時全步運行,高電平時半步運行。通過讀P1_2若為低電平可以知道電機運行到初始A相狀態。P1_3輸出阻抗選擇控制端(只在半步方式有效) , 輸入低電平時輸出端為高阻抗狀態, 輸入高電平時輸出端為低阻抗狀態。P1_7輸出一個高電平即可把電機置位到時A相初始狀態,就是復位。每次運行前最好先復位,以使運行更精確。在P1_7和6腳之間串聯的電阻可以確定芯片的輸出電流,其關系為。

我們的模塊中設置R=120K,即輸出電流為109mA。P1_5為時鐘輸入。全步狀態時,每個時鐘電機運行一步,最高頻率833Hz。半步狀態時,每個時鐘電機運行半步,最高頻率1250Hz。 應用中的注意點:
1、步進電機應用于低速場合---每分鐘轉速不超過1000轉,(0.9度時6666PPS),最好在1000-3000PPS(0.9度)間使用,可通過減速裝置使其在此間工作,此時電機工作效率高,噪音低。
2、步進電機最好不使用整步狀態,整步狀態時振動大。
3、由于歷史原因,只有標稱為12V電壓的電機使用12V外,其他電機的電壓值不是驅動電壓伏值,可根據驅動器選擇驅動電壓(建議:57BYG采用直流24V-36V,86BYG采用直流50V,110BYG采用高于直流80V),當然12伏的電壓除12V恒壓驅動外也可以采用其他驅動電源,不過要考慮溫升。
4、轉動慣量大的負載應選擇大機座號電機。
5、電機在較高速或大慣量負載時,一般不在工作速度起動,而采用逐漸升頻提速,一電機不失步,二可以減少噪音同時可以提高停止的定位精度。
6、高精度時,應通過機械減速、提高電機速度,或采用高細分數的驅動器來解決,也可以采用5相電機,不過其整個系統的價格較貴,生產廠家少,其被淘汰的說法是外行話。
7、電機不應在振動區內工作,如若必須可通過改變電壓、電流或加一些阻尼的解決。
8、電機在600PPS(0.9度)以下工作,應采用小電流、大電感、低電壓來驅動。 其原理圖如下: 圖3.2.4 3.2.5 電源模塊 由于系統需要不同的工作電壓,因此本系統利用多穩壓芯片來實現多電壓,首先通過L7812得到穩定的+12V輸出,經過濾波后輸入到L7805實現+5V電壓輸出,由于ISD4004工作在+3V電壓,所以系統經過LM317可調穩定輸出+3V電壓,其原理圖如下: 圖3.2.5 3.2.6 控制模塊 系統采用AT89S52作為控制模塊,該芯片前面已經做了詳細的說明,這里略到芯片的說明,其原理圖如下: 圖3.2.6
4 軟件系統的設計
4.1 軟件系統組成 通過應用C51程序設計的基本的語音和控制程序,各模塊源程序的程序設計如下模塊所示,各程序設計目的:基本I/O口實驗,通過單片機并口的輸入、輸出功能特點。中斷優先級等,實現對各系統的控制。鍵盤掃描,可以了解掃描操作。實現控制操作。語音控制程序采用先錄音再放音的原理。電機控制程序利用先對電機初始化,然后對電機實現轉速的控制。顯示程序,通過先計算出系統的轉數,然后轉化為高度,通過串口送數顯示。 所有程序均采用標準C語言編寫,并加入了適當的注釋,增強了程序的可讀性和可移殖性。
4.2 鍵盤顯示軟件設計 74LS164是一片具有串行接口輸入,并行接口輸出的芯片,通過從串口連續送8個數據,此時從并口輸出數據到數碼管顯示,其程序框圖如4.2.1下所示: 圖4.2.1
4.3 步進電機程序設計 系統通過對MC3479的操作來實現對電機控制,首先程序對MC3479初始化,將其對應的因腳置電位,讓電機先從A相位開始轉動。以便對轉數的計算,以二相反應式步進電機為例:它的定子上有二磁極,每一對磁極上繞著一相繞組,繞組通電時,這兩個磁極的極性相反;二相繞組接成星形,轉子鐵心及定子極靴上有小齒,定轉子齒距通常相等。轉子鐵心上沒有繞組,轉自的齒數為40,相鄰兩個齒之間夾角為9o。當某一相繞組通電時,由于定轉子上有齒和槽,所以當轉子齒的相對位置不同時,在磁場的作用下,轉子將轉動一個角度,使轉子和定子的齒相互對齊,這就是使步進電機旋轉的原因。 步進電機的運轉始由脈沖信號控制.通過改變各相通電的次序可以調整步進電機的運轉方向。如圖4.3.1為步進電機流程圖。 圖4.3.1步進電機程序流程圖
4.4 語音程序設計 系統采用先對ISD4004初始后,先從地址0000H開始錄音,持續一段時間后,根據控制操作實現放音操作,放音從開始錄音的地方,連續的播放,直到遇到停止操作,否則一直播放下去,直到最后一個錄音地址。其程序流圖如下: 圖4.4.1 5 總結此開發系統采用Atmel公司生產的AT89S52單片機為核心,通過語音與電機驅動與一體,結構逐步擴展功能模塊,采用分開設計,分開調試,然后再進行整機調試和整合的開發方式,成功的實現了各功能。雖然此系統在功能實現了智能升旗的作用,但開發系統還存在一些不足,如:沒有合理利用傳感器等。 總之,該實驗系統還是有許多可取之處的:結構簡單而功能豐富。 經過此次硬件系統的設計,不僅對所學專業知識鞏固和加深了一遍,更重要的是提高了自己的工程應用能力和科技論文撰寫水平,同時更加深刻體會到僅僅擁有理論知識是遠遠不夠的,只有在實踐中不斷探索,才能真正體會到理論的精華所在,只有將理論和實踐有機的結合起來,才能真正掌握知識。
單片機源程序:
- #include "reg51.h"
- #include "intrins.h"
-
- sbit _cs = P1^6;
- sbit _sclk= P1^5;
- sbit _mosi= P3^1;
- sbit _miso= P3^0;
- sbit _rac = P1^7;
- sbit _int = P3^2;
-
-
- void delay(unsigned int i) //延時程序
- {
- while(i--);
- }
-
- void stopmode() //停止
- {
- unsigned char m,i,j;
- _cs=1;
- _sclk=0;
- _cs=0;
-
- m=0x30;
- for(i=0;i<8;i++)
- {
- m=_cror_(m,1);
- j=m<<1;
- _mosi=CY;
- _sclk=0;
- _sclk=1;
- }
- _cs=1;
- }
- void powerdown() //下電
- {
- unsigned char m,i,j;
- _cs=1;
- _sclk=0;
- _cs=0;
-
- m=0x10;
- for(i=0;i<8;i++)
- {
- m=_cror_(m,1);
- j=m<<1;
- _mosi=CY;
- _sclk=0;
- _sclk=1;
- }
- _cs=1;
- }
-
- void powerup() //上電
- {
- unsigned char m,i,j;
- _cs=1;
- _sclk=0;
- _cs=0;
-
- m=0x20;
- for(i=0;i<8;i++)
- {
- m=_cror_(m,1);
- j=m<<1;
- _mosi=CY;
- _sclk=0;
- _sclk=1;
- }
- _cs=1;
- }
- void record4004(unsigned int address) //錄音 address--錄音地址 0---2400
- {
- unsigned char i,m,j;
- unsigned int datasoute=0;
-
-
- powerup();
- delay(5118);//上電延時
- powerup();
- delay(5118);//上電延時
- delay(5118);//上電延時
- _cs=1;
- _sclk=0;
- m=0xa0;
- _cs=0;
- for(i=0;i<16;i++)
- {
- address=_iror_(address,1);
- datasoute=address<<1;
- _mosi=CY;
- _sclk=0;
- _sclk=1;
- }
- for(i=0;i<8;i++)
- {
- m=_cror_(m,1);
- j=m<<1;
- _mosi=CY;
- _sclk=0;
- _sclk=1;
- }
- _cs=1;
- _sclk=0;
- m=0xb0;
- _cs=0;
-
- for(i=0;i<8;i++)
- {
- m=_cror_(m,1);
- j=m<<1;
- _mosi=CY;
- _sclk=0;
- _sclk=1;
- }
- _cs=1;
- P0=0xff;
- datasoute=0;
- while(_int==1) //存儲地址換行標志
- {
- if(_rac) {delay(20000); datasoute++; } //記錄本次錄音所占的行數(也就是本次錄音有多大)
- if(P1^3==0)break;
- }
- }//while end;
-
- void audioout(unsigned int address) //放音程序
- {
- unsigned char i,m,j;
- unsigned int datasoute;
-
- powerup();
- _cs=1;
- _sclk=0;
- _cs=0;
- m=0xe0;
- for(i=0;i<16;i++)
- {
- address=_iror_(address,1);
- datasoute=address<<1;
- _sclk=0;
- _mosi=CY;
- _sclk=1;
- }
- for(i=0;i<8;i++)
- {
- m=_cror_(m,1);
- j=m<<1;
- _sclk=0;
- _mosi=CY;
- _sclk=1;
- }
-
- _cs=1;
- _sclk=0;
- m=0xf0;
- _cs=0;
- for(i=0;i<8;i++)
- {
- m=_cror_(m,1);
- j=m<<1;
- _sclk=0;
- _mosi=CY;
- _sclk=1;
- }
- _cs=1;
-
- P0=0xff;
- while(_int==1)
- {;
- }//while end;
- }
復制代碼
附錄3系統部分實物圖
|