📄 ad1.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 + -