導航:首頁 > 操作系統 > 用單片機控制晶元

用單片機控制晶元

發布時間:2025-03-23 21:45:03

⑴ 怎麼寫單片機控制外圍晶元程序

兄弟,參加電子設計大賽吧??b題?
這個最重要的是看晶元資料,晶元資料內對通信方式,協議,時序,都有的,可以利用單片機自帶的通信介面,即埠第二功能。也可以自己制定時序。
這是24c02的程序。用的ATmega16;
最後祝你有個好成績
#include <iom16v.h>
#include <macros.h>
#include "delay.h"
#include "lcd.h"

#define uchar unsigned char
#define uint unsigned int

/**************************************************************************
* 函數名稱: ERROR();
* 功 能: 蜂鳴器報錯
* 參 數:無
* 描 述:PA0口置低可以鳴響蜂鳴器
**************************************************************************/
void ERROR()
{
uint i;
DDRA |= (1 << PA0);
PORTA &= ~(1 << PA0);
for( i = 0 ; i < 10000 ; i ++);
PORTA |= (1 << PA0);
}
//********************************************************************8
//*函數 向24c02發送一個位元組
//*名稱 wtwib();
//*參數 地址,數據
//*********************************************************************/
void wtwib(uchar ad,uchar da)
{ TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//發送start
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x08)
ERROR();
TWDR =0xA0; //adress of e2prom
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x18)
ERROR();
TWDR =ad; //adress of the data
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x28)
ERROR();
TWDR =da; //send the data to the bus
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x28)
ERROR();
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);//send the stop signal
}
//=================================================================
//=======read a byte from 24c02
//========rtwib()
//==========need address
//================================================================
uchar rtwib(uchar ad)
{ uchar da;
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//send the signal of start
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x08)
ERROR();
TWDR =0xA1; //adress of e2prom
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x18)
ERROR();
TWDR =ad; //adress of the data
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x28)
ERROR();
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//send the signal of start
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x08)
ERROR();
TWDR =0xA1; //adress of e2prom
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x18)
ERROR();
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x58)
ERROR();
da=TWDR;
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);//send the stop signal
return da;
}
//========================================================
//====== send a page to the 24c02
//====== wtwis();
//=======need address and data and number;
//=========================================================
void wtwip(uchar ad,uchar n,uchar *da)
{ uchar i;
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//發送start
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x08)
ERROR();
TWDR =0xA0; //adress of e2prom
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x18)
ERROR();
TWDR =ad; //adress of the data
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x28)
ERROR();
for(i=0;i<n;i++)
{ TWDR =da[i]; //send the data to the bus
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x28)
ERROR();
}
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);//send the stop signal

}
//====================================================
//========read a string from the 24C02
//========rtwis();
//========need address,number
//=====================================================
void rtwis(uchar ad,uchar *p,uchar n)
{ uchar i;
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//send the signal of start
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x08)
ERROR();
TWDR =0xA1; //adress of e2prom
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x18)
ERROR();
TWDR =ad; //adress of the data
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x28)
ERROR();
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//send the signal of start
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x08)
ERROR();
TWDR =0xA1; //adress of e2prom
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x18)
ERROR();
for(i=0;i<n;i++)
{ TWCR = (1<<TWINT) | (1<<TWEN)|(1<<TWEA);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x50)
ERROR();
p[i]=TWDR;
}
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);//send the stop signal
}
void main()
{ uchar a[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},i=0;
init_lcd();
TWBR = 0x1F;
TWSR = 0x02;
for(i=0;i<16;i++)
wtwib( 0x00+i,i);

for(i=0;i<16;i++)
rtwib( 0x00+i);
for(i=0;i<16;i++)
a[i]=0;
for(i=0;i<16;i++)
send_d(a[i]+48);
}

⑵ 單片機如何控制語音晶元,

APR9600(語音錄放)

台灣公司最新推出的APR9600語音錄放晶元,是繼美國ISD公司以後採用模擬存儲技術的又一款音質好、噪音低、不怕斷電、

復錄放的新型語音電路,單片電路可錄放32-60秒,串列控制時可分256段以上,並行控制時最大可分8段。與ISD同類晶元

它具有:價格便宜,有多種手動控制方式,分段管理方便、多段控制時電路簡單、采樣速度及錄放音時間可調、每個單鍵均有

停止循環多種功能等特點,同時保留了ISD2500晶元的一些特點,都是DIP28雙列直插塑料封裝,在管腳排列上也基本相同。

圖一是APR9600的全功能使用電路圖,圖二是APR9600的管腳排列圖。表(一)為管腳功能說明。一、並行控制模式

在ISD晶元中要實現某鍵對某段的多段並行控制是十分復雜的,一般需要大量的二極體解碼陣或單片機來輔助實現,另外在分

段錄音時也存在很多困難。而在APR9300晶元中卻十分簡單,每段都有對應的鍵控制,按哪一鍵就錄、放哪一段,而且可以方便地

對任意一段重新錄音不影響其它段、對任意一段循環放音等。只是每段錄音的最大時間是等分的,而且最多隻能分八段。下面

以需要分四段為例說明:

並行四段控制需要將晶元的MSEL1端置1(高電平)、MSEL2端置0(低電平)、/M8端任意。模式置好後開始錄音,置RE

端為0,壓住/M1即聽到「嘀」一聲BUSY指示燈亮起即開始錄音第一段,松鍵時又聽到「嘀」一聲BUSY指示燈熄滅即錄音停止。

/M2、/M3、/M4分別錄其他三段。錄音時可以不按順序,先錄任意一段均可,不滿意可重新錄音。每段的最大時間為15秒(以全

片60秒錄音計),錄滿時指示燈熄滅並響「嘀嘀」兩聲,當然實際每段錄音可以長短不一。置RE端為1即是放音狀態,按一下/M1

即放音第一段,放音期間再按一下/M1即停止放音,如果壓住/M1鍵不放即循環放音第一段直到松鍵。/M2、/M3、/M4均分別控制第二、三、四段。/CE鍵為停止鍵,放音期間按一下它也能停止放音。

其它並行二段、八段的控制使用方式相同。

二、串列控制模式

串列控制方式用到的鍵要少得多,它僅需要一、二個鍵來控制所有的語音段錄放,而且段數可以足夠多,每段也沒有時間限制。

只是在選段上沒有並行控制模式方便。

置MSEL1、MSEL2均為0,在錄音時/M8置1。置/RE端為0為錄音狀態,按住/M1即開始錄第一段,松鍵即停止。再按住/M1

即錄第二段,如此一直分段錄音,直到晶元溢出。

在放音時(/RE=1)有兩種狀態,/M8置1為串列順序控制方式,按一下/M1即放音第一段,再按一下即放第二段,如此順序

逐段放音,到最後一段結束時即停止放音,必須按一下CE鍵復位,然後再按/M1鍵就可以又從第一段放音。這種方式下的段不可選

擇只能按錄音的順序播放,適合走馬燈、流程式控制制等電路使用;/M8置0為串列選段控制方式,按一下/M1隻能放音第一段,再按

還是放音第一段。這時的/M2有效成為快進選段鍵,每按一下/M2即向後移動一段,例如現在按了三下/M2,再按/M1就放音第四段。

因此可以實現選段放音。按/CE鍵復位為第一段。

APR9600晶元還有其它幾種控制方式,用戶可根據需要自行實驗設計。

APR9600的電性能參數:電源電壓4.5-6.5V,靜態電流1uA,工作電流25mA。其外接振盪電阻與采樣率、語音頻帶、錄放

時間的關系見表(三),該電阻可以根據用戶需要的時間和音質效果無級調節。

單片機接M1-M8就行了

閱讀全文

與用單片機控制晶元相關的資料

熱點內容
通達信紅三兵指標公式源碼 瀏覽:275
文件夾名稱和內容在哪裡 瀏覽:110
家裡買什麼品牌伺服器 瀏覽:378
關於九宮格演算法 瀏覽:499
伺服器登錄不上游戲怎麼辦 瀏覽:514
加密和壓縮文件的安全目的 瀏覽:974
為什麼安卓手機信息鈴聲這么大 瀏覽:764
行程開關單片機 瀏覽:761
2345解壓之後文件在哪裡 瀏覽:142
yy建了個頻道怎麼添加密碼 瀏覽:386
致尚xt中控怎麼下載app 瀏覽:646
php中取整 瀏覽:384
程序員的相親策略 瀏覽:8
福建區伺服器雲主機 瀏覽:226
php批量轉換html工具 瀏覽:931
qt怎麼編譯c語言 瀏覽:913
壓縮式垃圾車示意圖 瀏覽:725
復制文件夾進度沒了 瀏覽:128
androidstudio下載ndk 瀏覽:555
如何連接jet伺服器 瀏覽:772