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

📄 actual.c

📁 数据采集及A/D转换滤波处理采用数字滤波
💻 C
字号:
// 探头转一周期间 INT0中断一次 判断个数上传数据并定起始位  INT1各个位置分别中断一次进行A/D转换 共24次
#include <absacc.h>   //头文件
#include <intrins.h>
#include <reg52.h>
#include <ctype.h>
#define uchar unsigned char  //宏定义

uchar data i=0,j=0,counter=0,flag=0;
uchar data AD_RESULTH=0x00,AD_RESULTL=0x00 ,AD_CONTROL=0x00; //定义变量
uchar data a[48]; //定义数组

sbit DIRECTION=P1^7;   //正反转控制位
sbit AD_CS=P1^6;       //A/D转换器片选
sbit AD_DOUT=P1^5;     //A/D转换器三态输出端
sbit AD_DIN=P1^4;      //A/D转换器控制字输入端
sbit AD_CLK=P1^3;      //A/D转换器时钟
sbit AD_EOC=P1^2;      //A/D转换器转换结束标志
sbit LED=P0^0;         //程序运行指示灯  接上拉电阻
sbit WDI=P2^4;

void initial(void);      //函数(子程序)声明
void delay(void);
void ad_convert(void);
void transmit(void);

main()                     //主函数
{
  initial();         // 调用初始化子程序
  ad_convert();
  delay();
  ad_convert();      //调用两次A/D转换子程序 为了舍去开始时不准确的A/D转换结果
  for(i=0;i<5;i++)    // 指示灯闪五次
  {
    for(j=0;j<100;j++)
    {
      delay();
    }
    LED=0;
    for(j=0;j<100;j++)
    {
      delay();
    }
    LED=1;
  }
  if(DIRECTION==0)  //反转
  {
    flag=0;
    i=24;
  }
  else           //正转
  {
    flag=1;
    i=0;
  }
  for(;;)                        //主循环
  {
  }
}

void int0() interrupt 0 using 0   //外部中断INT0
{
  if(counter==24)                 //够24次A/D转换 上传数据
    transmit();
  counter=0;                      //变量清零 重新计数
  if(flag==0)                     //反转
    i=24;
  else
    i=0;
  for(i=0;i<48;i++)                //数组清零
  {
    a[i]=0;
  }
}

void int1() interrupt 2 using 2   // 外部中断INT1
{
  ad_convert();                   //调用A/D转换子程序
  if(flag==0)      //反转
  {
    a[2*i-2]=AD_RESULTH;              //数组存放结果
    a[2*i-1]=AD_RESULTL;
    i=i-1;                            //下一个位置
  }
  else          //正转
  {
    a[2*i]=AD_RESULTH;              //数组存放结果
    a[2*i+1]=AD_RESULTL;
    i=i+1;                          //下一个位置
  }
  counter=counter+1;                //A/D转换次数
}

void initial(void)            //初始化子程序
{
  TMOD=0x20;                  //晶振11.0592CLK 波特率设为9600kbps  定时器1 方式2
  TH1=0xfd;                   //定时器初值
  TL1=0xfd;
  PCON=0x00;                  //波特率加倍位SMOD=0
  SCON=0x40;                  //串口方式1 10位UART
  EA=1;                       //CPU开中断
  EX0=1;                      //外部中断0开中断
  EX1=1;                      //外部中断1开中断
  IT0=1;                      //外部中断0触发方式选择位 下降沿触发
  IT1=1;                      //外部中断1触发方式选择位 下降沿触发
  TR1=1;                     //启动定时器1
  WDI=!WDI;                  //喂狗
}

void delay(void)             //延时子程序
{
  uchar a;
  for (a=0;a<100;a++)
  {
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    WDI=!WDI;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    WDI=!WDI;
  }
}

void ad_convert(void)     //A/D转换子程序  对照时序
{
  uchar k;
  WDI=!WDI;
  EA=0;                   //CPU关中断
  AD_RESULTH=0x00;        //变量清零
  AD_RESULTL=0x00;
  AD_CONTROL=0x00;        //控制字赋值
  AD_CS=0;                //片选下降沿 出来最高位 A/D转换周期开始
  for(k=0;k<8;k++)        //由高到底移出A/D转换结果高八位并移入控制字
  {
    if(AD_DOUT==1)
      AD_RESULTH=AD_RESULTH|0x01;
    else
      AD_RESULTH=AD_RESULTH&0xfe;
    if(k<7)
      AD_RESULTH=AD_RESULTH<<1;
    if(AD_CONTROL&0x80==0x80)
      AD_DIN=1;
    else
      AD_DIN=0;
    AD_CONTROL<<1;
    _nop_();
    AD_CLK=1;       //脉冲上升沿 移入控制字的一位
    _nop_();
    _nop_();
    _nop_();
    AD_CLK=0;      //脉冲下降沿 A/D转换结果下一位出来
    _nop_();
    WDI=!WDI;
  }
  for(k=0;k<4;k++)    //移出A/D转换结果后四位
  {
    if(AD_DOUT==1)
      AD_RESULTL=AD_RESULTL|0x08;
    else
      AD_RESULTL=AD_RESULTL&0xf7;
    AD_RESULTL=AD_RESULTL<<1;
    _nop_();
    AD_CLK=1;      //脉冲上升沿
    _nop_();
    _nop_();
    _nop_();
    AD_CLK=0;     //脉冲下降沿
    _nop_();      //进入转换周期
    WDI=!WDI;
  }
  while (AD_EOC==0)  //等待转换周期结束
  {
  }
  AD_CS=1;          //片选变高电平
  EA=1;             //CPU开中断
}

void transmit(void)   //发送子程序
{

    for(i=0;i<48;i++)    //按1-24个位置顺序发送每周24个数据 48个字节
    {
      SBUF=a[i];
      while(TI==0)       //等待一次发送结束
      {
      }
      TI=0;              //中断请求标志位清零
    }


}



⌨️ 快捷键说明

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