m0_59232360 2021-12-08 20:59 采纳率: 0%
浏览 111

基于C51单片机交通灯代码运行出错,看不出哪里错误

问题遇到的现象和发生背景

代码运行出错,看不出来哪里错误

问题相关代码,请勿粘贴截图

img

#include <reg51.h>
#include <stdio.h>

unsigned  char second=20, time0 = 100 ,time1=50,county=6;//定时计数变量
unsigned char seg[]={0x0f,0x1f,0x2f,0x3f,0x4f,0x5f,0x6f,0x7f,0x8f,0x9f}; //BCD字段码
unsigned char con[]={0xfe,0xfd};  //位选
sbit NB_G=P0^0; 
sbit NB_Y=P0^1;
sbit NB_R=P0^2;
sbit DX_G=P0^3;
sbit DX_Y=P0^4;
sbit DX_R=P0^5;
bit DXT=1;   //初始设定东西通,切换方向
void showtime();  //子函数原型声明,显示函数
main(){
    unsigned int i,j;
    for(j=6;j>=1;j--){   //开始所有灯闪烁几次
        P0=~P0;
        for(i=50000;i>0;i--);}
    P0=0xFF;      
    for(i=50000;i>0;i--);
    NB_R=0;DX_G=0;   //南北红(P02),东西绿(P03)
    showtime(); //调用显示函数
    TMOD=0X11;    //定时器0、1设为工作方式1
    TL0=-10000;TH0=-10000>>8;   //装初值,10ms定时
    TL1=-10000;TH1=-10000>>8; 
    EA=1;ET0=1;ET1=1;   //开中断
    TR0=1;     //启动T0
    while(1);
}
void isr_time0() interrupt 1{
       TL0=-10000;TH0=-10000>>8; 
       showtime(); //调用显示函数
       time0--;    
       if (time0==0){   //到1s
            time0=100;
            second--;//改变数码管显示值
            showtime();   //动态显示刷新
            if (second==0){   //到20s
                TR0=0; TR1=1;  //关闭T0、启动T1
                second=3;   //从3开始倒计时
                showtime();  //动态显示刷新
                if (DXT){   //是否东西通
           DX_G=1;
           DX_Y=0; }    //东西黄亮
                else{
           NB_G=1;
           NB_Y=0; }  //南北黄亮
            }
       }
}
void isr_time1()interrupt 3{
   TL1=-10000;
   TH1=-10000>>8;
   showtime(); //调用显示函数
   time1--;  
   if(time1==0){   //到0.5s
      time1=50;
      if (county%2!= 0) {
     second--;  //到1s
     showtime(); } //动态显示刷新
    county--; 
     if(county){  //闪烁未结束
        if(DXT){DX_Y=~DX_Y;}
        else{NB_Y=~NB_Y;}
        }
      else{   //闪烁结束
         county=6;
         if (DXT){   //切换灯的状态
        DX_Y=1;DX_R=0;
        NB_R=1;NB_G=0;
        }
        else{
           DX_R=1;DX_G=0;
           NB_Y=1;NB_R=0;
           }  
                TR1=0;TR0=1;  //关闭T1、启动T0
                DXT=~DXT;     //另一方向通车
                second=20;   //从20开始倒计时
                showtime();}
    }
}  //动态显示刷新
void showtime(){  //显示子函数
    unsigned int i,j;
    //unsigned char time[2];
    //time[0]=second/10;   //十位
    //time[1]=second%10;  //个位
   //for(j=10000000;j>0;j--);    
    //P1=0xFF;   //关闭位选
    for(i=10;i>=0;i--){
       P1=seg[i];  //数据、位选同时送出
       for(j=1000000000;j>0;j--);        //延时
    }
}


运行结果及报错内容
"D:\Program Files (x86)\Proteus 8 Professional\Tools\MAKE\RunTool.exe" --good-exits=0,1 --executable=BL51.exe "main.OBJ" TO "Debug.OMF"  

BL51 BANKED LINKER/LOCATER V6.22 - SN: Eval Version
make: *** [Debug.OMF] Error 1

COPYRIGHT KEIL ELEKTRONIK GmbH 1987 - 2009

*** ERROR L121: IMPROPER FIXUP
    MODULE:  MAIN.OBJ (MAIN)
    SEGMENT: ABSOLUTE
    OFFSET:  000BH

*** ERROR L121: IMPROPER FIXUP
    MODULE:  MAIN.OBJ (MAIN)
    SEGMENT: ABSOLUTE
    OFFSET:  001BH

******************************************************************************
* RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT; USED: 018DH BYTE (19%) *
******************************************************************************

Program Size: data=27.1 xdata=0 code=541
LINK/LOCATE RUN COMPLETE.  0 WARNING(S),  2 ERROR(S)
错误代码2

我想要达到的结果

开始所有灯闪烁三次,先南北红灯,东西绿灯,并倒计时20秒;倒计时结束南北红灯不变,东西黄灯闪烁三次并倒计时3秒;然后东西红灯,南北绿灯,并倒计时20秒;倒计时结束东西红灯不变,南北黄灯闪烁三次并倒计时3秒,反复循环

  • 写回答

1条回答 默认 最新

  • qllaoda 2021-12-08 21:28
    关注

    因为你的编译器是试用版,你的代码超出了试用版的限制范围。
    另外,你这个错误不是运行错误,是编译错误,根本没编译出来,谈何运行。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 12月8日

悬赏问题

  • ¥15 使用C#,asp.net读取Excel文件并保存到Oracle数据库
  • ¥15 C# datagridview 单元格显示进度及值
  • ¥15 thinkphp6配合social login单点登录问题
  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配