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