大神问什么第四个功能不能实现。。

2019-07-15 16:10发布

#include<STC12C5A60S2.h>
#include<intrins.h>

sbit key1 =P2^4;        //打开激光
sbit key2 =P2^5;         //关闭激光
sbit key3 =P2^6;         //加电流
sbit key4 =P2^7;          //减电流

char i=0;
unsigned int Ab=0;  //设置电流的
/////////////////ADC控制////////////////////////
void AD_init();
void delay(unsigned char a);
float AD_work();
float benc0[30],temp;
unsigned int  ADC_P;
/////////////////ADC控制/////////////////////

unsigned char table1[]={0xff,0x01,0x01,0x01,0x01,0x00,0x04}; //打开激光
unsigned char table2[]={0xff,0x01,0x01,0x01,0x00,0x00,0x03}; //关闭激光
unsigned char table3[]={0xff,0x01,0x01,0x02,0x00,0x00,0x04}; //加电流
unsigned char table4[]={0xff,0x01,0x01,0x05,0x2d,0xa0,0xd4}; //激光最小角度


void InitUART(void)       
{                                                                  
        TMOD=0x21;      //设置T0 T1 定时器为工作方式二 8位定时器计数器                       
        SCON = 0x50;    //串口1工作在方式1  10位异步收发 REN=1允许接收                                                                                                               
        IP = 0xF0;
        IPH = 0xf0;
        TR0=1;  //启用T0定时器/计数器
        PCON = 0x00;
        TH1  = 0xF4;   //定时器1初值  2400
        TL1  = 0xF4;
        TR1  = 1;      //定时器1开始计数
        EA   = 1;           //开总中断
//        ES   = 1;           //开串口1中断
         ES=0;

}

/****************串行口1发送****************/

void key_ALL()
{
    if(key1==0)
         {
           while(!key1)
           {}
           ES=0;
           for(i=0;i<7;i++)
           {
              //UART_1SendOneByte(table1[i]);
                        SBUF = table1[i];
                        while(!ti);           //若TI=0,在此数据等待发送结束
                        TI = 0;         
           }

         }

         if(key2==0)
         {
           while(!key2);
           {}
           for(i=0;i<7;i++)
           {
                     SBUF = table2[i];
                        while(!TI);           //若TI=0,在此数据等待发送结束
                        TI = 0;         
           }

         }



       


}
void main()
{

   InitUART();
   AD_init();
   while(1)
   {

        key_ALL();

        if(key3==0)
         {
           while(!key3)
           {}
          
                Ab =  Ab +5;
                if(Ab>254)
                {
                  Ab  = 254;
                }
           table4[4] =Ab;
           table4[6] =(5+Ab)%0x100;
           for(i=0;i<7;i++)
           {


                      SBUF = table3[i];
                        while(!TI);           //若TI=0,在此数据等待发送结束
                        TI = 0;         
           }

         }



         }
           if(key4==0)
         {
           while(!key4)
           {}
           for(i=0;i<7;i++)
           {
                     SBUF = table4[i];
                        while(!TI);           //若TI=0,在此数据等待发送结束
                        TI = 0;         
           }
         }


}


//         ADC_P =AD_work()*1000 ;
//         if(ADC_P>2000)
//         {
//                      for(i=0;i<7;i++)
//           {
//                      SBUF = table3[i];
//                        while(!TI);           //若TI=0,在此数据等待发送结束
//                        TI = 0;         
//           }
//         }
//         else
//         {
//            for(i=0;i<7;i++)
//           {
//                      SBUF = table4[i];
//                        while(!TI);           //若TI=0,在此数据等待发送结束
//                        TI = 0;         
//           }
//         }







/*AD模块数据处理,加数据平滑处理*/
float AD_work()
{
        float AD_val = 0;           //定义处理后的数值AD_val为浮点数
        unsigned char i;
        unsigned char k;
        for(i=0;i<30;i++)          //在这块位置提
        {
    ADC_CONTR=0x88|0x00;      //开启AD转换1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG   ADC_START CHS2 CHS1 CHS0
        _nop_();                           //要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR 寄存器
        _nop_();
        _nop_();
        _nop_();
        while(!(ADC_CONTR&0x10));    //等待转换完成
        ADC_CONTR&=0xe7;             //关闭AD转换,ADC_FLAG位由软件清0
    benc0[i]=(ADC_RES*4+ADC_RESL);   //返回AD转换完成的10位数据(16进制)

                }

          for(i=0;i<30;i++)            //经典部分 数据排序
                  {
                for(k=0;k<30-i;k++)
            if(        benc0[i]>benc0[i+1])
                {
                temp=benc0[i];benc0[i]=benc0[i+1];benc0[i+1]=temp;
                }
                }
        AD_val=(benc0[14]+benc0[15]+benc0[16])/3;
        AD_val=(AD_val*5)/1024;     //AD的参考电压是单片机上的5v,所以乘5即为实际电压值  2的10次方 1024
        return AD_val;
}
       
/*AD模块初始化*/
void AD_init()
{
        P1ASF =0x01;    //P1.0口全部作为模拟功能AD使用
        ADC_RES=0;      //清零转换结果寄存器高8位
        ADC_RESL=0;     //清零转换结果寄存器低2位
        ADC_CONTR=0x80; //开启AD电源
        delay(3);       //等待1ms,让AD电源稳定
}                                  
void delay(unsigned char a_time) //延时约1ms
{
        unsigned int i_time;
        while (--a_time!=0)
        //1T单片机i_time=600,若是12T单片机i_time=125
        for(i_time=600;i_time>0;i_time--);

}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。