找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2708|回復(fù): 18
收起左側(cè)

關(guān)于單片機(jī)定時(shí)器與中斷的問題

[復(fù)制鏈接]
ID:969765 發(fā)表于 2021-10-4 12:06 | 顯示全部樓層 |閱讀模式
大佬們好,如果定時(shí)器T0已經(jīng)初始化后,開始運(yùn)行,這時(shí)候我一直初始化會(huì)發(fā)生什么樣的情況。原本代碼是將Timert0_init(); 放在while外面上電初始化,但是我想試一試放在按鍵里面會(huì)是什么樣的效果。結(jié)果就是按鍵1需要一直按下,按鍵2只需點(diǎn)動(dòng),按鍵3,4在初始化后與按鍵2一樣的效果。有沒有大佬解釋一下其中的原理。感謝
下面是單片機(jī)測試代碼:

#include "regx52.h"
#include "timer0.h"
#include "keynum.h"
#include "intrins.h"
#include "Delay.h"

unsigned char wl,mode;//waterfall light 流水燈
void main()
{        
        P2=0xfe;
        while(1)
        {
                wl=keynum();
               
                if(wl>0)
                {
                        if(wl==1)
                        {
                                mode=1;
                                Timert0_init();      //這里按鍵一直按下流水燈一直工作,松手停下。
                        }
                        if(wl==2)
                        {
                                mode=2;
                                Delay(1);             //這里按鍵按下,松開流水燈繼續(xù)工作
                                Timert0_init();
                        }
                        if(wl==3)
                        {
                                mode=3;
                        }
                        if(wl==4)
                        {
                                mode=4;
                        }
                }
        }
}
void Timer0_Rountine(void)        interrupt 1
{
        static unsigned int t0count;        //靜態(tài)函數(shù)static,保證退出中斷時(shí)t0count不清零。
        TL0 = 0x66;                //設(shè)置定時(shí)初始值
        TH0 = 0xFC;                //設(shè)置定時(shí)初始值                        //定時(shí)器溢出后的值會(huì)變成0,需要重新賦初值;        
        t0count++;
        if(t0count>=1000)
        {
                t0count=0;
                if(mode==1)
                {
                        P2=_crol_(P2,1);
                }
                                if(mode==2)
                {
                        P2=_cror_(P2,1);
                }
                if(mode==3)
                {
                        P2=_crol_(P2,1);
                }
                if(mode==4)
                {
                        P2=_cror_(P2,1);
                }

        }
}




回復(fù)

使用道具 舉報(bào)

ID:969765 發(fā)表于 2021-10-4 12:07 | 顯示全部樓層
有沒有大佬幫下忙,解決一下我的困惑
回復(fù)

使用道具 舉報(bào)

ID:57657 發(fā)表于 2021-10-4 14:57 | 顯示全部樓層
你的文件不全,需要有 timer0.h 等頭文件的內(nèi)容才知道是什么問題。
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2021-10-4 18:36 | 顯示全部樓層
LYN123188 發(fā)表于 2021-10-4 12:07
有沒有大佬幫下忙,解決一下我的困惑

先說單片機(jī)具體型號(hào),

然后說,希望達(dá)到的效果,
然后,說一下實(shí)際效果。

最后,標(biāo)注一下,哪個(gè)是按鍵1,2,3,4
回復(fù)

使用道具 舉報(bào)

ID:969765 發(fā)表于 2021-10-5 11:29 | 顯示全部樓層
npn 發(fā)表于 2021-10-4 14:57
你的文件不全,需要有 timer0.h 等頭文件的內(nèi)容才知道是什么問題。

好的,我馬上補(bǔ)發(fā)
回復(fù)

使用道具 舉報(bào)

ID:969765 發(fā)表于 2021-10-5 11:29 | 顯示全部樓層
188610329 發(fā)表于 2021-10-4 18:36
先說單片機(jī)具體型號(hào),

