找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9218|回复: 4
收起左侧

单片机定时器与串口中断不能一起吗?

[复制链接]
ID:125704 发表于 2016-6-7 19:03 | 显示全部楼层 |阅读模式
这个源码烧入单片机后好像不行,单片机没串口数据的时候就是开机的时候是正常的,一有数据了定时器0就挂了,就不会动了,求大神看看什么问题


  1. #include<reg52.h>
  2. #include<STDIO.H>//printf()
  3. #define uchar unsigned char
  4. #define uint unsigned int    //宏定义
  5. bit  RXAAOK;        //接收到[开头标志
  6. bit  RXFRMOK;       //接收一帧完整数据标
  7. bit  tflag;

  8. sbit S1=P0^0;
  9. sbit S2=P0^2;
  10. sbit S3=P0^3;
  11. sbit S4=P0^1;
  12. sbit FM=P0^4;
  13. sbit DS=P0^5;

  14. sbit keypad1=P1^0;
  15. sbit keypad2=P1^1;
  16. sbit keypad3=P1^2;
  17. sbit keypad4=P1^3;

  18. /*下面是数码管位选*/
  19. sbit one=P1^4;
  20. sbit two=P1^5;
  21. sbit three=P1^6;
  22. /*char code table[]={        0x3f,0x06,0x5b,
  23.                                         0x4f,0x66,0x6d,
  24.                                         0x7d,0x07,0x7f,0x6f};*/
  25. uint temp;
  26. uchar ketnum,t,RXBUF[10],RX_P;


  27. void main()
  28. {
  29.                 IP = 0x10;                //即设置串口中断为最高优先级

  30.             TMOD=0x21;      //定时器1的工作方式2,定时器0的工作方式1,16位
  31.                 TH1=0xfd;                //定时器1的初值,决定波特率9600
  32.                 TL1=0xfd;
  33.        
  34.                 TH0=0X4C;       //高八位的初值 50MS一次
  35.                 TL0=0X00;       //第八位的初值
  36.                                
  37.                 PCON=0x00;      //波特率倍增0x00不加倍         0x80加倍
  38.                 SCON=0x50;                //设置工作方式1 开启接受允许
  39.        
  40.                 EA=1;                    //开启总中断
  41.                 ES=1;                        //开启串口接受中断
  42.                 ET0=1;                        //允许定时器0发出中断
  43.                
  44.                 TR1=1;                        //计数器1开始运行
  45.                 TR0=1;                           //计数器0开始运行
  46.                 while(1)
  47.                 {
  48.                   if(RXFRMOK)
  49.                   {
  50.                           switch(RXBUF[0])
  51.                         {
  52.                                 case 'A' : S1=~S1;        
  53.                         }
  54.                   }       
  55.                 }

  56. }

  57.           
  58. void UARTO_ISR() interrupt 4  //接收中断,不同处理器可能是不同的函数声明
  59. {
  60.    uchar i;         //用处提取接收缓冲器的字符
  61.    if(RI)  
  62.    {   
  63.            i=SBUF;      //提取字符
  64.     RI=0;

  65.           if(RXFRMOK==0)   //判断是否接收到起始字符[
  66.           {  
  67.                   if(RXAAOK)    //如果接收到[,继续接收后面的字符
  68.                   {
  69.                         RXBUF[RX_P]=i;         //字符存入数组
  70.                     if((RX_P>3)&&(RXBUF[RX_P-3]==0x7C)&&(RXBUF[RX_P-2]==0x7D)&&(RXBUF[RX_P-1]==0x7E)&&(RXBUF[RX_P]==0x5D) )
  71.                     {
  72.                                 RXFRMOK=1;             //如果接收完成,置位RXFRMOK;
  73.                               RXAAOK=0;              //清零开始标志位RXAAOK
  74.                     }
  75.                         RX_P++;                //接收计数器加一
  76.               }
  77.             if(!RXAAOK&&(i==0x5B)) //字符[,协议格式:[数据|}~]
  78.             {
  79.                           RXAAOK=1;
  80.                        RX_P=0;
  81.             }
  82.      }
  83.          }
  84. }

  85. void Timer0() interrupt 1
  86. {
  87.     TH0=0x4C;
  88.         TL0=0x00;
  89.         t++;
  90.         S1=~S1;                        //PC串口发送数据过来后S1就不会翻转了
  91. }
复制代码



回复

使用道具 举报

ID:140068 发表于 2016-12-23 13:42 | 显示全部楼层
标志位放在最后清零试试
回复

使用道具 举报

ID:165641 发表于 2017-2-20 22:34 | 显示全部楼层
楼主这个问题解决了么?解决了告诉我啊啊。
回复

使用道具 举报

ID:165516 发表于 2017-2-21 08:53 | 显示全部楼层
同求这个问题
回复

使用道具 举报

ID:256741 发表于 2017-12-3 13:31 来自手机 | 显示全部楼层
解决了许多长期想解决
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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