/*****************************************************************************
* 舞蹈机器人程序
* 作者 :梦想科技*张建高版权所有
* 网址:http://www.dreamic.net/bbs/
* Email:9902013327@163.com
* 单片机采用AT89S52,晶振频率为:12.00MHz。
/******************************************************************************/
#include <AT89X55.H>
//51芯片管脚定义头文件
#include <intrins.h>
//内部包含延时函数 _nop_()
#define uchar unsigned char
#define uint unsigned int
sbit SDATA_595=P3^0 ; //串行数据输入
sbit SCLK_595 =P3^1 ; //移位时钟脉冲
sbit RCK_595 =P3^6 ; //输出锁存器控制脉冲
uchar run=0; //步骤标记
uchar num=0; //同时工作的电数
uchar i;
sbit in0=P1^0;
sbit in1=P1^1;
sbit in2=P1^2;
sbit in3=P1^3;
sbit in4=P1^4;
sbit in5=P1^5;
sbit in6=P1^6;
sbit in7=P1^7;
sbit in8=P0^0;
unsigned char state0_A=0; //定义电机0的状态A
unsigned char state0_B=0; //定义电机0的状态B
unsigned char state1_A=0; //定义电机1的状态A
unsigned char state1_B=0; //定义电机1的状态B
unsigned char state2_A=0; //定义电机2的状态A
unsigned char state2_B=0; //定义电机2的状态B
unsigned char state3_A=0; //定义电机3的状态A
unsigned char state3_B=0; //定义电机3的状态B
unsigned char state4_A=0; //定义电机4的状态A
unsigned char state4_B=0; //定义电机4的状态B
unsigned char state5_A=0; //定义电机5的状态A
unsigned char state5_B=0; //定义电机5的状态B
unsigned char state6_A=0; //定义电机6的状态A
unsigned char state6_B=0; //定义电机6的状态B
//unsigned char state7_A=0; //定义电机7的状态A
//unsigned char state7_B=0; //定义电机7的状态B
//unsigned char state8_A=0; //定义电机8的状态A
//unsigned char state8_B=0; //定义电机8的状态B
unsigned int temp=0xffff;
unsigned int temp_595;
unsigned int temp_0;
unsigned int temp_1;
unsigned int temp_2;
unsigned int temp_3;
unsigned int temp_4;
unsigned int temp_5;
unsigned int temp_6;
unsigned int temp_7;
unsigned char P17_temp;
unsigned char P17_flag;
unsigned int num_0=0xffff;
unsigned int num_1=0xffff;
unsigned int num_2=0xffff;
unsigned int num_3=0xffff;
unsigned int num_4=0xffff;
unsigned int num_5=0xffff;
unsigned int num_6=0xffff;
//unsigned int num_7=0xffff;
//unsigned int num_8=0xffff;
unsigned int count_0=0;
unsigned int count_1=0;
unsigned int count_2=0;
unsigned int count_3=0;
unsigned int count_4=0;
unsigned int count_5=0;
unsigned int count_6=0;
//unsigned int count_7=0;
//unsigned int count_8=0;
void WR_595();
void OUT_595();
void scan();
void start_595(void);
void stop(void);
void moto0(unsigned char s0);
void moto1(unsigned char s1);
void moto2(unsigned char s2);
void moto3(unsigned char s3);
void moto4(unsigned char s4);
void moto5(unsigned char s5);
void moto6(unsigned char s6);
void moto7(unsigned char s7);
void scan0(unsigned int n0);
void scan1(unsigned int n1);
void scan2(unsigned int n2);
void scan3(unsigned int n3);
void scan4(unsigned int n4);
void scan5(unsigned int n5);
void scan6(unsigned int n6);
void scan7(unsigned int n7);
void delay50ms(int ms);
/********************************************************/
/*将显示数据送入74HC595内部移位寄存器 */
/********************************************************/
void WR_595(void)
{ uchar j ;
temp_595=temp;
for (j=0 ;j<16 ;j++)
{
temp_595=temp_595<<1 ;
SDATA_595=CY ;
SCLK_595=1 ; //上升沿发生移位
_nop_() ;
_nop_() ;
SCLK_595=0 ;
}
}
/********************************************************/
/*将移位寄存器内的数据锁存到输出寄存器并显示 */
/********************************************************/
void OUT_595(void)
{
RCK_595=0 ;
_nop_() ;
_nop_() ;
RCK_595=1 ; //上升沿将数据送到输出锁存器
_nop_() ;
_nop_() ;
_nop_() ;
RCK_595=0 ;
}
/********************************************************/
/* 595开启子程序 */
/********************************************************/
void start_595(void)
{
WR_595();
OUT_595();
_nop_() ;
}
/********************************************************/
/* 停止子程序 */
/********************************************************/
void stop(void)
{ temp=0xffff; //取数据
WR_595(); //把数据写入595的寄存器
OUT_595();
_nop_() ;
}
/********************************************************/
/* 延时子程序 */
/********************************************************/
void delay50ms(int ms)
{
int k ;
while(ms--)
{
for(k=12500; k>0 ; k--)
{
_nop_() ;
_nop_() ;
_nop_() ;
_nop_() ;
}
}
}
/********************************************************/
/* 开关电机 */
/* 0--关电机 //关某位用 1 或,其他位为0 */
/* 1--正转 //开某位用 0 与,其他位为1 */
/* 2--反转 */
/********************************************************/
void moto0(unsigned char s0)
{ switch(s0)
{ case 0: {temp_0=temp; temp_0|=0x0003; temp=temp_0;} break ; //关电机
case 1: {temp_0=temp; temp_0&=0xfffe; temp=temp_0;} break ; //正转
case 2: {temp_0=temp; temp_0&=0xfffd; temp=temp_0;} break ; //反转
}
}
void moto1(unsigned char s1)
{ switch(s1)
{ case 0: {temp_1=temp; temp_1|=0x000c; temp=temp_1;} break ; //关电机
case 1: {temp_1=temp; temp_1&=0xfffb; temp=temp_1;} break ; //正转
case 2: {temp_1=temp; temp_1&=0xfff7; temp=temp_1;} break ; //反转
}
}
void moto2(unsigned char s2)
{ switch(s2)
{ case 0: {temp_2=temp; temp_2|=0x0030; temp=temp_2;} break ; //关电机
case 1: {temp_2=temp; temp_2&=0xffef; temp=temp_2;} break ; //正转
case 2: {temp_2=temp; temp_2&=0xffdf; temp=temp_2;} break ; //反转
}
}
void moto3(unsigned char s3)
{ switch(s3)
{ case 0: {temp_3=temp; temp_3|=0x00c0; temp=temp_3;} break ; //关电机
case 1: {temp_3=temp; temp_3&=0xffbf; temp=temp_3;} break ; //正转
case 2: {temp_3=temp; temp_3&=0xff7f; temp=temp_3;} break ; //反转
}
}
void moto4(unsigned char s4)
{ switch(s4)
{ case 0: {temp_4=temp; temp_4|=0x0300; temp=temp_4;} break ; //关电机
case 1: {temp_4=temp; temp_4&=0xfeff; temp=temp_4;} break ; //正转
case 2: {temp_4=temp; temp_4&=0xfdff; temp=temp_4;} break ; //反转
}
}
void moto5(unsigned char s5)
{ switch(s5)
{ case 0: {temp_5=temp; temp_5|=0x0c00; temp=temp_5;} break ; //关电机
case 1: {temp_5=temp; temp_5&=0xfbff; temp=temp_5;} break ; //正转
case 2: {temp_5=temp; temp_5&=0xf7ff; temp=temp_5;} break ; //反转
}
}
void moto6(unsigned char s6)
{ switch(s6)
{ case 0: {temp_6=temp; temp_6|=0x3000; temp=temp_6;} break ; //关电机
case 1: {temp_6=temp; temp_6&=0xefff; temp=temp_6;} break ; //正转
case 2: {temp_6=temp; temp_6&=0xdfff; temp=temp_6;} break ; //反转
}
}
void moto7(unsigned char s7)
{ switch(s7)
{ case 0: {temp_7=temp; temp_7|=0xc000; temp=temp_7;} break ; //关电机
case 1: {temp_7=temp; temp_7&=0xbfff; temp=temp_7;} break ; //正转
case 2: {temp_7=temp; temp_7&=0x7fff; temp=temp_7;} break ; //反转
}
}
/********************************************************/
/* 脉冲电机控制 */
/* num_i--输入电机的转动角数 */
/* state0_B--前一个电平状态 */
/* state0_A--当前电平状态 */
/********************************************************/
void scan0(unsigned int n0)
{ num_0=n0; }
void scan1(unsigned int n1)
{ num_1=n1; }
void scan2(unsigned int n2)
{ num_2=n2; }
void scan3(unsigned int n3)