然后說,希望達(dá)到的效果,

普中51單片機(jī),stl89c51
回復(fù)

使用道具 舉報(bào)

7#
無效樓層,該帖已經(jīng)被刪除
ID:429003 發(fā)表于 2021-10-5 11:55 | 顯示全部樓層
單片機(jī)執(zhí)行的每一個(gè)行為均是由程序邏輯所控制的,無論是放在循環(huán)外還是循環(huán)體內(nèi),其對執(zhí)行結(jié)果的影響是由具體代碼決定。你先搞明白TimerInit干了些什么事情,會(huì)給程序帶來什么樣的執(zhí)行過程,同時(shí)你又希望怎么執(zhí)行才能實(shí)現(xiàn)你的控制思路!
回復(fù)

使用道具 舉報(bào)

ID:969765 發(fā)表于 2021-10-5 11:57 | 顯示全部樓層
希望大佬們指導(dǎo)指導(dǎo)

定時(shí)器中斷問題.zip

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

回復(fù)

使用道具 舉報(bào)

ID:969765 發(fā)表于 2021-10-5 15:43 | 顯示全部樓層
xstong 發(fā)表于 2021-10-5 11:55
單片機(jī)執(zhí)行的每一個(gè)行為均是由程序邏輯所控制的,無論是放在循環(huán)外還是循環(huán)體內(nèi),其對執(zhí)行結(jié)果的影響是由具 ...

我現(xiàn)在分析不出原因,希望大佬指點(diǎn)。文件已經(jīng)補(bǔ)發(fā)了
回復(fù)

使用道具 舉報(bào)

ID:451718 發(fā)表于 2021-10-5 16:28 | 顯示全部樓層
看了一下你的程序,問題很多,按鍵的響應(yīng)程序效率太低了,主程序里面的判斷語句也不嚴(yán)謹(jǐn)。建議你還是多看懂幾個(gè)范列程序,再自己著手寫功能。  
回復(fù)

使用道具 舉報(bào)

ID:883031 發(fā)表于 2021-10-5 16:33 | 顯示全部樓層
可以將初始化程序放在外邊,先不要啟動(dòng)定時(shí)器,需要的時(shí)候再打開,在條件滿足時(shí)在關(guān)閉,控制定時(shí)器的開關(guān)就行了。
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2021-10-5 16:44 | 顯示全部樓層
LYN123188 發(fā)表于 2021-10-5 15:43
我現(xiàn)在分析不出原因,希望大佬指點(diǎn)。文件已經(jīng)補(bǔ)發(fā)了

                        if(wl==1)
                        {
                                mode=1;
                                Timert0_init();      //這里按鍵一直按下流水燈一直工作,松手停下。
                        }
                        if(wl==2)
                        {
                                mode=2;
                                Delay(1);             //這里按鍵按下,松開流水燈繼續(xù)工作
                                Timert0_init();
                        }
在你第一次貼的代碼中
mode1 和 mode2 的分別就是多了Delay(1);
說個(gè)比喻:
Timert0_init();->網(wǎng)貸收錢
Delay(1);->讓你有時(shí)間掙錢
mode1:
當(dāng)你掙到一兩毛的時(shí)候網(wǎng)貸收錢把你的戶口清零了,你只好繼續(xù)去搬磚
mode2:
Delay(1)讓你有時(shí)間掙錢,等你掙到一千零一毛的時(shí)候網(wǎng)貸才來收錢,你有一毛留下,立刻走去消費(fèi)(流水燈位移)

如果有鍵按著
因?yàn)殒I按程序中有松開等待
就等于白白延長了還款時(shí)間
讓你有錢(時(shí)間)去消費(fèi)(流水燈位移)

然而,在你上傳的Keil 文件中已經(jīng)在mode1中補(bǔ)回了Delay(1);
別人重現(xiàn)不了你的問題

如何驗(yàn)證我的比喻?
可以把Delay()函數(shù)中的i=2改為i=1(縮短還款期)
就會(huì)令到按鍵1和2都要按著才能流水


回復(fù)

使用道具 舉報(bào)

ID:970053 發(fā)表于 2021-10-6 08:53 | 顯示全部樓層
你的文件不全,需要有 timer0.h 等頭文件的內(nèi)容才知道是什么問題。
回復(fù)

使用道具 舉報(bào)

ID:969765 發(fā)表于 2021-10-8 15:23 | 顯示全部樓層
lkc8210 發(fā)表于 2021-10-5 16:44
if(wl==1)
                        {
                                mode ...

你好,你說的非常好,就是有一點(diǎn)我不明白,mode1的定時(shí)計(jì)數(shù)一直在清零,我一直按著流水燈流動(dòng),我松開他就不動(dòng)是為什么,不是已經(jīng)初始化過了嗎
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2021-10-8 21:46 | 顯示全部樓層
LYN123188 發(fā)表于 2021-10-8 15:23
你好,你說的非常好,就是有一點(diǎn)我不明白,mode1的定時(shí)計(jì)數(shù)一直在清零,我一直按著流水燈流動(dòng),我松開他 ...

對不起,原來我分析錯(cuò)了
我上個(gè)回覆只找到為什么按著會(huì)流水
而沒有找到真正的原因
剛剛再看一次代碼
才發(fā)現(xiàn)keynum.c里
反回的keynumber不會(huì)清零
只會(huì)維持上一次按鍵的數(shù)值
引致if(wl==1)不斷成立
不斷初始化,進(jìn)不了中斷

解決方法是把keynumber放到keynum()內(nèi)
  1. int keynum()
  2. {
  3. unsigned char keynumber=0;
  4.         if(P3_1==0){Delay(200);while(P3_1==0);Delay(20);keynumber=1;}
  5.         if(P3_0==0){Delay(200);while(P3_0==0);Delay(20);keynumber=2;}
  6.         if(P3_2==0){Delay(200);while(P3_2==0);Delay(20);keynumber=3;}
  7.         if(P3_3==0){Delay(200);while(P3_3==0);Delay(20);keynumber=4;}
  8.         return keynumber;
  9. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:969765 發(fā)表于 2021-10-14 15:46 | 顯示全部樓層
lkc8210 發(fā)表于 2021-10-8 21:46
對不起,原來我分析錯(cuò)了
我上個(gè)回覆只找到為什么按著會(huì)流水
而沒有找到真正的原因

大佬,照你這么說,按完之后和一直按著應(yīng)該一個(gè)效果啊,為什么一直按著流水燈會(huì)動(dòng),松開就不行了。
回復(fù)

使用道具 舉報(bào)

ID:969765 發(fā)表于 2021-10-14 15:47 | 顯示全部樓層
lkc8210 發(fā)表于 2021-10-8 21:46
對不起,原來我分析錯(cuò)了
我上個(gè)回覆只找到為什么按著會(huì)流水
而沒有找到真正的原因

mode1那里的delay(1)去掉后
回復(fù)

使用道具 舉報(bào)

ID:969765 發(fā)表于 2021-10-14 15:48 | 顯示全部樓層
LYN123188 發(fā)表于 2021-10-14 15:46
大佬,照你這么說,按完之后和一直按著應(yīng)該一個(gè)效果啊,為什么一直按著流水燈會(huì)動(dòng),松開就不行了。

感謝大佬的細(xì)心解答
回復(fù)

使用道具 舉報(bào)

ID:969765 發(fā)表于 2021-10-14 15:51 | 顯示全部樓層
lkc8210 發(fā)表于 2021-10-8 21:46
對不起,原來我分析錯(cuò)了
我上個(gè)回覆只找到為什么按著會(huì)流水
而沒有找到真正的原因

大佬,剛開機(jī)需要先按一下,然后松開,再一直按就能動(dòng),第1下百分百不能動(dòng)
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

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