breeze9867 2024-06-03 23:03 采纳率: 18.8%
浏览 3
已结题

这个代码为什么会让蜂鸣器一直响 为什么交通灯一直是led3和led4亮,不会进入下一布


#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int


sbit hong_1=P1^0;
sbit huang_1=P1^1;
sbit lv_1=P1^2;
sbit hong_2=P1^3;
sbit huang_2=P1^4;
sbit lv_2=P1^5;
sbit k1=P3^6;
sbit k2=P3^5;
sbit k3=P3^4;
sbit k4=P3^3;

bit setting_mode=0;

void delay(uint x) //yan 10 ms//
{
    while(x--)
    {
        uchar i,j,k;
        for(i=5;i>0;i--)
            for(j=4;j>0;j--)
                for(k=248;k>0;k--);
    }
}


uint n=10;
uchar utype=1;
uchar count=0;

uchar code table[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
uint num;           
uint i,j,k;


void countdown()      //num~0  num=10+_1*n
{
   while(1)
   {
            num=n;
      for(i=num;i>=0;i--) 
      {
         for(j=59;j>=0;j--)
         {
             for(k=500;k>=0;k--)
             {
                 P2=table[i/10];
                 P3=0xfe;
                 delay(2);
                    
                 P2=table[i%10];
                 P3=0xfd;
                 delay(2);
                    
                 P2=table[j/10];
                 P3=0xfb;
                 delay(2);
                    
                 P2=table[j%10];
                 P3=0xf7;
                 delay(2);
             }
          }
      }
   }
}            

void three()      //3~1
{
   while(1)
   {
      for(i=2;i>=0;i--) 
      {
         for(j=59;j>=0;j--)
         {
             for(k=500;k>=0;k--)
             {
                 P2=table[i/10];
                 P3=0xfe;
                 delay(2);
                    
                 P2=table[i%10];
                 P3=0xfd;
                 delay(2);
                    
                 P2=table[j/10];
                 P3=0xfb;
                 delay(2);
                    
                 P2=table[j%10];
                 P3=0xf7;
                 delay(2);
             }
          }
      }
   }
}            
    

uchar type=1;

void Traffic_lignt()
{
    switch(type)
    {
        case 1:
            hong_1=1;huang_1=1;lv_1=0;
            hong_2=0;huang_2=1;lv_2=1;
            countdown();
          delay(1000*n);   //yan 1000*n ms (10000ms +/-  1000ms)//
          type=2;
          break;
        case 2:
            delay(50);
          huang_1=~huang_1;
            three();
          if(++count!=6)   //shan 6 ci//
                return;
          count=0;
            type=3;
            break;
      case 3:
            hong_1=0;huang_1=1;lv_1=1;
            hong_2=1;huang_2=1;lv_2=0;
            countdown();
          delay(1000*n);
          type=4;
          break;
        case 4:
            delay(50);
          huang_2=~huang_2;
            three();
          if(++count!=6)
                return;
          count=0;
            type=1;
            break;
        }
}
            

void setting_mode_function()
{
    if (k3 == 0) 
    {
        delay(2); 
        setting_mode = 1; 
    }
    if (setting_mode) 
    {
        if (k4 == 0) 
        {
            delay(2); 
            setting_mode = 0; 
        }
        if (k1 == 0) 
        {
            delay(2); 
            n++; 
        }
        if (k2 == 0) 
        {
            delay(2); 
            if (n > 0)
                            n--; 
        }
    }
}
    

void main()
{
    while(1)
    {
        setting_mode_function();
        if (setting_mode==0) 
        {
            Traffic_lignt(); 
        }
    }
}
这个代码为什么会让蜂鸣器一直响
为什么交通灯一直是led3和led4亮,不会进入下一布
  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-06-03 23:03
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    这段代码是用于控制交通灯的51单片机程序。根据代码内容,我们可以分析出蜂鸣器持续响和交通灯不按预期顺序工作的原因。

    蜂鸣器持续响的原因

    蜂鸣器的控制通常与某个特定的I/O端口有关,但在提供的代码中并没有直接控制蜂鸣器的指令。如果蜂鸣器持续响,可能是因为:

    1. 硬件问题:蜂鸣器本身或其连接线路可能存在问题。
    2. 其他代码:如果这段代码不是完整的程序,可能在其他部分的代码中有控制蜂鸣器一直响的指令。
    3. 逻辑错误:如果蜂鸣器是通过某个LED端口间接控制的(例如,通过LED端口驱动一个晶体管来控制蜂鸣器),那么可能是逻辑错误导致该端口始终为高电平。

    交通灯不按预期顺序工作的原因

    交通灯的控制逻辑在Traffic_lignt()函数中,通过switch语句和case分支来实现。根据代码,交通灯不按预期顺序工作可能是因为:

    1. count变量未正确更新:在case 2case 4中,count变量应该在每次three()函数执行后增加,并在达到6次后重置为0。如果three()函数没有正确执行或count变量的更新逻辑有误,将导致无法进入下一个case

    2. delay()函数不准确delay()函数的延迟时间可能不够准确,导致count变量未能正确增加。这可能是由于delay()函数内部的循环次数设置不当。

    3. k系列按键未正确处理setting_mode_function()函数中处理按键输入,如果按键处理逻辑有误,可能会影响Traffic_lignt()函数的执行。

    解决方案

    1. 检查硬件:确保蜂鸣器和其连接线路没有问题。
    2. 审查delay()函数:确保delay()函数的延迟时间准确无误。
    3. 检查three()函数:确保three()函数能够正确执行,并在每次执行后正确更新count变量。
    4. 审查按键处理逻辑:确保setting_mode_function()函数中的按键处理逻辑正确无误。

    代码实现

    由于代码中没有直接控制蜂鸣器的部分,无法提供具体的代码实现。但是,你可以根据上述分析检查和修改代码。

    参考资料

    请注意,以上链接可能需要根据实际情况进行访问和验证。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月4日
  • 创建了问题 6月3日