找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1850|回复: 11
打印 上一主题 下一主题
收起左侧

单片机程序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
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:419303 发表于 2018-11-1 19:03 | 只看该作者
类型不对吧,switch(整数A)---case A的可能值
回复

使用道具 举报

板凳
ID:89515 发表于 2018-11-1 19:26 | 只看该作者
case后面必须是整形常量
回复

使用道具 举报

地板
ID:213280 发表于 2018-11-1 22:50 来自手机 | 只看该作者
qq948096770 发表于 2018-11-1 19:03
类型不对吧,switch(整数A)---case A的可能值

意思是要重新定义cmd的类型吗
回复

使用道具 举报

5#
ID:419452 发表于 2018-11-1 23:09 | 只看该作者
类型不对
回复

使用道具 举报

6#
ID:141497 发表于 2018-11-1 23:32 | 只看该作者
case(0):
case(1):
这样试一下。
回复

使用道具 举报

7#
ID:387733 发表于 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:         }
回复

使用道具 举报

8#
ID:213280 发表于 2018-11-2 09:51 来自手机 | 只看该作者
那啊啊啊 发表于 2018-11-1 23:09
类型不对

cmd的类型吗
回复

使用道具 举报

9#
ID:213173 发表于 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;
        }       
}




回复

使用道具 举报

10#
ID:419630 发表于 2018-11-2 13:41 | 只看该作者
重新输入
回复

使用道具 举报

11#
ID:415069 发表于 2018-11-2 14:08 | 只看该作者
加个断点看看收到的是什么值
回复

使用道具 举报

12#
ID:281060 发表于 2018-11-2 15:35 | 只看该作者
case之后应该是整形常量
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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