找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2858|回复: 6
收起左侧

关于单片机定时器与串口中断冲突

[复制链接]
ID:306086 发表于 2021-3-24 20:47 | 显示全部楼层 |阅读模式
100黑币
本帖最后由 Elilala 于 2021-3-25 10:00 编辑

使用PWM控制电机转速,同时实时使用串口采集温度。同时TR0=1,TR1=1时温度采集出错。将TR0=1注释掉后正确,但是无法控制电机转速,只能启动。部分代码如下:
  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. }
复制代码







1616595601(1).jpg

DS18B20.rar

117.12 KB, 下载次数: 3

回复

使用道具 举报

ID:306086 发表于 2021-3-24 20:48 | 显示全部楼层
采用串口助手控制电机转速与采集温度。
2代表启动,3反转,0加速,1减速,4停止,5复位。
回复

使用道具 举报

ID:390416 发表于 2021-3-24 21:41 | 显示全部楼层
DS18B20是串口?你确定没搞错?
回复

使用道具 举报

ID:306086 发表于 2021-3-24 21:47 | 显示全部楼层
将TMOD=0x21后能正确读取温度,并且可以控制风扇转速,可是温度读取会偶尔出现错误。
回复

使用道具 举报

ID:306086 发表于 2021-3-25 09:28 | 显示全部楼层
人人学会单片机 发表于 2021-3-24 21:41
DS18B20是串口?你确定没搞错?

更新了一下代码。DS18B20读到的数据通过串口发送给上位机。
回复

使用道具 举报

ID:811405 发表于 2021-3-25 16:03 | 显示全部楼层
串口实时发送温度值给上位机,每一次发送之间没有时间间隔,当上位机通过串口下发指令时,串口被占用而产生错误

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:390416 发表于 2021-3-25 16:14 | 显示全部楼层
串口的发送 不能拥挤,比如9600波特率 发一个字节需要1ms  那么 连续两次写入SBUF 时间间隔必须大于1040us 。 可以看看我发的贴子, 串口发送不需要while 死等。提高CPU效率。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表