找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2687|回复: 9
收起左侧

C语言switch语句问题,请单片机大虾门帮忙看看代码

  [复制链接]
回帖奖励 20 黑币 回复本帖可获得 20 黑币奖励! 每人限 1 次
ID:295535 发表于 2019-3-1 09:58 | 显示全部楼层 |阅读模式
#include "reg52.h"
  typedef unsigned char u8 ;  //定义变量参//
  typedef unsigned int u16  ;
  sbit    RED_A=P0^2; //A方向红灯
  sbit    YELLOW_A=P0^3;//A方向黄灯
  sbit    GREEN_A=P0^4;//A方向绿灯
  sbit     REDC_A=P0^0;  //A方向人行道红灯
  sbit     GREENC_A=P0^1;  //A方向人行道绿灯
  sbit    RED_B=P0^5;
  sbit    YELLOW_B=P0^6;
  sbit    GREEN_B=P0^7;
  sbit     REDC_B=P2^0;
  sbit     GREENC_B=P2^1;
void delay5s(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=165;c>0;c--)
        for(b=100;b>0;b--)
            for(a=150;a>0;a--);
}
void delay30s(void)   //误差 0us
{
    unsigned char a,b,c,n;
    for(c=254;c>0;c--)
        for(b=232;b>0;b--)
            for(a=253;a>0;a--);
    for(n=2440;n>0;n--);
}
  void jiaotongdeng()
  {
   switch()
{
  case1      RED_A=1;GREEN_B=1;GREENC_B=1;REDC_A=0;
       //A方向红灯    B向绿灯 B向人行道绿灯 A向行道红灯 亮灯
        RED_B=0;YELLOW_B=0;REDC_B=0;GREEN_A=0;GREENC_A=0; YELLOW_A=0  ;
      //B向红灯 B黄灯 B向行道红灯  A向绿灯 A向黄灯 A向行道绿灯    熄灯
        delay30s;
        RED_A=~RED_A;GREEN_B=~GREEN_B;GREENC_B=~GREENC_B;REDC_A=~REDC_A
     //A方向红灯 B向绿灯 B向人行道绿灯 A向行道绿灯 闪亮灯
      YELLOW_A=0;GREEN_A=0;GREENC_A= 0;RED_B=0;YELLOW_B=0;REDC_B=0
      //A方向黄灯 绿灯 行道绿灯   B方向红灯 黄灯  行道红灯 熄灯
     delay5s;
        break;
    case2  RED_B=1;GREEN_A=1;GREENC_A=1;REDC_B=0; //B向红灯亮灯
       RED_A=0;YELLOW_B=0;REDC_A=0;GREEN_B=0;GREENC_B=0; YELLOW_B=0  ;  //熄灯
       delay30s;
        RED_B=~RED_B;GREEN_A=~GREEN_A;GREENC_A=~GREENC_A;REDC_B=~REDC_B;
     //A方向红灯 B向绿灯 B向人行道绿灯 A向行道绿灯 闪亮灯
      YELLOW_B=0;GREEN_B=0;GREENC_B= 0;RED_A=0;YELLOW_A=0;REDC_A=0
      //A方向黄灯 绿灯 行道绿灯   B方向红灯 黄灯  行道红灯 熄灯
     delay5s;
     break;
   
}
  }
void main()
{
  while(1)
  {
   jiaotongdeng();
  }
}





这个是简单交通灯实验  在开发板上没有现象  请大虾们指点指点不胜感激

回复

使用道具 举报

ID:94031 发表于 2019-3-1 11:33 | 显示全部楼层
switch()括号里要有判断的变量名。
回复

使用道具 举报

ID:96682 发表于 2019-3-1 11:52 | 显示全部楼层
没电路图怎么知道哪错
回复

使用道具 举报

ID:91114 发表于 2019-3-1 11:57 | 显示全部楼层
switch(表达式) case 值
回复

使用道具 举报

ID:473159 发表于 2019-3-1 14:10 | 显示全部楼层
看看这个,简单明了
http://www.51hei.com/bbs/dpj-146299-1.html

评分

参与人数 1黑币 +10 收起 理由
zhengchong60 + 10 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:370231 发表于 2019-3-1 14:28 | 显示全部楼层
switch的一般形式如下:
switch (表达式)
{
    case 常量表达式1:    语句1
    case 常量表达式2:    语句2
       ┇
    case 常量表达式n:    语句n
    default:        语句n+1
}
说明:
1) switch 后面括号内的“表达式”必须是整数类型。也就是说可以是 int 型变量、char 型变量,也可以直接是整数或字符常量,哪怕是负数都可以。但绝对不可以是实数,float 型变量、double 型变量、小数常量通通不行,全部都是语法错误。

2) switch 下的 case 和 default 必须用一对大括号{}括起来。

3) 当switch后面括号内“表达式”的值与某个case后面的“常量表达式”的值相等时,就执行此case后面的语句。执行完一个case后面的语句后,流程控制转移到下一个case继续执行。如果你只想执行这一个case语句,不想执行其他case,那么就需要在这个case语句后面加上break,跳出switch语句。

再重申一下:switch是“选择”语句,不是“循环”语句。很多新手看到break就以为是循环语句,因为break一般给我们的印象都是跳出“循环”,但break还有一个用法,就是跳出switch。

