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

📄 ad1.c

📁 1.A/D转换 2.编码器数据采集 3.电机驱动 利用ADC0809芯片
💻 C
字号:
#include <REG52.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define ADDRESS_BALL 0x2FF0      //endpoint cs of chip ad0809 connect /Y1 of 74LS138
#define ADDRESS_RESET_RECODE 0x0FF0     // endpoint LOAD of 74LS193 connent /Y0
//#define ADDRESSL_RECODE 0x6FF0         // 编码器的数据的低八位数据通过373(2)锁存器三态门允许端/Y3 (74LS138)
//#define ADDRESSH_RECODE 0x2FF0         //  编码器的数据的高四位数据通过373(3)锁存器三态门允许端/Y4 (74LS138)
#define ADDRESS_READIDT 0xAFFF         // IDT7205的读允许端通过/Y5来控制 (74LS138)
#define ADDRESS_CONTROL 0xFF3F         //8253  控制字输入允许地址
#define ADDRESS_COUNTER0 0xFF0F         // 8253  计数器0读写地址
#define ADDRESS_COUNTER1 0xFF1F         //  8253   计数器1读写地址
#define ADDRESSL_RECODE 0x6FFF         // 编码器的数据的低八位数据通过373(2)锁存器三态门允许端/Y3 (74LS138)
#define ADDRESSH_RECODE 0x2FFF         //  编码器的数据的高四位数据通过373(3)锁存器三态门允许端/Y4 (74LS138)

#define MSB(x) (((x) >> 8) &0xFF)
#define LSB(x) ((x) &0xFF)
void delay(uint a);
void outportb(unsigned int port,unsigned char val) ;
unsigned char inportb(unsigned int port);
extern void acquisition_encode(void);
void acquisition_ball(void);
void idt_read(void);         //read data from buffer chip idt7205
void motor_driver(void);
//unsigned char  location_ball  ;
uchar  data_buffer[6]={0,0,4,0,2,0}  ;    //   data_buffer为采集到的数据数组,一次发送48个数据,一共16组
//extern unsigned char idata GenEpBuf[16]   ;
unsigned char idata GenEpBuf[16]   ;

void init_port()
{
P0 = 0xFF;
P1 = 0xFF;
P2 = 0xFF;
P3 = 0xFF;
//printf("it is all ready\n") ;
}


void main(void)
{
  init_port();
  while(1)
   { //acquisition_ball();

       P2_0=1;
       outportb(ADDRESSL_RECODE,0);
       outportb(ADDRESSH_RECODE,0);
       P1_0=0;  //IDT7205读允许端有效进行读数
       P1_0=1;
       //outportb(ADDRESSL_RECODE,0);
       P1_0=0;  //IDT7205读允许端有效进行读数
       P1_0=1;

       P1_1=0;  //IDT7205读允许端有效进行写数
       ACC=P0;
       P1_1=1;

         P1_1=0;  //IDT7205读允许端有效进行写数
       ACC=P0;
       P1_1=1;

         P1_1=0;  //IDT7205读允许端有效进行写数
       ACC=P0;
       P1_1=1;


     if(P1_3)
       {P1_1=0;
       data_buffer[1]=inportb(ADDRESS_READIDT);
       data_buffer[1]=P0;
       P1_1=1;
       }
     acquisition_encode();
     acquisition_encode();
     acquisition_encode();
     idt_read();
     motor_driver()   ;
   }

 }
/*
void acquisition_ball(void)
{
  outportb(ADDRESS_BALL,0);
  while(!P3_5);
  P1_4=1; //AD0809读允许端有效
  P1_0=0;  //IDT7205读允许端有效进行读数
  P1_0=1;
  P1_4=0;
  //i=inportb(AD_BALL);
  //return  i ;
}
   */

void idt_read(void)
{  uchar i;
  if(P1_3)       //如果P1_3为1的话,表示IDT7205不为空,可以读取数据
  {  for(i=0;i<6;i++)
     data_buffer[i]=inportb(ADDRESS_READIDT);      //读取两组采集到的数据


  }
}


void motor_driver(void)
{  uchar i;
   for(i=0;i<8;i+=2)
    {
      data_buffer[i]=0x64;
      i++;
      data_buffer[i]=0x32;

   P3_1=0;
   outportb(ADDRESS_CONTROL,0X34) ;     //选择计数器0,工作模式为2,向计数器中送入0X0064数据,设置方波周期为100个脉冲
   outportb(ADDRESS_COUNTER0,0X64) ;
   outportb(ADDRESS_COUNTER0,0X00) ;

   outportb(ADDRESS_CONTROL,0X72) ;     //选择计数器1,工作模式为1,向计数器中送入0X0032数据,设置方波脉冲宽度为50个脉冲
   outportb(ADDRESS_COUNTER1,0X32) ;
   outportb(ADDRESS_COUNTER1,0X00) ;

   P3_1=1;
   }
}

void outportb(unsigned int port,unsigned char val)
{
*((unsigned char xdata *) port)  = val;
}


unsigned char inportb(unsigned int port)
{
unsigned char c;
c = *((unsigned char xdata *) port)  ;
return c;
}

void delay(uint a)
{
uint b;
for(b=0;b<a;b++);
}

⌨️ 快捷键说明

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