⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 20090309161950f65785[1].txt

📁 /8051单片机TLC1549数据采集程序源代码 //单片机:At89S52 //连接类型:232 |485 接口
💻 TXT
📖 第 1 页 / 共 5 页
字号:
                        //--------------- 
                        ComBuf[1]=w;//发送第几次采集的序号 
                        Convert_AD_VOL_ValueToChar(vol);//对float转为2位char型,并发送至串行口 

                        P2=0xff;//p2口置初始状态 
                        } 
                        } 



                        /*--------------------------------------------------------------- 

                        * * 
                        * TLC1549数据软件滤波采集 * 
                        * * 
                        -----------------------------------------------------------------*/ 

                        void GetAD_With_VOL_Filter() 
                        { 
                        uchar i,w,j,k,PickCount,AD_Hight=0,AD_Low=0; 
                        uint Vol=0,VolArray[10],temp; 
                        float SumVol=0; 
                        Befor_Once_AD();//预先采集一次AD数据 
                        //--------------- 
                        //--------------- 
                        PickCount=11; 
                        for(w=0;w<=PickCount;w++) 
                        { 
                        ADCLK=ADOUT=0; 
                        Vol=0; 
                        ADCS=0; //开启控制电路,使能DATA OUT和I/O CLOCK 
                        for(i=1;i<=10;i++) 
                        { 
                        //给一个脉冲 
                        ADCLK=1; 
                        Vol<<=1; 
                        if(ADOUT)Vol|=0x01; 
                        ADCLK=0; 
                        } 
                        ADCS=1; 
                        delay(21);//两次转换间隔大于21us 
                        VolArray[w]=Vol;//保存采集来的数据 
                        //--------------- 
                        P2=0xff;//p2口置初始状态 
                        } 
                        //-------按从小到大排序-------- 
                        //选择排序法.. 
                        for(i=0;i<=PickCount-1;i++) 
                        { 
                        k=i; 
                        for(j=PickCount+1;j<i;j++) 
                        { 
                        if(VolArray[j]>VolArray[k])k=j; 
                        if(k!=i) 
                        { 
                        temp=VolArray[k]; 
                        VolArray[k]=VolArray[i]; 
                        VolArray[i]=temp; 
                        } 
                        } 
                        } 
                        //----------累加计算平静均值------------ 
                        //乎略最小和最大值 
                        for(i=1;i<=PickCount-1;i++) 
                        { 
                        SumVol=SumVol+VolArray[i];//累加结果 
                        } 
                        SumVol=SumVol/(PickCount-1)*0.0048;//电压值=平均值*介数 
                        /*------------------------------ 
                        0时为正常采集,1为CD4051循环采集 
                        因为CD4051通道存在电压消耗, 
                        所以和正常的直接采集的校准值不一样 
                        -------------------------------*/ 
                        /*电压校准比*/ 
                        if(CD4051_Vol_Conver_Flag) 
                        SumVol*=AD_Loop_PickVol_PER;//采用CD4051时的电压校准值 
                        else 
                        SumVol*=AD_VOL_PER;//直接输入时的电压校准值 

                        //---------------- 
                        temp=SumVol*100;//保留2位小位 
                        AD_Hight=temp /100;//取个位数 
                        AD_Low=temp-AD_Hight*100;//取2位小数 
                        //ComBuf[1]=w;//发送第几次采集的序号 
                        ComBuf[2]=AD_Hight; 
                        ComBuf[3]=AD_Low; 
                        SendByteArray();//发送数据 
                        } 



                        /*-------------------------------------------------------------------------* 

                        * * 
                        * CD4051_PickVol...8路选通TLC1549采集 * 
                        * * 
                        *-------------------------------------------------------------------------*/ 

                        void CD4051_PickVol() 
                        { 
                        CD4051_Vol_Conver_Flag=1; 
                        P1=CD4051_NUM[ComBuf[1]];//CD4051通道选通 
                        // delay(2300);//通道切换时间间隔,避免电路的残余电 
                        GetAD_With_VOL_Filter(); 
                        CD4051_Vol_Conver_Flag=0; 
                        } 

                        /*-------------------------------------------------------------------------* 

                        * * 
                        * CD4051_LoopPickVol()...8路巡检TLC1549采集 * 
                        * * 
                        *-------------------------------------------------------------------------*/ 

                        void CD4051_LoopPickVol() 
                        { 
                        uchar i=0,w; 
                        w=ComBuf[1]-1;//通导号等于。。。通道数-1 
                        for(;i<=w;i++) 
                        { 
                        ComBuf[1]=i;//通道号 
                        CD4051_PickVol(); 
                        } 
                        P1=0xff;//关闭通道 
                        } 


                        /*-------------------------------------------------------------------------* 

                        * * 
                        * 电容放电计数测试 * 
                        * TestCapCount() * 
                        * * 
                        *-------------------------------------------------------------------------*/ 

                        void TestCapCount() 
                        { 

                        uint Vol,TempVol=0xff,Count=0,temp1,temp2; 
                        uchar i,CAPDELAYTIME; 
                        float TEST_CAP_OUT_value="/0.05;" 
                        P1=CD4051_NUM[1];//CD4051通道选通,1号通道 
                        TEST_CAP_VOL_CRLT=0;//打开电源 
                        if (ComBuf[1]==0x00)//为0x00时为电容测量方式,0x01为电压测量方式 
                        { 
                        for(i=0;i<=ComBuf[2];i++)delay(60000);//等待电容充电 

                        TEST_CAP_VOL_CRLT=1;//断开电源 
                        TEST_CAP_OUT_value="/0.01;//当为电容测量时。。下限电压" 
                        } 
                        CAPDELAYTIME=ComBuf[3];//延时常量 
                        //-------------- 
                        P1_1=0;//打开LED状态指示 
                        while(TempVol*0.0048*AD_VOL_PER>=TEST_CAP_OUT_VALUE)//当放电到0V时退出 

                        { 
                        ADCLK=ADOUT=0; 
                        Vol=0; 
                        ADCS=0; //开启控制电路,使能DATA OUT和I/O CLOCK 
                        for(i=1;i<=10;i++) 
                        { 
                        //给一个脉冲 
                        ADCLK=1; 
                        Vol<<=1; 
                        if(ADOUT)Vol|=0x01; 
                        ADCLK=0; 
                        } 
                        ADCS=1; 
                        delay(21);//两次转换间隔大于21us 
                        //--------------- 
                        P2=0xff;//p2口置初始状态 
                        Count++;//计数 
                        ComBuf[0]=0x05;//利用软件滤波的处理过程显示 
                        if(Count>2)TempVol=Vol;//第一次的取值有可能是1,,去掉不要 

                        Convert_AD_VOL_ValueToChar(Vol);//转换并发送本次数据 
                        Pluckdelay(CAPDELAYTIME);//采集间隔时间,为ComBuf[4]*1000的时间常数 
                        } 
                        //从高到低取 
                        P1=0xff;//初始P1口 

                        ComBuf[0]=0x0b; 
                        temp1=Count/1000;//取前1-2位 
                        ComBuf[1]=temp1; 
                        temp2=Count/10-temp1*100;//得到3-4位 
                        ComBuf[2]=temp2; 
                        ComBuf[3]=Count-(temp1*1000+temp2*10); 
                        SendByteArray();//发送数据 
                        } 
                        //--------------------------------------------------------------------------// 


                        //写一个字节到AT24C04EEPROM 
                        void WriteAT24C04() 
                        { 
                        uchar address,RomData; 
                        address=ComBuf[1]; 
                        RomData=ComBuf[2]; 
                        WriteByte_24c04(RomData,address); 
                        } 

                        //读取AT24C04EEPROM一个字节 
                        void ReadAT24C04() 
                        { 
                        ComBuf[2]=ReadByte_24c04(ComBuf[1]); 
                        SendByteArray();//发送数据 
                        } 

                        //================================= 
                        // 看门狗设置 
                        //================================= 
                        //void watchdog() 
                        //{ 
                        //WDTRST=0x1E; 
                        //WDTRST=0xE1;//喂狗指令 
                        //} 


                        void SetLedData() 
                        { 
                        uchar ShowData,ShowBit; 
                        Timer_Pro_Flag=0;//0为显示处理,1为时序采集处理 
                        ShowBit=ComBuf[1]; 
                        ShowData=LED_NUM[ShowBit];//选择位 
                        ShowData|=ComBuf[2];//显示内容 
                        LED_BIT[ShowBit]=0x00; 
                        LED_BIT[ShowBit]=ShowData; 
                        TH0=(65536-4000)>>8; 
                        TL0=(65536-4000)&0xff; 
                        TR0=ComBuf[3]; 
                        if(ComBuf[3]) P0=0x00;//关闭显示 
                        } 

                        /*========================================= 
                        PluckPulse----时序采集 
                        ===========================================*/ 
                        void PluckPulse() 
                        { 
                        Timer_Pro_Flag=1;//0为显示处理,1为时序采集处理 
                        OLD_TH0=ComBuf[2]; 
                        OLD_TL0=ComBuf[3]; 
                        TH0=OLD_TH0; 
                        TL0=OLD_TL0; 
                        TR0=ComBuf[1];//关闭或启动计时器 
                        } 
                        //------------ 
                        /*========================================= 
                        PWM----时序采集 
                        ===========================================*/ 
                        void PWM() 
                        { 
                        Timer_Pro_Flag=2;//0为显示处理,1为时序采集处理 
                        OLD_TH0=ComBuf[2]; 
                        OLD_TL0=ComBuf[3]; 
                        TH0=OLD_TH0; 
                        TL0=OLD_TL0; 
                        TR0=ComBuf[1];//关闭或启动计时器 
                        } 

                        //------------ 
                        void timer0(void) interrupt 1 using 1 
                        { 
                        //------------------- 
                        switch(Timer_Pro_Flag) 
                        { 
                        case 0: 
                        //LED显示处理 
                        TH0=(0xffff-4000)>>8; 
                        TL0=(0xffff-4000)&0xff; 

                        if (LedCount>4) LedCount=0; 
                        P0=0x00; 
                        P0=LED_BIT[LedCount++]; 
                        break; 
                        case 1: 
                        // 时序采集 
                        TH0=OLD_TH0; 
                        TL0=OLD_TL0; 
                        SendByte(IrDA_in_Pin);//发送P1^0引脚状态 
                        break; 
                        case 2://模拟PWM输出 
                        if(!PWMFlag) 
                        { 
                        TH0=OLD_TH0; 
                        TL0=OLD_TL0; 
                        TR0=1; 
                        PWMFlag=1; 
                        PWM_Pin=0; 
                        } 
                        else 
                        { 
                        PWM_Pin=1; 
                        TR0=0; 
                        TH0=OLD_TH0; 
                        TL0=OLD_TL0; 
                        TR0=1; 
                        PWMFlag=0; 
                        } 
                        break; 
                        } 
                        } 




                        /*=================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -