<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 單片機中斷問(wèn)題30例

單片機中斷問(wèn)題30例

作者: 時(shí)間:2013-05-07 來(lái)源:網(wǎng)絡(luò ) 收藏

答:

T你只付了0值,怎么會(huì )變化頻率呢?你在主函數里加個(gè)T的賦值語(yǔ)句就行了,例如:while(T){T--;delay1s();}

18、中斷程序的書(shū)寫(xiě)步驟?

答:

標準形式:

void 函數名(void)interrupt n using m

{函數體語(yǔ)句}

n ----中斷編號

m-----要使用工作寄存器組號

19、我想知道的蜂鳴器音樂(lè )程序中斷是如何響應的?從main主程序中如何到中斷程序?具體步驟是啥?謝謝!

#include

sbit speaker = P1^5;

unsigned char timer0h, timer0l, time;

//--------------------------------------

//晶振采用11.0592MHz

// 頻率-半周期數據表 高八位 本軟件共保存了四個(gè)八度的28個(gè)頻率數據

code unsigned char FREQH[] = {

0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, //低音1234567

0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i

0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, //高音 234567

0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF}; //超高音 1234567

// 頻率-半周期數據表 低八位

code unsigned char FREQL[] = {

0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6, //低音1234567

0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i

0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D, //高音 234567

0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16}; //超高音 1234567

//--------------------------------------

//世上只有媽媽好數據表 要想演奏不同的樂(lè )曲, 只需要修改這個(gè)數據表

code unsigned char sszymmh[] = {5,1,1,5,1,1,6,1,2,5,1,2,1,2,2,7,1,4,5,1,1,5,1,1,6,1,2,5,1,2,2,2,2,1,2,4,

5,1,1,5,1,1,5,2,2,3,2,2,1,2,2,7,1,2

};

//--------------------------------------

void t0int() interrupt 1 //T0中斷程序,控制發(fā)音的音調

{

TR0 = 0; //先關(guān)閉T0

speaker = !speaker; //輸出方波, 發(fā)音

TH0 = timer0h; //下次的中斷時(shí)間, 這個(gè)時(shí)間, 控制音調高低

TL0 = timer0l;

TR0 = 1; //啟動(dòng)T0

}

//--------------------------------------

void delay(unsigned char t) //延時(shí)程序,控制發(fā)音的時(shí)間長(cháng)度

{

unsigned char t1;

unsigned long t2;

for(t1 = 0; t1 t; t1++) //雙重循環(huán), 共延時(shí)t個(gè)半拍

for(t2 = 0; t2 8000; t2++); //延時(shí)期間, 可進(jìn)入T0中斷去發(fā)音

TR0 = 0; //關(guān)閉T0, 停止發(fā)音

}

//--------------------------------------

void song() //演奏一個(gè)音符

{

TH0 = timer0h; //控制音調

TL0 = timer0l;

TR0 = 1; //啟動(dòng)T0, 由T0輸出方波去發(fā)音

delay(time); //控制時(shí)間長(cháng)度

}

//--------------------------------------

void main(void)

{

unsigned char k, i;

TMOD = 1; //置T0定時(shí)工作方式1

ET0 = 1; //開(kāi)T0中斷 IE=0x82;

EA = 1; //開(kāi)CPU中斷

while(1) {

i = 0;

time = 1;

while(time) {

k = sszymmh[i] + 7 * sszymmh[i + 1] - 1;

//第i個(gè)是音符, 第i+1個(gè)是第幾個(gè)八度

timer0h = FREQH[k]; //從數據表中讀出頻率數值

timer0l = FREQL[k]; //實(shí)際上, 是定時(shí)的時(shí)間長(cháng)度

time = ssz

ymmh[i + 2]; //讀出時(shí)間長(cháng)度數值

i += 3;

song(); //發(fā)出一個(gè)音符

}

}

}

答:

你看main()函數就行了,首先進(jìn)行k、i的定義,然后是定義中斷的類(lèi)型(程序中用的是定時(shí)器中斷),這個(gè)定時(shí)器有點(diǎn)特殊,它的作用是定義頻率的,頻率間隔小則聲調高,反之聲調低。這個(gè)頻率就是時(shí)間的倒數唄,所以TH的值越大,聲調越高;TL的值越小,聲調越低。接著(zhù)往下走,while(1) 就是等待中斷的意思,這個(gè)程序中的定時(shí)器中斷沒(méi)有設置初值,所以中斷幾乎沒(méi)有等待,時(shí)時(shí)觸發(fā)(要是有等待時(shí)間,音樂(lè )不就連不上了么)。綜上:這個(gè)定時(shí)器中斷完成兩個(gè)任務(wù):1、使單片機時(shí)時(shí)觸發(fā)(等待時(shí)間幾乎為0);2、控制了音符的演奏頻率。

再往下 while(time) 的循環(huán)就是為演奏的音符賦值的操作了。

20、單片機中斷該什么時(shí)候進(jìn)如?

答:

中斷看是外部中斷、定時(shí)器還是串行口中斷了。

如果是外部中斷,就是p3.2、p3.3檢測到這兩個(gè)口電平變化時(shí)(假設這兩個(gè)口接上按鍵,那么當按鍵按下時(shí)表明產(chǎn)生中斷),然后跳到中斷程序執行。

如果是定時(shí)器中斷的話(huà),有個(gè)中斷標志位TFx(x表示0或者1),比如說(shuō)你設置一個(gè)1S的定時(shí)器程序,你以50ms為基準,20次產(chǎn)生1s的時(shí)間,然后當50ms一過(guò),標志位就產(chǎn)生變化,進(jìn)入定時(shí)器中斷程序執行!

串行口中斷也是一樣有一個(gè)標志位,接受或者發(fā)送數據滿(mǎn)了以后,標志位就發(fā)生變化,然后進(jìn)入中斷執行!

21、PIC單片機AD中斷什么時(shí)候開(kāi)啟,對AD中斷應該怎樣理解。

答:

AD模數轉換,是把模擬電壓數值采樣進(jìn)來(lái),然后轉換成數字信號。這一采樣和轉換是需要時(shí)間的。并不是一開(kāi)AD就能讀到數字信號數據。

一般來(lái)說(shuō)其時(shí)間都只有幾微秒到幾百微秒(根據設置不同而定)。如果單片機沒(méi)有其他工作的時(shí)候,可以用循環(huán)等待的方式等AD轉換結束(轉換結束后DONE位會(huì )被置位)。但如果你的單片機還有其他工作,那就沒(méi)必要在等待它上面花費時(shí)間??梢蚤_(kāi)AD操作后,繼續執行其他程序。而轉換結束后,AD中斷可以暫時(shí)斷開(kāi)現有炒作,而把AD數據讀進(jìn)來(lái)。這就是AD中斷的作用。

2251單片機的五個(gè)中斷分別在什么時(shí)候(什么情況)執行里面的程序!

答:

外部中斷0 :P3.2口有低電平(IT0=0)/ 下降沿(IT0=1)。

外部中斷1 :P3.3口有低電平(IT1=0)/ 下降沿(IT1=1)。

定時(shí)器0中斷:當定時(shí)器0計數到FFFF溢出時(shí)



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>