微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机,无法进入串行口中断,求教

51单片机,无法进入串行口中断,求教

时间:10-02 整理:3721RD 点击:
main()中的check_gorge();可以传出一串“It's OK!”而void ser() interrupt 4中的check_gorge();什么也无法传出,也就是说无法进入串行口中断,求教这是什么原因?怎么解决?

  1. /*
  2.         agreement  =  0xff  +  ID_servo  +  ANGLE1  +  ANGLE2  +0xaa  
  3. */
  4. #include<reg51.h>
  5. #include<intrins.h>
  6. #include<stdio.h>
  7. #define uchar unsigned char
  8. #define uint unsigned int
  9. uchar count,angle;
  10. uchar ANGLE1,ANGLE2,ID_servo;
  11. uchar receive,step;
  12. uint flag_translate;
  13. sbit servo_01=P0^0;
  14. sbit servo_02=P0^1;
  15. sbit plus=P1^4;
  16. sbit minus=P1^5;
  17. //sbit dula=P2^6;
  18. //sbit wela=P2^7;
  19. /*void delayms(uint t)
  20. {
  21.         uint i,j;
  22.         for(i=t;t>0;t--)
  23.                 for(j=110;j>0;j--);
  24. } */
  25. void check_gorge();
  26. void init()
  27. {
  28.         TMOD=0x21;
  29.         SCON=0x50;
  30.         TH1=0xfd;
  31.         TL1=0xfd;
  32.         TH0=(65536-23)/256;
  33.         TL0=(65536-23)/256;
  34.         RI=1;
  35.         TR0=1;
  36.         TR1=1;
  37.         ET0=1;
  38.         ES=1;
  39.         EA=1;
  40. }
  41. void servo_time0() interrupt 1
  42. {
  43.         TH0=(65536-23)/256;
  44.         TL0=(65536-23)/256;
  45.         switch(ID_servo==1)
  46.         {
  47.                 case 1 :
  48.                         angle=ANGLE1*256+ANGLE2;
  49.                         if(count<angle)
  50.                                 servo_01=1;
  51.                         else
  52.                                 servo_01=0;
  53.                         count++;
  54.                         count=count%800;
  55.                         break;
  56.                 case 2 :
  57.                         angle=ANGLE1*256+ANGLE2;
  58.                         if(count<angle)
  59.                                 servo_02=1;
  60.                         else
  61.                                 servo_02=0;
  62.                         count++;
  63.                         count=count%800;
  64.                         break;
  65.         }               
  66. }
  67. void re_send(uchar receive)
  68. {
  69.         SBUF=receive;
  70.         while(!TI);
  71.         TI=0;
  72.         ES=1;
  73. }
  74. void check_gorge()
  75. {
  76.         ES=0;
  77.         TI=1;
  78.         puts("It's OK!\n");
  79.         while(TI!=0);
  80.         TI=0;
  81.         ES=1;
  82. }
  83. //agreement  =  0xff  +  ID_servo  +  ANGLE1  +  ANGLE2  +0xaa
  84. void ser() interrupt 4
  85. {
  86.         check_gorge();
  87.         while(RI!=0);
  88.         RI=0;
  89.         receive=SBUF;
  90.         flag_translate=1;
  91. }
  92. void main()
  93. {
  94.         init();
  95.         check_gorge();
  96.         while(1)
  97.         {
  98.                 if(flag_translate==1)
  99.                 {
  100.                         ES=0;
  101.                         flag_translate=0;
  102.                         switch(step)
  103.                         {
  104.                                 case 0 :
  105.                                         if(receive==0xff)
  106.                                         {
  107.                                                 step++;
  108.                                                 re_send(receive);
  109.                                         }
  110.                                 else
  111.                                                 step=0;
  112.                                         break;
  113.                                 case 1 :
  114.                                         ID_servo=receive;
  115.                                         re_send(receive);
  116.                                         step++;       
  117.                                         break;
  118.                                 case 2 :
  119.                                         ANGLE1=receive;
  120.                                         re_send(receive);
  121.                                         step++;
  122.                                         break;
  123.                                 case 3 :
  124.                                         ANGLE2=receive;
  125.                                         re_send(receive);
  126.                                         step++;
  127.                                         break;
  128.                                 case 4 :
  129.                                         if(receive!=0xaa)
  130.                                                 puts("error\n");
  131.                                         else
  132.                                                 re_send(receive);
  133.                                         step=0;
  134.                                 break;       
  135.                         }               
  136.                 ES=1;
  137.                 }                  
  138.         }
  139. }

复制代码


收藏啦,感觉好好的

程序太复杂了,建议先到网上下个简单的程序,串口收到数据就点一个灯就行,你看看人家是怎么编的

程序挺多的,设置断点慢慢排查、、、、、、

求问小编为什么我的只能调到0xf3 2400波特率才能正常传输,0xfc 9600就没用

#include<reg51.h>
void UartInit(void)                //9600bps@11.0592MHz
{
        SCON = 0x50;
        PCON=0;
        TMOD=0x20;
        TL1 = 0xFD;        
        TH1 = 0xFD;        
        TR1 = 1;               
        EA=1;
        ES=1;
}
void ys(int ms)
{
        int k,d;
        for(k=0;k<ms;k++)for(d=0;d<123;d++);
}
main()
{
        unsigned char v;
        UartInit();
        while(1)
        {
                {
                        while(RI==0);
                        v=SBUF;
                        RI=0;
                        P1=v;
                        SBUF=v;
                        while(TI==0);
                        TI=0;
                        //ys(10);
                }
        }

}这个是输入1,串口反馈一个1回来,你的程序长而且习惯差没有标注。我这个程序很短没有标注。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top