找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6292|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

困惑,,51單片機(jī)定時(shí)器中斷的問(wèn)題請(qǐng)教大家

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:66137 發(fā)表于 2015-4-19 18:12 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
最近在重新認(rèn)識(shí)中斷的時(shí)候遇到這樣一個(gè)問(wèn)題,。我在仔細(xì)看了郭天祥老師的《51單片機(jī)c語(yǔ)言教程》書籍例3.5.1和例3.5.2后有個(gè)一直想不明白的問(wèn)題,,郭老師說(shuō),一般我們?cè)谥袛喾⻊?wù)程序中不要寫太多的處理語(yǔ)句,如果語(yǔ)句過(guò)多,中斷服務(wù)中的代碼還沒(méi)有執(zhí)行完畢,而下一次中斷又來(lái)臨,,這樣我們就失去這次中斷,,這個(gè)是不是說(shuō),當(dāng)中斷服務(wù)中的代碼還正在執(zhí)行,而下一次中斷又來(lái)臨了,那么就失去這次中斷,,是不是num就少加了一次值啦,就是說(shuō)在執(zhí)行中斷服務(wù)中的代碼時(shí),來(lái)不及響應(yīng)num++,是這樣嗎,但是聯(lián)想到例3.5.2的時(shí)候我就又不解了,,。。
void T0_time() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num++;
if(num==20)
  {
   num=0;
   led1=~led1;
  
  }
}

書里指出,不能把判斷發(fā)光管的時(shí)間是否到達(dá)的語(yǔ)句寫在主程序中,若寫在主程序中,有可能發(fā)生如下情況,,當(dāng)在主程序運(yùn)行在顯示數(shù)碼管語(yǔ)句當(dāng)中時(shí),此時(shí)恰好定時(shí)器0進(jìn)入中斷并且num1剛好也加到4,當(dāng)定時(shí)器0中斷再次進(jìn)入時(shí),主程序仍未退出數(shù)碼管顯示語(yǔ)句,那么此時(shí)num1的值便成了5,這樣的話,,num1=4這個(gè)點(diǎn)便永遠(yuǎn)檢測(cè)不到了。部分程序如下
void T0_time() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num1++;
if(num1==4)
  {
   num1=0;
   led1=~led1;
  
  }
}
仔細(xì)看了這幾個(gè)地方,我是這么理解的是不是上面  第一個(gè)程序中斷服務(wù)中的代碼還沒(méi)有執(zhí)行完畢,而下一次中斷又來(lái)臨時(shí)會(huì)丟失,而來(lái)不及響應(yīng)來(lái)不及響應(yīng)num++這個(gè)語(yǔ)句,,,而第二個(gè)程序中在執(zhí)行,定時(shí)器0進(jìn)入中斷并且num1剛好也加到4,數(shù)碼管的顯示語(yǔ)句也還沒(méi)有執(zhí)行完,當(dāng)定時(shí)器0中斷再次進(jìn)入時(shí),此時(shí)num1的值便成了5了,num1=4這個(gè)點(diǎn)便永遠(yuǎn)檢測(cè)不到了,,,看起來(lái)就沒(méi)有丟失這次中斷,,為什么第一個(gè)例子會(huì)丟失中斷,,而第二個(gè)確沒(méi)有丟失中斷啦,,但是我也想了一下,,如果真的num1的值便成了5,,,是不是可以把 if(num1==4)改寫成if(num1>=4),即便真的num1的值跑飛了,,大于4了,也可以將num1的值重新清零,控制發(fā)光管繼續(xù)運(yùn)行,。。。在線等待大家解答,謝謝。。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表