/***************************************************************************************************************
文 件 名:main.c
功能描述:
备 注: 16路舵机控制
****************************************************************************************************************/
#include "STC15Fxxxx.H" //STC15系列单片机
#include
#include "UART.H"
#include "timer.h"
#include "util.h"
#include "ps2/ps2.h"
#include "flash/flash.h"//头文件
#include
#include
#include "LED/led.h"
#include
#include
#include "adc/adc.h"
extern uint8 flag_p;
extern bit flag_RecFul;
//extern uchar KEY[9];
uint16 pos[7][MOTOR_NUM]={ {1000,1500,1500,1500,1500,1500,1500,1500,1500},
{1000,1500,1500,1500,1500,1500,1500,1500,1500},
{1000,1500,1500,1500,1500,1500,1500,1500,1500},
{1000,500,500,500,500,500,500,500,500},
{1000,1500,1500,1500,1500,1500,1500,1500,1500},
{1000,500,500,500,500,500,500,500,500},
{1000,1500,1500,1500,1500,1500,1500,1500,1500}
}; //位置
uint16 pwm[MOTOR_NUM]= {1500,1500,1500,1500,1500,1500,1500,1500,1500};
uint16 UartRec[MOTOR_NUM]={1500,1500,1500,1500,1500,1500,1500,1500,1500};
uint8 redata[257] = {0}; // 定义接收数据变量数组
uint8 line=0; //缓存存入口与出口之间的距离,即当前缓存中有多少个没有执行的数据
uint8 point_now=0; //与point_aim一起标记缓存出口位置,即取数位置
uint8 point_aim=1;
uint8 point_in=2; //标记缓存入口位置,即上一行数据存放位置
bit flag_connect = 0;
bit flag_stop=1; //表示一行执行结束
uint8 flag_vpwm=0; //表示到达了该更新pwm[]的时间
bit flag_in=1; //表示缓存中有空闲空间
bit flag_out=0; //表示缓存中有可执行数据的标志位
bit flag_run_ready=0; //表示有要要放入缓存的EErom数据
uint16 n=1000; //用来计算需要建立多少个中间数据
uint16 m=1; //用来累计已经执行了多少中间数据
double dp;
double dp0[MOTOR_NUM] = {0}; //插补增量
bit flag_download = 0;//判断是否下载
bit flag_read = 0;// 读取flash内容,发送上位机
bit flag_connect_run = 0;//连接上位机的执行flash保存的命令
bit flag_stop_download = 0;//停止下载
bit flag_online_run = 0;
bit flag_uart2_rev = 0;
bit flag_uart2_rev_time_out = 0;
bit flag_ps2_rev = 0;
bit flag_read_adc = 0;
unsigned long send_mode = 0;//当前串口接收到命令状态存储
MotorData motor_data;//舵机总信息
MotorOneCmd motor_one_cmd;//单个命令
CurrentItem cur_item;
uint16 tuoji_count = 0;//脱机执行次数
bit flag_scan_ps2 = 0;
uint8 error = 0;
uchar file_list[MAX_SUPPORT_FILE_SAVE] = {0};
int file_list_count = 0;
int file_last_num = 0;
char ps2_buf[120] = {0};
char uart2_buf[50] = {0};
uint cur_count = 0;
uchar ad_value = 0;
uchar beep_mode = 1;
uchar key_bak;
uchar ps2_key;
uchar ps2_mode=0;
void updata_file_list()
{
uchar i = 0;
uchar j = 0;
file_last_num = -1;
ReadMoterInfor();
for (i = 0; i < motor_data.filecount; i++)
{
if (motor_data.file_flag[i] == 1)
{
file_list[j] = i;
j++;
file_last_num = i;
}
}
file_list_count = j;
}
void InitMotor()
{
ReadMoterInfor();//读取舵机控制信息
updata_file_list();
memset(&cur_item,0,sizeof(cur_item));
beep_mode = motor_data.beep_mode;
}
/***************************************************************************************************************
函 数 名:主函数
功能描述:入口函数 ,进行各种初始化配置
输入参数:无
返 回 值:无
备 注:
****************************************************************************************************************/
void main(void)
{
uint temp = 0;
P0M1=0x00; //设置P0口为强推挽输出模式
P0M0=0xFF;
P1M1|=0x80;
P1M0|=0xc8;
P5M1|=0x00;
P5M0|=0x2d;
P4M0|=0x20;
P4M1|=0x00;
Timer_init(); //定时器初始化
Timer0(31); //定时任意值,启动定时器,进入定时器循环
#if MOTOR_NUM > 9
Timer1(30);
#endif
SpiFlashInit();//初始化flash
while((temp = SpiFlashReadID())!=W25Q64)LED_ALL_ON();//判断flash有没有接错
LED_ALL_OFF();
InitMotor();
UART1_Init(); //串口1初始化
UART2_Init(); //串口2初始化
#if PS_SUPPORT
Timer3_init();
#endif
InitADC(7);
BEEP_On_Or_OFF();
while(1)
{
if(flag_vpwm==1)
{
vpwm(); //更新pwm[]数组
flag_vpwm=0;
}
if( flag_RecFul==1) //串口接受完一条指令
{
DealRec(); //处理串口缓存中的数据
flag_RecFul=0;
}
GetOneMotorCMD();//获取一个命令
SendUartState();//发送状态信息
#if PS_SUPPORT
scan_ps2();
#endif
LED_State();
Check_Power();
cur_count++;
}
}
void Check_Power()
{
if ((cur_count % 800) == 0)
{
StartADC(7);
//cur_count=0;
}
if (flag_read_adc)
{
flag_read_adc = 0;
//UART_Put_Inf("adc:",ad_value);
if (ad_value > 46)//根据电压粗略估计
{
//UART_Put_Inf("adc: