不知道哪里错了,总是做不出来

正常模式:直行时间显示数码管显示60。此时南北段直行通行(绿灯)、东西段禁止(红灯)60s,倒计时到3s时,黄灯亮,提醒人们注意了。然后是东西段通行(绿灯),南北段禁行(红灯),一直循环下去。
繁忙模式:南北段、东西段的通行时间改为30s,其它与正常模式类似。
特殊模式:特殊模式红灯全亮,倒计时20s,到最后3秒黄灯闪3次后并转入正常模式

#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar i,a;
uint counter,ge,shi,temp;

sbit A_0=P0^3; //南北红  
sbit A_1=P0^4; //南北黄  
sbit A_2=P0^5; //南北绿
sbit B_0=P0^0; // 东西红 
sbit B_1=P0^1; //  东西黄  
sbit B_2=P0^2; //    东西绿
sbit WE1=P3^1; //    十位位选 
sbit WE2=P3^0; //     个位位  
sbit number=P1^5; //  正常模式开
sbit  busy=P1^6;  //   繁忙模式开
sbit  special=P1^7; //       特殊模式开
sbit number1=P1^0; //    正常指示灯
sbit  busy1=P1^1;  //     繁忙指示灯
 sbit  special1=P1^2;     //     特殊指示灯
sfr WDT=0xe1;    //       看门狗特殊存放器设置
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; 
void delay(uint time);     //延时函数声明
void initial();     //初始化函数声明
void status1();  //    状态1函数声明
void status2();     //    状态2函数声明
//显示函数
void display(){
    P0=table[shi];
    WE1=0;delay(1);
    WE1=1;
    P0=0xff;//delay(1);
    P0=table[ge];
    WE2=0;delay(1);
    WE2=1;}
//主函数
void main(){   //if(on==0){
//大循环
          WDT=0x34;
      initial();
   while(1){
        counter=temp;
    status1();
 //   WDT=0x37;
    counter=temp;
    status2();
//    WDT=0x37;
      }}
//初始化函数
void initial(){
    TMOD=0x01; 
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    EA=1;           //开总中断
    ET0=1;
    TR0=1;
    EX0=1;
    IT0=1;           //边沿触发
    temp=60;
    a=0;
}
//状态函数1
void status1(){
 A_1=1;B_1=1;    
    while(counter){        
    if(temp==60){
    number1=0;busy1=1;special1=1;}
    else{  if(temp==30){
        number1=1;busy1=0;special1=1;}
        else{if(temp==20){ 
            number1=1;busy1=1;special1=0;} }
    }
    display();
    if(a==1){
    A_0=0;A_2=1;      
    B_0=0;B_2=1;}
    else {
    A_0=0;A_2=1;      // 东西行,南北断
    B_0=1;B_2=0;}      //东西断,南北行
if(counter==3){
        if(i<=10){ 
        B_1=0;
        A_1=0;}
        else  {B_1=1;A_1=1;}}
    if(counter==2){
        if(i<=10){ B_1=0;A_1=0;}
        else  {B_1=1;A_1=1;}}
    if(counter==1){
        if(i<=10){ B_1=0;A_1=0;}
        else  {B_1=1;A_1=1;}}
    if(a==1&counter==0){temp=60;a=0;}
             }
    }
//状态函数1
void status2(){
 A_1=1;B_1=1;    
    while(counter){        
    if(temp==60){
    number1=0;busy1=1;special1=1;}
    else{  if(temp==30){
        number1=1;busy1=0;special1=1;}
        else{if(temp==20){ 
            number1=1;busy1=1;special1=0;} }
    }
    display();
    if(a==1){
    A_0=0;A_2=1;      
    B_0=0;B_2=1;}
    else {
    A_0=1;A_2=0;      // 东西行,南北断
    B_0=0;B_2=1;}      //东西断,南北行
if(counter==3){
        if(i<=10){ 
        B_1=0;
        A_1=0;}
        else  {B_1=1;A_1=1;}}
    if(counter==2){
        if(i<=10){ B_1=0;A_1=0;}
        else  {B_1=1;A_1=1;}}
    if(counter==1){
        if(i<=10){ B_1=0;A_1=0;}
        else  {B_1=1;A_1=1;}}
    if(a==1&counter==0){temp=60;a=0;}
             }
    }
//延时函数
void delay(uint time){
    uint a;
    for(;time>0;time--)
        for(a=10;a>0;a--);
    }
//定时器中断0
void timer() interrupt 1{
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    i++;
    if(i==20){
        counter--;
        WDT=0x34;
        i=0;
        shi=counter/10;
        ge=counter%10;}}
//外部中断0
void  EXTR0() interrupt 0 {
    if(number==0){
       temp=60;}
    if(busy==0){
        temp=30;}
    if(special==0){
        temp=20;
        counter=temp;
        number1=1;busy1=1;special1=0;
        a=1; 
 }
 }

可以参考一下这个
https://ask.csdn.net/questions/7935269/54184160?spm=1001.2014.3001.5504

代码看起来没啥问题 现在是有什么问题吗

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7526449
  • 这篇博客你也可以参考下:试分析下面的电路是几进制的计数器, 再分析电路是否可靠: 若不可靠, 请作出适当修改, 将电路修改正确(二〇二〇山东大学数字电路906综合题第5题)(全网第一手资料)
  • 除此之外, 这篇博客: 北航操作系统课程-第六次作业-进程与调度中的 北航操作系统课程-第六次作业-虚拟内存管理-页面置换 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

  • 北京航空航天大学计算机学院-2020春操作系统课程
    题目作者为北航计算机学院操作系统课程组,答案为博主原创。水平有限,无法保证作答正确性,如有错误敬请批评指正。部分作答源自百度谷歌等其他资料,如有侵权联系删除


    1 一个线程是否会被时钟中断剥夺CPU使用权?请分线程实现类型讨论。

    用户级线程不会被时钟中断剥夺CPU使用权。用户级线程在用户空间通过库函数实现,无需内核支持也不参与内核的调度,由用户程序自行调用、调度和维护。用户级线程不受内核时钟中断的影响,但如果其所在的进程时间片用完,自然整个进程的所有线程都会让出CPU。

    内核级线程由内核调度和维护,是可以被时钟中断单独剥夺CPU使用权的。

    对于混合线程实现方式,用户级线程和内核级线程之间有映射关系,一个线程是否会被时钟剥夺CPU使用权取决于其由哪一方控制。不论是Many-to-One, One-to-One, 还是Many-to-Many,其映射中内核级线程是可以被时钟中断剥夺CPU使用权的,而用户级线程的情况取决于其所映射的内核级线程,一旦内核级线程被剥夺CPU使用权,其所映射的用户级线程都将让出CPU。如果一个内核级线程映射多个用户级线程,其用户级线程不可单独被时钟中断剥夺CPU使用权;如果一个内核级线程只映射了一个用户级线程,那么中断掉内核级线程也就相当于中断掉了对应的用户级线程。


    2 一个软实时系统中有4个周期性进程,其周期分别为:50、100、200、250,每次CPU运行时长分别为:35、20、10、x,求使得这些进程可调度的最大x取值。

    若使用静态调度算法,RMS已被证明是静态最优调度算法,其推导了,当任务集满足 ∑i=1nCi/Ti≤n(2n−1)\sum_{i=1}^n C_i/T_i \leq n(\sqrt[n]2-1)i=1nCi/Tin(n21) 时一定可调度,在题目所述情况下有4个进程,不等式右侧为 4×(24−1)=0.756828464 \times (\sqrt[4]2-1)=0.756828464×(421)=0.75682846 ,将4个进程的运行时间和周期代入不等式左侧,得到 35/50+20/100+10/200+x/250≤0.7568284635/50+20/100+10/200+x/250 \leq 0.7568284635/50+20/100+10/200+x/2500.75682846 ,发现 xxx 必须是负数,说明上述条件得任务集是静态不可调度的。

    若使用动态的调度算法,只需要任务集满足 ∑i=1nCi/Ti≤1\sum_{i=1}^n C_i/T_i \leq1i=1nCi/Ti1 即可调度。 35/50+20/100+10/200+x/250≤135/50+20/100+10/200+x/250 \leq 135/50+20/100+10/200+x/2501 ,得到 x≤12.5x \leq 12.5x12.5


    3 有五个进程P1、P2、P3、P4、P5,它们同时依次进入就绪队列,它们的优先数和需要的处理器时间如下表。

    进程处理器时间优先级(数小优先级高)
    P1103
    P211
    P323
    P414
    P552

    忽略进行调度等所花费的时间,回答下列问题:

    1. 写出采用“先来先服务”、“短作业(进程)优先”、“非抢占式的优先数”和“轮转法”等调度算法,进程执行的次序。(其中轮转法的时间片为2)
    2. 分别计算上述算法中各进程的周转时间和等待时间,以及平均周转时间。

    四种调度算法下五个进程的执行顺序如下图所示:

    在这里插入图片描述

    先来先服务:

    进程周转时间等待时间执行时间
    P110010
    P211101
    P313112
    P414131
    P519145

    先来先服务的平均周转时间:(10+11+13+14+19)÷5=13.4(10+11+13+14+19)\div5=13.4(10+11+13+14+19)÷5=13.4

    短作业优先:

    进程周转时间等待时间执行时间
    P119910
    P2101
    P3422
    P4211
    P59145

    短作业优先的平均周转时间:(19+1+4+2+9)÷5=7(19+1+4+2+9)\div5=7(19+1+4+2+9)÷5=7

    非抢占式优先数:

    进程周转时间等待时间执行时间
    P116610
    P2101
    P318162
    P419181
    P5615

    非抢占式优先数的平均周转时间:(16+1+18+19+6)÷5=12(16+1+18+19+6)\div5=12(16+1+18+19+6)÷5=12

    时间片轮转(时间片为2):

    进程周转时间等待时间执行时间
    P119910
    P2321
    P3532
    P4651
    P515105

    时间片轮转(时间片为2)的平均周转时间:(19+3+5+6+15)÷5=9.6(19+3+5+6+15)\div5=9.6(19+3+5+6+15)÷5=9.6

  • 您还可以看一下 黄菊华老师的微信小程序同城交易平台 多用户二手校园信息交易平台 仿闲鱼58同城 毕业设计 指导课程中的 项目导入、广告的设置小节, 巩固相关知识点