ID0114 2023-05-30 11:19 采纳率: 100%
浏览 54
已结题

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

正常模式:直行时间显示数码管显示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; 
 }
 }

  • 写回答

3条回答 默认 最新

  • qq_29144129 2023-05-30 15:52
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月16日
  • 已采纳回答 6月8日
  • 创建了问题 5月30日

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。