打印
[AVR单片机]

求助:atmega16运行跑飞

[复制链接]
963|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kingdian1983|  楼主 | 2014-3-19 20:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
kingdian1983|  楼主 | 2014-3-19 21:01 | 只看该作者
void test(void)
{
        run_state=T_B;
        PORTD|=0x1b;
        for(;;) {
                if (warn!=0||run_stop==0) {
                        PORTD=0;
                        break;
                }
                if(run_mode!=RUN_NORMAL){
                        break;
                }
                Pause();
                PineTesting();
                if(flag_monitor_ok!=0){
                        flag_monitor_ok=0;
                        clear_p=RealPressure();
                }

                if(time_out>TIMEOVER){//判断计时是否超30S,超过报警
                        Warning(1);
                        flag_timeout_ok=0;
                        time_out=0;
                }
               
                switch(run_state){
                        case T_B://状态1
                                if((clear_p>=p_min) && (minus==1)){//转到下一状态
                                        PORTD=0x1f;
                                        time_keep=0;
                                        flag_keep_ok=1;
                                        flag_keeprun_ok=0;
                                        run_state=K_B;
                                        flag_timeout_ok=0;//关闭30S计时
                                        if(time_out>TIMEOVER){//判断计时是否超30S,超过则报警
                                                Warning(1);
                                                flag_timeout_ok=0;
                                                time_out=0;
                                        }else{//否则重新开始下一轮计时
                                                time_out=0;
                                                flag_timeout_ok=1;//打开30S计时
                                        }
                                        flag_timereduce_ok=0;//关闭5S递减计时
                                        if(time_reduce!=0){//判断计时是否超5S,不超过报警
                                                Warning(2);
                                                flag_timereduce_ok=0;
                                                time_reduce=TIMEREDUCE;
                                        }else{//否则重新开始下一轮计时
                                                time_reduce=TIMEREDUCE;
                                                flag_timereduce_ok=1;
                                        }
                                }
                        case K_B://状态2
                                if(flag_keeprun_ok==1 && (clear_p<p_min-5)) {
                                        PORTD=0x1b;
                                        flag_keeprun_ok=0;
                                }
                                if(clear_p>=p_min+2){
                                        PORTD=0x1f;
                                }
                                if(flag_keep_ok!=1){//转到下一状态
                                        PORTD=0x15;
                                        flag_ph=0;
                                        run_state=B_T;
                                }
                                break;
                        case B_T://状态3
                                if((clear_p>5) && (flag_ph==0) && (minus==0)){
                                        flag_ph=1;
                                        PORTD=0x17;
                                }
                                if ((clear_p>=p_max) && (minus==0)) {//转到下一状态
                                        PORTD=0x1f;
                                        time_keep=0;
                                        flag_keep_ok=1;
                                        flag_keeprun_ok=0;
                                        run_state=K_T;
                                        flag_timeout_ok=0;//关闭30S计时
                                        if(time_out>TIMEOVER){//判断计时是否超30S,超过则报警
                                                Warning(1);
                                                flag_timeout_ok=0;
                                                time_out=0;
                                        }else{//否则重新开始下一轮计时
                                                time_out=0;
                                                flag_timeout_ok=1;//打开30S计时
                                        }
                                        flag_timereduce_ok=0;//关闭5S递减计时
                                        if(time_reduce!=0){//判断计时是否超5S,不超过则报警
                                                Warning(2);
                                                flag_timereduce_ok=0;
                                                time_reduce=TIMEREDUCE;
                                        }else{//否则重新开始下一轮计时
                                                time_reduce=TIMEREDUCE;
                                                flag_timereduce_ok=1;
                                        }
                                }
                                break;
                        case K_T://状态4
                                if(flag_keeprun_ok==1 && (clear_p<p_max-10)) {
                                        PORTD=0x17;
                                        flag_keeprun_ok=0;
                                }
                                if(clear_p>=p_max+2){
                                        PORTD=0x1f;
                                }
                                if(flag_keep_ok!=1){
                                        PORTD=0x1b;
                                        flag_pmax=1;
                                        clear_count++;
                                        flow_in+=CLEAR_LIQIUD;
                                        if (clear_count>999) clear_count=0;
                                        if (flow_in>50000) flow_in=0;
                                        run_state=T_B;
                                }
                                break;
                        default:
                                break;
                }
                DisplayNum(1,1);//显示
    }
}