4) 若所有的 case 中的常量表达式的值都没有与 switch 后面括号内“表达式”的值相等的,就执行 default 后面的语句,default 是“默认”的意思。如果 default 是最后一条语句的话,那么其后就可以不加 break,因为既然已经是最后一句了,则执行完后自然就退出 switch 了。

5) 每个 case 后面“常量表达式”的值必须互不相同,否则就会出现互相矛盾的现象,而且这样写造成语法错误。

6) “case常量表达式”只是起语句标号的作用,并不是在该处进行判断。在执行 switch 语句时,根据 switch 后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。

7) 各个 case 和 default 的出现次序不影响执行结果。但从阅读的角度最好是按字母或数字的顺序写。

8) 当然你也可以不要 default 语句,就跟 if…else 最后不要 else 语句一样。但最好是加上,后面可以什么都不写。这样可以避免别人误以为你忘了进行 default 处理,而且可以提醒别人 switch 到此结束了。

但是需要注意的是,default 后面可以什么都不写,但是后面的冒号和分号千万不能省略,省略了就是语法错误。很多新手在这个地方很容易出错,要么忘了分号,要么忘了冒号,所以要注意!

评分

参与人数 1黑币 +10 收起 理由
leng + 10 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:342197 发表于 2019-3-1 14:48 | 显示全部楼层
你所用的switch()语句中并无具体参数变量,无法进行case判断

评分

参与人数 1黑币 +5 收起 理由
leng + 5 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:471066 发表于 2019-3-1 21:58 | 显示全部楼层
这是调好的,拿去吧


#include "reg52.h"
typedef unsigned char u8 ;  //定义变量参//
typedef unsigned int  u16  ;
sbit     RED_A=P0^2; //A方向红灯
sbit     YELLOW_A=P0^3;//A方向黄灯
sbit     GREEN_A=P0^4;//A方向绿灯
sbit     REDC_A=P0^0;  //A方向人行道红灯
sbit     GREENC_A=P0^1;  //A方向人行道绿灯
sbit     RED_B=P0^5;
sbit     YELLOW_B=P0^6;
sbit     GREEN_B=P0^7;
sbit     REDC_B=P2^0;
sbit     GREENC_B=P2^1;
u8 i=1;
void delay5s(void)   //误差 0us
{
        u8 a,b,c;
    for(c=165;c>0;c--)
        for(b=100;b>0;b--)
            for(a=150;a>0;a--);
}
void delay30s(void)   //误差 0us
{
    u8 a,b,c;
    for(c=254;c>0;c--)
        for(b=232;b>0;b--)
            for(a=253;a>0;a--);
                       
}
void jiaotongdeng()
{
       
        switch(i)
        {
        case 1:      RED_A=1;GREEN_B=1;GREENC_B=1;REDC_A=0;
                //A方向红灯    B向绿灯 B向人行道绿灯 A向行道红灯 亮灯
        RED_B=0;YELLOW_B=0;REDC_B=0;GREEN_A=0;GREENC_A=0; YELLOW_A=0  ;
                //B向红灯 B黄灯 B向行道红灯  A向绿灯 A向黄灯 A向行道绿灯    熄灯
        delay30s();
        RED_A=~RED_A;GREEN_B=~GREEN_B;GREENC_B=~GREENC_B;REDC_A=~REDC_A;
                //A方向红灯 B向绿灯 B向人行道绿灯 A向行道绿灯 闪亮灯
                YELLOW_A=0;GREEN_A=0;GREENC_A= 0;RED_B=0;YELLOW_B=0;REDC_B=0;
                //A方向黄灯 绿灯 行道绿灯   B方向红灯 黄灯  行道红灯 熄灯
                delay5s();
        break;
               
    case 2:  RED_B=1;GREEN_A=1;GREENC_A=1;REDC_B=0; //B向红灯亮灯
                RED_A=0;YELLOW_B=0;REDC_A=0;GREEN_B=0;GREENC_B=0; YELLOW_B=0  ;  //熄灯
                delay30s();
        RED_B=~RED_B;GREEN_A=~GREEN_A;GREENC_A=~GREENC_A;REDC_B=~REDC_B;
                //A方向红灯 B向绿灯 B向人行道绿灯 A向行道绿灯 闪亮灯
                YELLOW_B=0;GREEN_B=0;GREENC_B= 0;RED_A=0;YELLOW_A=0;REDC_A=0;
                //A方向黄灯 绿灯 行道绿灯   B方向红灯 黄灯  行道红灯 熄灯
                delay5s();
                break;
                if(i==2) i=0;
               
        }
}
void main()
{
        while(1)
        {
                jiaotongdeng();
                if(i==2)i=1;
                else  i++;
        }
}
回复

使用道具 举报

ID:471066 发表于 2019-3-1 22:09 | 显示全部楼层
        这里还改一下if(i==2)i=1;改为if(i==3)i=1;

评分

参与人数 1黑币 +8 收起 理由
嘉立创AAA + 8 很给力!

查看全部评分

回复

使用道具 举报

ID:472242 发表于 2019-3-2 11:24 | 显示全部楼层
这个不是很难咯,怎么就迷糊了呢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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