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

📄 haoshi.c

📁 数据采集及A/D转换滤波处理采用数字滤波
💻 C
字号:
// 接受05 启动定时器0 定时2.5ms A/D转换一次并上传
#include <absacc.h>
#include <intrins.h>
#include <reg52.h>
#include <ctype.h>   //包含头文件

# define uchar unsigned char //宏定义

sbit AD_EOC=P1^2;
sbit AD_CLK=P1^3;
sbit AD_DIN=P1^4;
sbit AD_DOUT=P1^5;
sbit AD_CS=P1^6;
sbit AD_EN=P2^1;
sbit WDI=P2^4;
sbit AD_HBEN=P2^5;
sbit LED=P0^0;     //位定义

uchar data recedata ,flag=0x00;
uchar data AD_RESULTH,AD_RESULTL;
uchar data ending[2];     //定义数组和变量
uchar data AD_CONTROL;
void initial(void);
void ad_convert(void);
void delay(void);   //函数声明

main()   // 主程序
{
  uchar data i,j;
  initial();
  WDI=!WDI;
  ad_convert();
  delay();
  ad_convert();
  delay();
  ad_convert();
  for (j=0;j<5;j++) //灯闪5次
  {
    for (i=0;i<150;i++)
       {
       delay();
       }
    LED=0;
    for (i=0;i<150;i++)
      {
       delay();
       }
    LED=1;
  }
  LED=1;
  do {}while (!flag) ;  // 等待上位机发指令
  TR0=1;
  for(;;)
  {
    TH0=-(int)(2500*11.0592/12)/256;
    TL0=(int)(-2500*11.0592/12)%256;

    do {} while (!TF0) ;    //定时器0查询方式

    ad_convert();
    ending[0]=AD_RESULTH;
    ending[1]=AD_RESULTL;
    //ending[0]=0x80;
   // ending[1]=0x7F;
    REN=0;
    ES=0;
    for(i=0;i<2;i++)
    {

      SBUF=ending[i];
      while (TI==0)
      {}
      TI=0;

    }
    ES=1;
    REN=1;
    TF0=0;
   }
}

serial() interrupt 4 using 3  //串行口中断服务子程序
{
  if(RI==1)
  {
    recedata=SBUF;
    if(recedata==0x05) //接收数据为0x05
    {
      RI=0;

      flag=1;
    }
    if (recedata==0x04)
    {
      RI=0;
      TR0=0;
    }

  }
}

 //A/D转换子程序 对照时序 当前I/O周期移出的是上一次A/D结果 同时把当前转换控制字移入
void ad_convert(void)     //A/D为12位  先输出高8位(同时输入控制字)  再输出低4位
{
  uchar k;             //此处必须定义
  EA=0;                //执行A/D转换子程序时CPU屏蔽所有中断
 AD_EN=0;
  AD_CS=0;             //下降沿 片选信号使能 出来A/D转换结果最高位 I/O周期开始
  WDI=!WDI;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  AD_CONTROL=0x00;                    //AD_CONTR AD控制寄存器 赋值
  AD_RESULTH=0x00;                  //变量清零
  AD_RESULTL=0x00;
  AD_CLK=0;                        //A/D时钟变低电平
  //AD_CS=0;
  for(k=0;k<8;k++)                 //由高到低移出A/D结果高8位 同时移入下次A/D转换控制字
  {
    if(AD_DOUT==1) AD_RESULTH=AD_RESULTH|0x01;   //判断移出的一位是0还是1
      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=AD_CONTROL<<1;
    _nop_();
    AD_CLK=1;             //时钟上升沿 移入控制字的一位
    _nop_();
    _nop_();
    AD_CLK=0;             //下降沿 A/D结果的下一位出来
    _nop_();
    WDI=!WDI;
  }
  for(k=0;k<4;k++)                                       //从高到低输出低4位
  { 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_();
    _nop_();
    AD_CLK=0;             //下降沿
   _nop_();
   _nop_();
   _nop_();              //I/O周期结束 转换周期开始
    WDI=!WDI;
   }
  wait: _nop_();
   if(AD_EOC==0) goto wait;  //等待转换周期结束
   AD_CS=1;                  //片选置高电平 不使能
   EA=1;                     //CPU开中断
   //label=label+1;
   //AD_RESULT=(((unsigned int)(AD_RESULTH<<4)+((AD_RESULTL>>4)&0x0f)))&0x0fff;
   //COUNT[label]=AD_RESULT;
 }

void delay(void)  //延时子程序
{
  uchar a;
  for (a=0;a<100;a++)
  {
    WDI=!WDI;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    WDI=!WDI;
    _nop_();
    _nop_();
  }
}
void initial(void) //初始化子程序
{
  TMOD=0x21; // T/C0 方式1 定时     T/C1 方式2 定时(为波特率服务)
  TH1=0xfd;  //定时器1初值
  TL1=0xfd;
  PCON=0x00; //可不写  复位后内部特殊功能寄存器都清零
  SCON=0xd0; //串行口工作方式1   至此波特率设成了9600(晶振选好后 四个要素影响波特率)
  REN=1; //串行口允许接受
  TH0=-(int)(2500*11.0592/12)/256;
  TL0=(int)(-2500*11.0592/12)%256; //定时器0初值  定时2.5ms
  EA=1; //CPU开中断
  ES=1; //允许串行口中断

 // IP=0x10;
  TR1=1; //启动定时器1
}

















⌨️ 快捷键说明

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