<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 單片機(jī)中斷問題30例

          單片機(jī)中斷問題30例

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

          答:

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

          18、中斷程序的書寫步驟?

          答:

          標(biāo)準(zhǔn)形式:

          void 函數(shù)名(void)interrupt n using m

          {函數(shù)體語句}

          n ----中斷編號

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

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

          #include

          sbit speaker = P1^5;

          unsigned char timer0h, timer0l, time;

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

          //晶振采用11.0592MHz

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

          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

          // 頻率-半周期數(shù)據(jù)表 低八位

          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

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

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

          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ā)音的音調(diào)

          {

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

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

          TH0 = timer0h; //下次的中斷時間, 這個時間, 控制音調(diào)高低

          TL0 = timer0l;

          TR0 = 1; //啟動T0

          }

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

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

          {

          unsigned char t1;

          unsigned long t2;

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

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

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

          }

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

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

          {

          TH0 = timer0h; //控制音調(diào)

          TL0 = timer0l;

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

          delay(time); //控制時間長度

          }

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

          void main(void)

          {

          unsigned char k, i;

          TMOD = 1; //置T0定時工作方式1

          ET0 = 1; //開T0中斷 IE=0x82;

          EA = 1; //開CPU中斷

          while(1) {

          i = 0;

          time = 1;

          while(time) {

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

          //第i個是音符, 第i+1個是第幾個八度

          timer0h = FREQH[k]; //從數(shù)據(jù)表中讀出頻率數(shù)值

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

          time = ssz

          ymmh[i + 2]; //讀出時間長度數(shù)值

          i += 3;

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

          }

          }

          }

          答:

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

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

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

          答:

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

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

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

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

          21、PIC單片機(jī)AD中斷什么時候開啟,對AD中斷應(yīng)該怎樣理解。

          答:

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

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

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

          答:

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

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

          定時器0中斷:當(dāng)定時器0計數(shù)到FFFF溢出時



          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();