这个程序咋调不通,大神帮忙看下

2020-01-25 15:29发布

  1. #include <string.h>
  2. #include <STC15W204S.H>

  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit FMQ=P1^4;
  6. sbit LED1=P1^3;
  7. sbit LED2=P1^0;

  8. #define lenth 8 //数据长度 定义为8个数据为一帧,产生一次标志位
  9. uchar DAT[lenth],n;         //n用于记录当前接收了多少
  10. bit Flag=0;                //标志位
  11. //uchar Buff[20];//缓冲区
  12. //uchar dat[];
  13. uchar code tab1[]={0xC1,0x99,0x18,0x99,0x01,0x0A,0x55,0x6B};                 //开报警命令
  14. uchar code tab2[]={0xC1,0x99,0x19,0x99,0x01,0x0A,0x55,0x6C};                 //关报警命令

  15. uchar code tab3[]={0xC2,0x99,0x18,0x99,0x01,0x0A,0x55,0x6C};                 //回复开报警
  16. uchar code tab4[]={0xC2,0x99,0x19,0x99,0x01,0x0A,0x55,0x6B};                 //回复关报警

  17. //extern DELAY_MS(int x);         //延时毫秒
  18. //extern FMQ_KBJ(void);         //开蜂鸣器报警
  19. //extern FMQ_GBJ(void);         //关蜂鸣器报警
  20. //extern LED_KBJ(void);         //开led报警
  21. //extern LED_GBJ(void);         //关led报警
  22. //extern Send(uchar);
  23. /*延时毫秒函数*/
  24. void DELAY_MS(int x)     //延时毫秒
  25. {
  26. int i;
  27. while(x--)
  28. {
  29.   WDT_CONTR=0x36;
  30.   for(i=0;i<100;i++);
  31. }
  32. }
  33. /*串口初始化函数*/
  34. void UartInit(void)                //串口初始化
  35. {
  36. SCON = 0x50;                    //8位数据,可变波特率
  37. AUXR |= 0x40;                     //定时器1时钟为Fosc,即1T
  38. AUXR &= 0xFE;                    //串口1选择定时器1为波特率发生器
  39. TMOD &= 0x0F;                    //设定定时器1为16位自动重装方式
  40. TL1 = 0xE0;                    //设定定时初值
  41. TH1 = 0xFE;                    //设定定时初值
  42. ET1 = 0;                        //禁止定时器1中断
  43. TR1 = 1;                        //启动定时器1
  44. }

  45. /*开蜂鸣器报警函数*/
  46. void FMQ_KBJ(void)
  47. {
  48. while(1)
  49. {
  50.   WDT_CONTR=0x36;
  51.   FMQ=0;
  52.   DELAY_MS(500);
  53.   FMQ=1;
  54.   DELAY_MS(500);
  55. }
  56. }
  57. /*关蜂鸣器报警函数*/
  58. void FMQ_GBJ(void)
  59. {
  60. FMQ=1;
  61. }
  62. /*开led报警函数*/
  63. void LED_KBJ(void)
  64. {
  65. while(1)
  66. {
  67.   WDT_CONTR=0x36;
  68.   LED1=0;LED2=0;
  69.   DELAY_MS(200);
  70.   LED1=1;LED2=1;
  71.   DELAY_MS(200);
  72. /*   LED1=~LED1;LED2=~LED2;   */
  73. }
  74. }
  75. /*关led报警函数*/
  76. void LED_GBJ(void)
  77. {
  78. LED1=1;LED2=1;
  79. }
  80. /*主函数*/
  81. void main(void)
  82. {
  83. uint i;
  84. UartInit();
  85. LED_GBJ();
  86.   P1M1=0X00;
  87.   P1M0=0X19;
  88.     while(1)
  89.     {
  90.        if(Flag)                                            //判断标志位是否为1
  91.        {  
  92.           if(DAT[n]==tab1[i])                //较对
  93.                   {                         //表示 收到8个数据了
  94.                     ES=0;
  95.                    while(!TI)
  96.                    {
  97.                     for(i=0;i<8;i++)
  98.                     {
  99.                      SBUF=tab3[i];                    //返回一帧数据
  100.                         // while(!TI);
  101.              TI=0;
  102.                     }}
  103.                     FMQ_KBJ();
  104.                     LED_KBJ();
  105.                   }
  106.                   else if(DAT[n]==tab2[i])
  107.                   {
  108.                     ES=0;
  109.                     for(i=0;i<8;i++)
  110.                    {
  111.                     SBUF=tab4[i];                    //返回一帧数据
  112.                         while(!TI);
  113.             TI=0;
  114.                    }
  115.                     FMQ_GBJ();
  116.                     LED_GBJ();
  117.                   }
  118.                   else
  119.                   {
  120.                    TI=0;
  121.                   }
  122.                  ES=1;
  123.                  Flag=0;
  124.        }
  125.     }
  126. }

  127. /*发送单字节数据函数*/
  128. void Send(uchar m)
  129. {
  130. TI = 0;
  131. SBUF = m;
  132. while(!TI);
  133. TI = 0;       
  134. }

  135. /*串口中断接收一帧数据函数*/
  136. void Uart_interrupt(void) interrupt 4 using 3
  137. {      
  138.   {
  139.     if(RI)
  140.     {
  141.       RI = 0;
  142.       DAT[n++]=SBUF;
  143.       if(n==lenth)                  //判断接收到的数据是否为一帧
  144.       {
  145.          Flag=1;
  146.          n=0;
  147.       }
  148.     }
  149.   }
  150. }
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
如果
1楼-- · 2020-01-25 21:05
 精彩回答 2  元偷偷看……
binaimei2007
2楼-- · 2020-01-26 01:58
LZ也是发帖量上100的坛友了,怎么还是不会问问题呢,不说现象,只贴代码一般没人看。
如果
3楼-- · 2020-01-26 03:25
binaimei2007 发表于 2013-12-10 10:49
LZ也是发帖量上100的坛友了,怎么还是不会问问题呢,不说现象,只贴代码一般没人看。 ...

串口发送C1 99 18 99 01 0A 55 6B  接收到的却是1F 33 AE A6 EB 55 29 00 ;而且报警没反应;
  平时基本都是打酱油  100发帖都是打出来的 哈哈
binaimei2007
4楼-- · 2020-01-26 07:22
随便看了一下,LED_KBJ和FMQ_KBJ里面都有while(1)  都死在那了,这是什么意思?
如果
5楼-- · 2020-01-26 10:11
binaimei2007 发表于 2013-12-10 10:53
随便看了一下,LED_KBJ和FMQ_KBJ里面都有while(1)  都死在那了,这是什么意思?

让他一直报警,接收到命令才关
如果
6楼-- · 2020-01-26 12:34
 精彩回答 2  元偷偷看……

一周热门 更多>