标题: 单片机程序case后改为接字符怎么就不行了? [打印本页]

作者: 蓝琪    时间: 2018-11-1 17:00
标题: 单片机程序case后改为接字符怎么就不行了?
这是用单片机串口接收字符控制舵机的部分程序,按照下面的程序发送16进制的0和1能控制电机,但是改为case'a',case'b',然后发送字符a,b,都不能控制,为什么呢?请教怎么改?
typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;
u8 cmd;
void Com_Int(void) interrupt 4
{
        if(RI == 1)   //当硬件接收到一个数据时,RI会置位
        {
                cmd = SBUF; //这里接收到的是16进制
                RI = 0;  
                SBUF = cmd;               
        }
        switch(cmd)
                                {
                                case 0:
                                        SG1_count = 25;
                                        break;
                                case 1:
                                        SG1_count = 5;                        
                                        break;
                                default: break;
        }
        if (TI) //字节发送完毕
        {
                TI = 0; //手动清零发送中断标志位
        }              //TI清零
}

void Time0Int(void) interrupt 1 using 1
{
        if(count <= SG1_count) //控制占空比左右
    {
        //如果count的计数小于(5-25)也就是0.5ms-2.5ms则这段小t周期持续高电平。产生方波
        SG1_PWM = 1;
    }
    else
    {
        SG1_PWM = 0;
    }
            count++;
    if (count >= 200) //T = 20ms则定时器计数变量清0
    {
        count = 0;
    }
}


QQ截图20181101165812.png (44.34 KB, 下载次数: 18)

QQ截图20181101165812.png

QQ截图20181101170008.png (47.65 KB, 下载次数: 22)

QQ截图20181101170008.png

作者: qq948096770    时间: 2018-11-1 19:03
类型不对吧,switch(整数A)---case A的可能值
作者: mengzhixinheng    时间: 2018-11-1 19:26
case后面必须是整形常量
作者: 蓝琪    时间: 2018-11-1 22:50
qq948096770 发表于 2018-11-1 19:03
类型不对吧,switch(整数A)---case A的可能值

意思是要重新定义cmd的类型吗
作者: 那啊啊啊    时间: 2018-11-1 23:09
类型不对
作者: 51jia    时间: 2018-11-1 23:32
case(0):
case(1):
这样试一下。
作者: sxhwdz    时间: 2018-11-2 06:38
从编译后的汇编程序看,没有问题的,查查其他原因:

    20:         switch(cmd)
C:0x0035    E502     MOV      A,cmd(0x02)
C:0x0037    249E     ADD      A,#0x9E
C:0x0039    6008     JZ         C:0043
C:0x003B    04         INC      A
C:0x003C    7008     JNZ      C:0046
    21:                                 {
    22:                                 case 'a':  
    23:                                         SG1_count = 25;
C:0x003E    750319   MOV      SG1_count(0x03),#0x19
    24:                                         break;
C:0x0041    8003      SJMP     C:0046
    25:                                 case 'b':  
    26:                                         SG1_count = 5;                        
C:0x0043    750305   MOV      SG1_count(0x03),#0x05
    27:                                         break;
    28:                                 default: break;
    29:         }
作者: 蓝琪    时间: 2018-11-2 09:51
那啊啊啊 发表于 2018-11-1 23:09
类型不对

cmd的类型吗
作者: wulin    时间: 2018-11-2 11:54
发送字符a,b都不能控制的原因是在串口助手里要选择文本模式。文本模式下'a'=0x41,'b'=0x42。中断函数这样写试试。
void Com_Int(void) interrupt 4
{
        RI = 0;
        cmd = SBUF; //这里接收到的是16进制
        SBUF = cmd; //回传接收到的数据            
        while(!TI);        //等待发送中断请求标志位为1
        TI=0;                   //发送中断请求标志位清0
        switch(cmd)
        {
                case('a'): SG1_count = 25;break;
                case('b'): SG1_count = 5 ;break;
                default: break;
        }       
}





作者: 1035581800    时间: 2018-11-2 13:41
重新输入
作者: book100    时间: 2018-11-2 14:08
加个断点看看收到的是什么值
作者: Henson    时间: 2018-11-2 15:35
case之后应该是整形常量




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1