• 大小: 5KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-05-13
  • 语言: 其他
  • 标签: C1  MCP342  

资源简介

该代码为PIC单片机MCP3421程序。经过严格测试过后的程序,修改端口保证可以使用!!!只能上传一个文件!!头文件如下 #define AD_SDA_OUT TRISC &= ~0x40 #define AD_SDA_IN TRISC |= 0x40 #define AD_SDA_HIGH LATC |= 0x40 #define AD_SDA_LOW LATC &= ~0x40 #define AD_SCL_HIGH LATC |= 0x80 #define AD_SCL_LOW LATC &= ~0x80 #define AD_SDA_VAL (PORTC & 0x40)

资源截图

代码片段和文件信息

#include 
#include 
#include “AD.h“
#include “CPU.h“
#include “Sensor.h“

u8 Mcp3421AddrConfigValAdCntAdShift;
u16 AdVal[10];
extern CSys Sys;
extern CSensor Sensor;
extern CError  Error;
#ifdef WDX
    CWD WD;
#endif

u16 AnverageAdVal(u16 val)
{
     u8 i;
     u16 t[10];
     u32 sum;
     if(AdCnt < 10)
     {
          AdVal[AdCnt ++] = val;
          return 0;
     }
#ifdef COSENSOR 
     if(Sensor.ZeroDelay)          // CO开机预热5min,5min之内AD值如果小于1000,直接赋值0
     {
          if(val < 300)
          {
               Sensor.CurAdValue = val;
               return 1;
          }
     }
#endif
#ifdef  H2SSENSOR 
     if(Sensor.ZeroDelay)          // CO开机预热5min,5min之内AD值如果小于1000,直接赋值0
     {
          if(val < 300)
          {
               Sensor.CurAdValue = val;
               return 1;
          }
     }
#endif
     //温度的AD无效值还需要修改 
     AdVal[AdShift++] = val;
     if(AdShift == 10)
          AdShift = 0;
     for(i = 0;i < 10;i ++)
          t[i] = AdVal[i];
     
     MakeBufFall(t10);           // 降序排列
      //掐头去尾,只计算中间6个数的平均 buf[2]----buf[7]
#ifdef COSENSOR  
     if((t[0] - t[9] < 10) && (t[0] < 300))
#elif H2SSENSOR
       if((t[0] - t[9] < 10) && (t[0] < 300))  
#else
     if((t[0] == t[9]) && (t[0] < 100))
#endif
     {
          Sensor.DisCnt ++;
          if(Sensor.DisCnt > 30)
          {
               Sensor.DisCnt = 30;
               Error.Flag |= 0x10;
          }
          return 0;
     }
     if(Sensor.DisCnt)
     {
          Sensor.DisCnt --;
          return 0;
     }
     Error.Flag &= ~0x10;//清除错误标志
     sum = 0;
     for(i = 2;i < 8;i ++)
          sum += t[i];
     sum /= 6;
     return sum;
}

void AD_Start(void)
{
     AD_SDA_OUT;
     AD_SDA_HIGH;delay_us(4);
     AD_SCL_HIGH;delay_us(4);
     AD_SDA_LOW;delay_us(4);
     AD_SCL_LOW;
}

void AD_Stop(void)
{
     AD_SDA_OUT;
     AD_SCL_LOW;delay_us(4);
     AD_SDA_LOW;delay_us(4);
     AD_SCL_HIGH;delay_us(4); 
     AD_SDA_HIGH;delay_us(4);
}

u8 AD_Wait_Ack(void)
{
     u8 ucErrTime=0;
     AD_SDA_IN; 
     AD_SCL_HIGH;delay_us(4);  
     while(AD_SDA_VAL)
     {
          ucErrTime++;
          if(ucErrTime>250)
          {
               AD_Stop();
               return 1;
          }
     }
     AD_SCL_LOW;    
     return 0;
}

void AD_Ack(void)
{
     AD_SCL_LOW;delay_us(4);
     AD_SDA_OUT;delay_us(4);
     AD_SDA_LOW;delay_us(4);
     AD_SCL_HIGH;delay_us(4);
     AD_SCL_LOW;
}
    
void AD_NAck(void)
{
     AD_SCL_LOW;
     AD_SDA_OUT;
     AD_SDA_HIGH;delay_us(4);
     AD_SCL

评论

共有 条评论