![]() |
發布時間: 2020-6-15 16:29
正文摘要:如題,子函數中因為要執行串口發送就先關閉了定時器0開啟定時器1(兩個同時開啟總出問題),發送完畢后關閉定時器1再開啟定時器0,可是接下來定時器0都不再工作,主函數工作正常(出了有關定時器0的)。P2是 ... |
修改定時器0模式時,TMOD&=0xF0; TMOD|=0x01; 修改定時器1模式時,TMOD&=0x0F; TMOD|=0x20; |
TOMD 只需要定義一次 你在兩個初始化都有,你在開定時器0的時候關了1 你在開定時器1的時候關了0 ,所以會導致你一直都只是一個定時器工作。如果你關掉0就開1的話可以,關掉1就開0的話 也可以 兩個同時打開的話就不行。都是TMOD的原因。 上次我犯了這個錯誤,師傅讓我自賞兩個大嘴巴子。 |
要不你把整個程序貼上來。這一點,確識沒看出來可以不執行的錯誤 |
還沒解決么?實在不行就把仿真圖和程序發上來吧 |
YokeHickt 發表于 2020-7-3 18:58 樓上的壇友基本把問題都講清楚了,樓主還沒搞定可能與你把T0設置周期太短有關。進程調度得當串口與T0不會互擾。如實在搞不定可以設置兩個定時器開關互斥。基本構架如下: void InitTimer(void) { TMOD = 0x22;//8位自動重裝 PCON = 0x00; SCON = 0x50; TH0 = 0xA4;//定時100us TL0 = 0xA4; TH1 = 0xFD;//比特率9600 TL1 = 0xFD; TR0 = 0;//關T0 TR1 = 0;//關T1 EA = 1; ES = 1; ET0 = 1; ET1 = 0; } void main(void) { InitTimer(); while(1) { //相應任務中加二選一 if(TR1==1) TR0=0; else TR0=1; } } void Timer0Interrupt(void) interrupt 1 { //不需重裝 //中斷任務 } void UARTInterrupt(void) interrupt 4 { RI=0; x=SBUF; //中斷任務 } |
已經過去蠻久了,之前一直給忘了,我把兩個兩個定時器同時開啟,也就是像前面各位說的方法我都嘗試過,而測試方法就是兩個定時器各控制一個led燈的亮滅,各自執行的時候會使對應的led燈亮,使另一個定時器的led滅,而在這里會出現定時器0結束定時器1開啟的過程都正常,而當定時器1語句結束后,定時器0就失去效用,對應的led不再亮起 |
既然不需要兩個定時器同時工作,除了工作模式變動外。可以分別控制 TR0 和 TR1 吧 |
應該是初始化的問題,用之前在初始化一次呢? |
在timer0_init()中把timer1的中斷和串口中斷關掉試一下 |
TIME1的初始化把 Time0給關了。。。。 |
直接在開啟定時器1初始化的時候TMOD|=0X20;你第二個初始化相當于給第一個給覆蓋了也可以兩個初始化放在一起寫; |
wufeng391 發表于 2020-6-17 21:25 你這個不就是TMOD=0X21; |
應該是你修改定時器工作模式的方法有問題,你的這種操作方法,如果只是一個定時器的話決什么問題,如果是兩個使用同一個模式寄存器的定時器就不好用了,可能在打開一個定時器的同時會關閉另一個定時器。這時候應用用與或方式操作修改TMOD寄存器。網上應該有相關的視頻。 |
修改定時器0模式時,TMOD&=0xF0; TMOD|=0x01; 修改定時器1模式時,TMOD&=0x0F; TMOD|=0x20; 這樣修改定時器模式時不會互相干擾。你可以試下。 |
你是證明它沒有工作的呢? LED燈亮何時滅?何時亮?滅后何時又被明亮的呢? |
檢查與定時器相關的驅動時鐘是否符合要求,并查該時鐘在定時器 開關的變化 |
經過檢測TMOD已經被重新定義為0x01,可是定時器0依舊不工作 |
你把最后兩行代碼的順序倒過來試一下。即: flag4=0; timer0_init(); |