找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關(guān)于單片機(jī)定時器與串口中斷沖突

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
100黑幣
本帖最后由 Elilala 于 2021-3-25 10:00 編輯

使用PWM控制電機(jī)轉(zhuǎn)速,同時實(shí)時使用串口采集溫度。同時TR0=1,TR1=1時溫度采集出錯。將TR0=1注釋掉后正確,但是無法控制電機(jī)轉(zhuǎn)速,只能啟動。部分代碼如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include "Delay.h"
  4. #include <ds18b20mul.h>
  5. #include <uart.h>
  6. #include "motor.h"
  7. #define uchar unsigned char
  8. #define uint unsigned int

  9. void delay(uint j)
  10. {
  11. uint x;
  12. for(x=0;x<j;x++);
  13. }        

  14. void uart(void) interrupt 4                 
  15. {
  16.         unsigned char recv_data
  17.         if(RI)  
  18.                 {
  19.                 RI=0;
  20. //                        revbuf[revlen]=SBUF
  21.                 recv_data = SBUF;           
  22.                 revbuf[revlen]=SBUF;
  23.                         if(revbuf[0]=='*'
  24.                         {
  25.                                 if((revlen<16)&&(revbuf[revlen]!='\r'))
  26.                                         revlen++;
  27.                                 else revover=1;
  28.                         }
  29. //                        else clearrevbuf();
  30.                         if(recv_data == '0'
  31.                         {                        
  32.                                 if(speedA>0)speedA-=2;
  33.                                 if(speedB>0)speedB-=2;
  34.                         }
  35.                         else if(recv_data == '1')
  36.                         {
  37.                                 if(speedA<=20)speedA+=2;
  38.                                 if(speedB<=20)speedB+=2;
  39.                         }                                 
  40.                         else if(recv_data == '2')
  41.                         {
  42.                                 motorA_forward();
  43.                                 motorB_forward();        
  44.                         }
  45.                         else if(recv_data == '3')
  46.                         {
  47.                                 motorA_reversal();
  48.                                 motorB_reversal();                                       
  49.                         }
  50.                         else if(recv_data == '4')
  51.                         {
  52.                                 speedA=20;
  53.                                 speedB=20;                                       
  54.                         }
  55.                         else if(recv_data == '5')
  56.                         {
  57.                                 speedA=10;
  58.                                 speedB=10;                                       
  59.                         }
  60.                 }
  61. //        else   
  62. //                {
  63. //                  TI=0;
  64. //                  //sending=0;
  65. //                }
  66.                 if(TI)
  67.                 {
  68.                         TI=0;
  69.                 }
  70.         }


  71. void main()
  72. {
  73. UARTinit()
  74. // motor_Init();
  75. while(1
  76. {
  77.            delay(500000)
  78.            GetData(1)
  79.            sendstring("*1:");
  80.            sendstring(dispBuf);sendstring("\r\n")
  81.            GetData(2); //
  82.            sendstring("*2:");
  83.            sendstring(dispBuf);sendstring("\r\n")
  84. }
  85. }
復(fù)制代碼







1616595601(1).jpg (288.24 KB, 下載次數(shù): 90)

1616595601(1).jpg

DS18B20.rar

117.12 KB, 下載次數(shù): 3

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:306086 發(fā)表于 2021-3-24 20:48 | 只看該作者
采用串口助手控制電機(jī)轉(zhuǎn)速與采集溫度。
2代表啟動,3反轉(zhuǎn),0加速,1減速,4停止,5復(fù)位。
回復(fù)

使用道具 舉報

板凳
ID:390416 發(fā)表于 2021-3-24 21:41 | 只看該作者
DS18B20是串口?你確定沒搞錯?
回復(fù)

使用道具 舉報

地板
ID:306086 發(fā)表于 2021-3-24 21:47 | 只看該作者
將TMOD=0x21后能正確讀取溫度,并且可以控制風(fēng)扇轉(zhuǎn)速,可是溫度讀取會偶爾出現(xiàn)錯誤。
回復(fù)

使用道具 舉報

5#
ID:306086 發(fā)表于 2021-3-25 09:28 | 只看該作者
人人學(xué)會單片機(jī) 發(fā)表于 2021-3-24 21:41
DS18B20是串口?你確定沒搞錯?

更新了一下代碼。DS18B20讀到的數(shù)據(jù)通過串口發(fā)送給上位機(jī)。
回復(fù)

使用道具 舉報

6#
ID:811405 發(fā)表于 2021-3-25 16:03 | 只看該作者
串口實(shí)時發(fā)送溫度值給上位機(jī),每一次發(fā)送之間沒有時間間隔,當(dāng)上位機(jī)通過串口下發(fā)指令時,串口被占用而產(chǎn)生錯誤

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

7#
ID:390416 發(fā)表于 2021-3-25 16:14 | 只看該作者
串口的發(fā)送 不能擁擠,比如9600波特率 發(fā)一個字節(jié)需要1ms  那么 連續(xù)兩次寫入SBUF 時間間隔必須大于1040us 。 可以看看我發(fā)的貼子, 串口發(fā)送不需要while 死等。提高CPU效率。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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