熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2022-12-5 10:59
正文摘要:碰到一個(gè)看起來(lái)很簡(jiǎn)單的51單片機(jī)串行通信的問(wèn)題,但折騰了兩天了,怎么也調(diào)試不過(guò)去 1.目的: 使用郭天祥的開(kāi)發(fā)版,實(shí)現(xiàn)串口送入0x01情況下,led燈閃爍的效果 2.代碼如下: void Usart() interrupt 4 { un ... |
在中斷中最好不要使用while 也不要在中斷調(diào)用延時(shí)時(shí)間過(guò)長(zhǎng)的函數(shù) |
goodshot 發(fā)表于 2022-12-7 10:05 不知道你的ledFlash()函數(shù)的具體代碼,但放在串口中斷中運(yùn)行肯定是不當(dāng)?shù),LED閃爍是需要在一定的時(shí)間范圍完成,而串口中斷函數(shù)是不能把占用較長(zhǎng)時(shí)間的LED閃爍函數(shù)放進(jìn)去。串口中斷只能根據(jù)收到的信息經(jīng)判斷輸出一個(gè)標(biāo)志并立即退出函數(shù)。主函數(shù)根據(jù)這個(gè)標(biāo)志調(diào)用指定的子函數(shù)。 void Usart() interrupt 4 { unsigned char receiveData; receiveData=SBUF;//獲取接收到的數(shù)據(jù) RI = 0;//清除接收中斷標(biāo)志位 if(receiveData==0x01)//判斷是真 { flag=1;//標(biāo)志置1 } else { flag=0;//標(biāo)志清0 } } 如果主函數(shù)中要持續(xù)執(zhí)行 if(flag) { ledFlash(); } 如果主函數(shù)中只要執(zhí)行1次 if(flag) { flag=0; ledFlash(); } |
1261867136qq 發(fā)表于 2022-12-6 08:37 完整代碼如下:
代碼可以執(zhí)行,led閃爍, 但是,出現(xiàn)了2個(gè)問(wèn)題: 1.小燈一直閃爍,停不下來(lái)了 2.采用while提前,又不執(zhí)行了
不知道這是怎么回事 |
C:\Users\DELL\Pictures\3.png 這個(gè)可以執(zhí)行,不知道為什么? 但是同時(shí)出現(xiàn)了2個(gè)問(wèn)題: 1.是ledFlash()函數(shù)只讓led閃爍3次,但是在這個(gè)函數(shù)執(zhí)行過(guò)程中,小燈卻一直閃爍,退不出來(lái)了,這是為什么? 2.是while語(yǔ)句放在前面,{}中的flashLed()又不執(zhí)行了,這個(gè)真不懂了 C:\Users\DELL\Pictures\4.png 求教 |
wulin 發(fā)表于 2022-12-6 07:27 你好,抱歉,沒(méi)大看明白,能否解釋一下呢 另外,說(shuō)一下項(xiàng)目的情況,我是想實(shí)現(xiàn)雙機(jī)通信,另外一個(gè)設(shè)備通過(guò)串口發(fā)送信息,這臺(tái)設(shè)備通過(guò)出口得到信息后進(jìn)行動(dòng)作(現(xiàn)在使用的ledFlash()就是這個(gè)簡(jiǎn)單效果,這個(gè)函數(shù)在主函數(shù)跑以及在沒(méi)有if判斷的這個(gè)串行接收中斷函數(shù)中跑,都正常使得外部led閃爍,但是放到if語(yǔ)句就不執(zhí)行了,感覺(jué) if 語(yǔ)句中的布爾邏輯是TRUE,不知為什么) |
我嚴(yán)重懷疑,你是串口調(diào)試助手使用問(wèn)題,可能選擇了ASCII發(fā)送(這種情況下,單片機(jī)永遠(yuǎn)收不到0x01)。 應(yīng)該切換到十六進(jìn)制發(fā)送。 |
代碼不全,這類處理最好是放在主程序處理,而不是在中斷里處理 |
if(receiveData==0x01) { ledFlash(); } 放到 while(!TI); //等待發(fā)送數(shù)據(jù)完成里面呢? |
問(wèn)題當(dāng)然在出在ledFlash()函數(shù)。放在串口中斷里,每發(fā)生一次中斷,if判斷真后 ledFlash()函數(shù)只執(zhí)行一次。放在主循環(huán)中就不同了,if判斷真后只要receiveData沒(méi)有變化, ledFlash()函數(shù)永久重復(fù)執(zhí)行。 |
頂一下 |
northroom 發(fā)表于 2022-12-5 12:00 連續(xù)發(fā)了,還是不行 |
連續(xù)發(fā)了,不閃爍 |
和樓上觀點(diǎn)一樣:連續(xù)發(fā) 0x01,看是否閃爍。 |
連續(xù)發(fā) 0x01 看看是否能閃爍 |
Powered by 單片機(jī)教程網(wǎng)