欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

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

QQ登錄

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

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

IAP15F2K60S2單片機(jī)定時(shí)器延時(shí)問(wèn)題

 關(guān)閉 [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:716794 發(fā)表于 2020-3-27 12:14 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 程鵬 于 2020-3-31 10:44 編輯

我原想通過(guò)按鍵來(lái)控制定時(shí)器的延時(shí)時(shí)間的,但是出現(xiàn)的情況是,按鍵絕大多數(shù)情況都是失靈的。無(wú)法控制定時(shí)器服務(wù)程序里的延時(shí)函數(shù)。

單片機(jī)源程序如下:
  1. //實(shí)驗(yàn)?zāi)繕?biāo)效果:用按鍵控制LED燈的閃爍頻率。
  2. //實(shí)驗(yàn)實(shí)際效果:?jiǎn)纹瑱C(jī)上電后,LED會(huì)以1秒/次的頻率閃爍;按下S5,頻率為5秒/次,若此時(shí)再按下S4,LED滅很久,時(shí)間未知;在按下S5后按下S6,改變頻率為30秒/次;在按下S6后按下S7,改變頻率為60秒/次,若此時(shí)再按下S5,LED滅很久,時(shí)間未知(遠(yuǎn)大于所有設(shè)定時(shí)間)。可推測(cè),在上電后,按鍵只能順序按一次有用(即從S4→S7),若逆序按下,則LED燈會(huì)一直熄滅很久。
  3. #include <stc15f2k60s2.h>
  4. #include <absacc.h>
  5. #include <intrins.h>
  6. void button(void);//獨(dú)立鍵盤(pán)函數(shù)。
  7. void led(void);//led函數(shù)。
  8. void Delayms(unsigned int ms);//軟件延時(shí)函數(shù),單位為微秒。
  9. void Timer0Init(void);//定時(shí)器0初始化函數(shù)。
  10. void T0_Ser(void);//定時(shí)器0中斷服務(wù)函數(shù)。
  11. unsigned char time,lt;//LED亮燈間隔時(shí)間參數(shù)。
  12. unsigned int count=0;//定時(shí)器0中斷服務(wù)程序計(jì)數(shù)參數(shù),延長(zhǎng)中斷時(shí)間。
  13. int main(void)
  14. {
  15.         XBYTE[0xA000]=0;//初始化無(wú)關(guān)元器件。
  16.         EA=1;//開(kāi)總中斷。
  17.         Timer0Init();
  18.         while(1)
  19.         {
  20.                 button();
  21.         }
  22.         return 0;
  23. }
  24. void button(void)//獨(dú)立鍵盤(pán)函數(shù)。
  25. {
  26.         unsigned char key;
  27.         P3=0x0f;
  28.         key=(P3&0x0f);
  29.         if(key!=0x0f)//第一次消抖開(kāi)始。
  30.         {
  31.                 Delayms(5);
  32.                 key=(P3&0x0f);
  33.                 if(key!=0x0f)
  34.                 {
  35.                         key=(P3&0x0f);//第一次消抖結(jié)束。
  36.                         switch(key)
  37.                         {
  38.                                 case 0x07:time=1;break;//s4。
  39.                                 case 0x0b:time=2;break;//s5。
  40.                                 case 0x0d:time=3;break;//s6。
  41.                                 case 0x0e:time=4;break;//s7。
  42.                                 default:XBYTE[0x8000]=0;//判斷鍵值是否正確。
  43.                         }
  44.                         while(key!=0x0f)//第二次消抖開(kāi)始。
  45.                                 key=(P3&0x0f);//第二次消抖結(jié)束。
  46.                 }
  47.         }
  48.         switch(time)//根據(jù)按鍵給lt賦不同值,即讓定時(shí)器延時(shí)不同的時(shí)間。
  49.         {
  50.                 case 1:lt=1;break;//LED閃爍頻率為1秒(亮1秒、滅1秒)。
  51.                 case 2:lt=5;break;//LED閃爍頻率為5秒(亮5秒、滅5秒)。
  52.                 case 3:lt=30;break;//LED閃爍頻率為30秒(亮30秒、滅30秒)。
  53.                 case 4:lt=60;break;//LED閃爍頻率為5秒(亮60秒、滅60秒)。
  54.         }
  55. }
  56. void Timer0Init(void)                //10毫秒@12.000MHz
  57. {
  58.         AUXR &= 0x7F;                //定時(shí)器時(shí)鐘12T模式
  59.         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式,16位自動(dòng)重載。
  60.         TL0 = 0xF0;                //設(shè)置定時(shí)初值
  61.         TH0 = 0xD8;                //設(shè)置定時(shí)初值
  62.         TF0 = 0;                //清除TF0標(biāo)志
  63.         TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
  64.         ET0=1;                        //開(kāi)定時(shí)器0中斷。
  65. }
  66. void T0_Ser(void) interrupt 1//定時(shí)器0中斷服務(wù)函數(shù)。
  67. {
  68.         count++;
  69.         if(count<(100*lt))
  70.                 XBYTE[0x8000]=0;//LED亮。
  71.         else if(count>=(100*lt))
  72.                 XBYTE[0x8000]=0xff;//LED滅。
  73.         if (count==(200*lt))
  74.                 count=0;
  75.         
  76. }
  77. void Delayms(unsigned int ms)                //@12.000MHz
  78. {
  79.         unsigned char i, j;
  80.         while(ms)
  81.         {
  82.                 i = 12;
  83.                 j = 169;
  84.                 do
  85.                 {
  86.                         while (--j);
  87.                 } while (--i);
  88.                 ms--;
  89.         }
  90. }
復(fù)制代碼



1.國(guó)信長(zhǎng)天單片機(jī)競(jìng)賽平臺(tái)V20原理圖 - 副本.pdf

175.19 KB, 下載次數(shù): 5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

無(wú)效樓層,該帖已經(jīng)被刪除
無(wú)效樓層,該帖已經(jīng)被刪除
地板
ID:716794 發(fā)表于 2020-3-29 22:41 | 只看該作者
問(wèn)題解決了,只需要更改中斷服務(wù)函數(shù)就可以。
  1. if (count==(200*lt))
  2.                 count=0;
復(fù)制代碼

將以上部分由“count==(200*lt)”改為“count>=(200*lt)”就可以了。
為什么要這么修改?我個(gè)人推測(cè)如下:
在按鍵函數(shù)中,消抖延時(shí)時(shí)間為5毫秒;而在定時(shí)器0中,產(chǎn)生一次中斷的時(shí)間為10毫秒。當(dāng)我把條件設(shè)置為“==”時(shí),兩者之間相差較小,容錯(cuò)率較低,會(huì)出現(xiàn)按鍵失靈的情況。反之,當(dāng)條件為“>=”時(shí),大大提高了容錯(cuò)率,就不會(huì)出現(xiàn)上述情況了。

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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