#include "iostm8s003f3.h"//主控芯片的头文件
#include "stdio.h"//需要使用printf()函数故而包含该头文件
#define u8 uint8_t
#define u16 uint16_t
#define u32 uint32_t
typedef unsigned char uint8_t;
typedef unsigned int uint16_t;
typedef unsigned long uint32_t;
/*************************函数声明区域***************************/
void delay(u16 Count); //延时函数声明
void UART1_Init(void); //串口1初始化函数
void UART1_SendByte(u8 data); //串口1发送单个字符函数
void UART1_SendString(u8* Data,u16 len);//串口1发送字符串函数
u8 UART1_ReceiveByte(void); //串口1接收数据函数
int putchar(int ch);
u16 cmd[4];
#define IN1 PC_ODR_ODR7//电机输出引脚OUT2
#define IN2 PC_ODR_ODR6//电机输出引脚OUT1
#define IN3 PC_ODR_ODR5//电机输出引脚OUT4
#define IN4 PC_ODR_ODR4//电机输出引脚OUT3
void motor_init()
{
PC_DDR_DDR4=1;
PC_CR1_C14=1;
PC_CR2_C24=0; //
PC_DDR_DDR5=1;
PC_CR1_C15=1;
PC_CR2_C25=0; //
PC_DDR_DDR6=1;
PC_CR1_C16=1;
PC_CR2_C26=0;
PC_DDR_DDR7=1;
PC_CR1_C17=1;
PC_CR2_C27=0; //
}
void delay(u16 Count)
{
u8 i,j;
while (Count--)
{
for(i=0;i<10;i++)
for(j=0;j<1;j++);
}
}
void main(void)
{
u16 num=0;
CLK_CKDIVR=0x00;//选定HSI时钟源,配置频率为16MHz
delay(10);//延时等待时钟稳定
UART1_Init();//初始化串口1
motor_init();
while(1)
{
cmd[num]=UART1_ReceiveByte();//查询法接收串口数据
num++;
delay(20);
/*实际电机一对应PCB上电机二,实际电机二对应PCB上电机一,下面标PCB上电机号*/
if(cmd[0]==0X5A&&cmd[1]==0XA5&&cmd[2]==0X00&&cmd[3]==0X64)//电机二正转
{
IN1=0;
IN2=1;
}
void UART1_Init(void)
{
//1.设定通信数据位数,此处设定为8位数据位,无校验位
UART1_CR1 = 0x00;
//2.设定通信停止位位数,此处设定为2位停止位
UART1_CR3 = 0x00;
//3.配置通信波特率参数,此处配置为9600bps
UART1_BRR2 = 0x03;
UART1_BRR1 = 0x68;
//4.使能发送和接收功能
UART1_CR2 = 0x0C;
}
/****************************************************************/
//发送单字符函数UART1_SendByte(),有形参data无返回值
/****************************************************************/
void UART1_SendByte(u8 data)
{
UART1_SR&=0xBF;//清零发送完成标志位TC
UART1_DR=data;//发送数据到UART3数据寄存器
//while (!(UART1_SR & 0x80));//【旧版语句,有瑕疵】等待发送完毕
//原来的语句是&上了0x80,其实是判断了TXE位,这种方法不严谨,因为
//发送数据寄存器空不一定说明发送已经完成了,应该判断TC位才正确
while (!(UART1_SR & 0x40));//【新版语句,推荐】等待发送完毕
UART1_SR&=0xBF;//清零发送完成标志位TC
}
/****************************************************************/
//发送字符串函数UART1_SendString(),有2个形参Data和len无返回值
/****************************************************************/
void UART1_SendString(u8* Data,u16 len)
{
u8 i=0;
for(;i<len;i++)
UART1_SendByte(Data[i]);//逐一发送字符数据
}
/****************************************************************/
//接收字符函数UART1_ReceiveByte(),无形参有返回值USART3_RX_BUF
//***********************************************
u8 UART1_ReceiveByte(void)
{
u8 UART1_RX_BUF; //定义接收数据暂存变量
while (!(UART1_SR & 0x20));//等待接收标志
UART1_RX_BUF=UART1_DR;//取回接收到的数据
return UART1_RX_BUF;//返回暂存变量中的数据给调用者
}
/****************************************************************/
//发送字符重定向函数putchar(),有形参ch有返回值int
/****************************************************************/
int putchar(int ch)
{
UART1_SendByte((u8)ch);//将Printf内容发往串口
return (ch);
} |