/**************************************************************
头文件预处理:
**************************************************************/
#include<reg52.h>
#include <absacc.h>
#include <intrins.h>
#include<stdio.h>
/**************************************************************
数据类型宏定义:
**************************************************************/
#define uchar unsigned char
#define uint unsigned int
/**************************************************************
I/O端口说明:
**************************************************************/
sbit Led_Clk=P1^5; //clock port of 74HC164
sbit Led_Dat=P1^6; //data port of 74HC164
sbit Led_Cs=P1^7; //Led display controlling(using BJT's base)
sbit SDA=P3^4; //I2C数据线
sbit SCL=P3^5; //I2C时钟线
sbit A0=P1^0;
/**************************************************************
全局变量声明:
**************************************************************/
uchar NP1,NP2,temp2,Count;
uint temp,temp1,Sec;
const uchar motor1[8]={0x30,0x60,0xc0,0x90};
const uchar motor2[8]={0x03,0x06,0x0c,0x09};//{0x11,0x99,0x88,0xaa,0x22,0x66,0x44,0x55}; //八拍为一步
/**************************************************************
函数说明:
**************************************************************/
void RS232_SendData(uchar d)
{
SBUF=d;while(TI==0);TI=0;
}
/**************************************************************
**函数名称:Delay
**功能描述:延时
***************************************************************
**调用函数:NONE
**参 数:NONE
**返 回 值:NONE
**************************************************************/
void delay(uchar t)// 每步延时的子程序
{
uchar i,j,k;
for (k=0;k<50;k++)
for (j=0;j<t;j++)
_nop_();
}
/**************************************************************
**函数名称:Delay1
**功能描述:延时1ms*t子程序
***************************************************************
**调用函数:NONE
**参 数:NONE
**返 回 值:NONE
**************************************************************/
void delay1(uchar t)//
{
uchar j,k;
for (k=0;k<t;k++)
for (j=0;j<60;j++)
_nop_();
}
/**********************Delay 函数结束************************/
/**************************************************************
**函数名称:round_step
**功能描述:转弯
***************************************************************
**调用函数:delay
**参 数:d,t
**返 回 值:NONE
**************************************************************/
void car_round_step(uchar d,uchar t) //步进电机走一步d=0 右转d=1 左转。t 越大转得越慢
{
uchar e;
if (d&0x01)
{
if (NP1==0)
NP1=3;
else NP1--; //NP1记录步数,全局变量
}
else
{
if (NP1==3)
NP1=0;
else
NP1++;
}
temp=motor1[NP1];
e=!d;
if (e&0x01)
{
if (NP2==0)
NP2=3;
else NP2--; //NP2记录步数,全局变量
}
else
{
if (NP2==3)
NP2=0;
else
NP2++;
}
temp1=motor2[NP2];
P2=temp|temp1;//输出到单片机的P2口
RS232_SendData(P2);//motortb[NP]);
delay(t);
}
/**************************************************************
**函数名称:mov_step
**功能描述:转弯
***************************************************************
**调用函数:delay
**参 数:d,t
**返 回 值:NONE
**************************************************************/
void car_movstep(uchar d,uchar t) //步进电机走一步d=0 前进d=1 后退。t 越大转得越慢
{
if (d&0x01)
{
if (NP1==0)
NP1=3;
else NP1--; //NP1记录步数,全局变量
}
else
{
if (NP1==3)
NP1=0;
else
NP1++;
}
temp=motor1[NP1];
if (d&0x01)
{
if (NP2==0)
NP2=3;
else NP2--; //NP2记录步数,全局变量
}
else
{
if (NP2==3)
NP2=0;
else
NP2++;
}
temp1=motor2[NP2];
P2=temp|temp1;//输出到单片机的P2口
RS232_SendData(P2);//motortb[NP]);
delay(t);
}
/**************************************************************
**函数名称:timer0
**功能描述:定时器中断服务程序
***************************************************************
**调用函数:NONE
**参 数:NONE
**返 回 值:NONE
**************************************************************/
void ISR_Tmr0() interrupt 1 using 2
{
uchar i;
TH0=0x9e; //T0定时25ms
TL0=0x58; //0xD8F0
if(!A0)
{
}
else if(!A1)
{
}
// temp2++;
// RS232_SendData(temp2);
}
/**************************************************************
**函数名称:timer0
**功能描述:定时器中断服务程序
***************************************************************
**调用函数:NONE
**参 数:NONE
**返 回 值:NONE
**************************************************************/
void ISR_Tmr1() interrupt 1 using 3
{
uchar i;
TH0=0x9e; //T0定时25ms
TL0=0x58; //0xD8F0
if(Count==20)
{
Count=0;
Sec++;
//
}
else
Count++;
// temp2++;
// RS232_SendData(temp2);
}
/**************************************************************
**函数名称:zd_int0()
**功能描述:int0中断服务子程序
***************************************************************
**调用函数:NONE
**参 数:NONE
**返 回 值:NONE
**************************************************************/
void zd_int0() interrupt 0 using 2
{
uchar i;
for(i=0;i<10;i++)
car_round_step(0,100);
RS232_SendData(P2);
}
/**************************************************************
**函数名称:main()
**************************************************************/
void main()
{ uchar i,j,k,l;
temp2=0;
Sec=Count=0;
init: TMOD=0x11; //设置定时器0,工作方式1,
TH0=0x9e; //T0定时25ms
TL0=0x58; //0xD8F0
// TH1=0xFE; //T1定时500us
// TL1=0x0C; //理论值为FE0CH
ET0=1; //允许定时器0中断
// ET1=1; //允许定时器1中断
TR0=1; //关定时器0
// TR1=1; //关定时器1
// EA=1; //允许CPU总中断
// IE=0x1b; //ET0=ET1=EX0=ES=1;EX1=0;T0,T1,INT0,COM中断允许INT1不允许
SCON = 0x50; //串口方式1,允许接收
RCAP2H=0xff;RCAP2L=0x64;T2CON=0x34;//波特率2400 bps
EA=1;
// NP=3;
while(1)
{
for(i=0;i<150;i++)
for(k=0;k<10;k++)
{
car_movstep(0,10);
// RS232_SendData(temp2);
}
for(j=0;j<150;j++)
car_round_step(0,10);
}
}