使用特权

评论回复
板凳
kingdian1983|  楼主 | 2014-3-19 21:06 | 只看该作者
unsigned char readAdc(unsigned char chanel)
{
        unsigned char i;
        unsigned char dat=0;
        unsigned char dat1=0;
        unsigned char dat2=0;
        PORTB|=0x08;//准备
        NOP();
        PORTB&=0xf7;//片选有效cs
    Delay_us();
        PORTB&=0xfe;
        Delay_us();
        PORTB|=0x02;//启动信号
    Delay_us();
        PORTB|=0x01;//第一个下降沿
    Delay_us();
        PORTB&=0xfe;
        Delay_us();
        PORTB|=0x02;//SGL,单极性
    Delay_us();
        PORTB|=0x01;//第二个下降沿
    Delay_us();
        PORTB&=0xfe;
        Delay_us();
        if(chanel==0){//通道0//通道选择
                PORTB&=0xfd;
        } else{//通道1
                PORTB|=0x02;
        }
    Delay_us();
        PORTB|=0x01;//第三个下降沿
    Delay_us();
        PORTB&=0xfe;
    Delay_us();
        Delay_us();
        for(i=0;i<8;i++){//读取一个字节,高位在前
                PORTB|=0x01;
                Delay_us();
                PORTB&=0xfe;
                Delay_us();
                dat1=PINB;
                dat=dat<<1;
                if((dat1&0x04)==0x04){
                        dat|=0x01;
                }else{
                        dat|=0x00;
                }
        }
        Delay_us();
        for(i=0;i<8;i++){//读取一个字节,低位在前
                PORTB|=0x01;
                Delay_us();
                PORTB&=0xfe;
                Delay_us();
                dat1=PINB;
                dat2=dat2<<1;
                if((dat1&0x04)==0x04){
                        dat2|=0x01;
                }else{
                        dat2|=0x00;
                }
        }
        PORTB|=0x08;//拉高片选
        PORTB&=0xfe;//拉低时钟
        Delay_us();
        return dat;
}

unsigned char RealPressure(void)//压力值读取
{
        unsigned char temp;
        unsigned char nPress;
        unsigned char nPress1;
        unsigned char nPress2;
        temp=readAdc(0);
        if(temp<=50||temp>=186){
                flag_adcover=1;
        }else{
                flag_adcover=0;
                time_adcover=0;
        }
        if(temp>=p_zero){
                minus=0;
                nPress=temp-p_zero;
                nPress2=nPress;
                nPress1=nPress+(nPress2>>=3);
                nPress=nPress1+nPress1/6;
        }else{
                minus=1;
                nPress=p_zero-temp;
                nPress2=nPress;
                nPress1=nPress+(nPress2>>=3);
                nPress=nPress1+nPress1/6;
               
        }
        if(nPress>(p_min+5)||nPress>(p_max+5)){/
                flag_pover=1;
        }else{
                flag_pover=0;
                time_pover=0;
        }
        return nPress;
}

void PineTesting(void)
{
        unsigned char br=0;
        br=readAdc(1);
        if(br<50){
                flag_leak=1;
        }else{
                time_leak=0;
                flag_leak=0;
        }
}

void Warning(unsigned char nAlarm)//警报声光提示
{
     run_stop=0;
         PORTD=0x80;
         second_flag=1;
         switch(nAlarm)
         {
          case 1:
                 warn=1;
                 state0|=0x02;
                         break;
          case 2:
                 warn=2;
                 flow_alarm|=0x10;
                 break;
          case 3:
                 warn=3;
                 state1|=0x02;
                 break;
          case 4:
                 warn=4;
                 leak_alarm|=0x10;
                         break;
          default:
                 warn=0;
                 break;
         }          
}

使用特权

评论回复
地板
kingdian1983|  楼主 | 2014-3-19 21:08 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