如何制作一款电子桌宠小狗(软件部分)开源(文章中内置代码附有详细的表明 ...

打印 上一主题 下一主题

主题 1005|帖子 1005|积分 3015

文章目次

  



    • 概要
    • 整体架构流程
    • 技术名词表明
    • 技术细节
    • 小结

  

概要

本项目接纳模块化编程
一、USART1 与 USART3 的运用
USART1 和 USART3 主要负责数据的传输。我们可以通过它们与其他装备举行通讯,实现小狗与外界的互动(STM32 的 USART1 和 USART3 通常会有默认的引脚分配)。见下图

二、PWM 的功能实现
利用 PWM 技术,我们可以精确控制小狗的动作,比如通过调整占空比来模拟小狗的行走结果。
三、TIM 的应用
PWM(脉宽调制)的实现通常必要使用定时器(TIM)来提供精确的时间基准。定时器可以产生周期性的时钟信号,通过对定时器的配置,可以控制 PWM 信号的周期和占空比。利用定时器的计数功能,我们可以在特定的时间点切换输出电平,从而实现不同占空比的 PWM 信号。
四、I2C 控制 OLED
I2C 是毗连 OLED 显示屏的重要方式。通过 I2C 协议,我们能够将小狗的图像和动画数据正确地传输到显示屏上,使其生动呈现。
整体架构流程

通过串口对蓝牙和语音识别功能举行接收和发送,从而实现对单片机的控制。通过 PWM 实现对舵机的控制。通过II2通讯对 OLED 屏举行控制。
技术名词表明

PWM:脉冲宽度调制,通过调节脉冲的宽度来控制信号的平均值。
TIM:定时器,用于产生定时信号或举行时间丈量。
USART:通用同步/异步收发器,用于串行数据通讯。“TX”的全称是“Transmit”(发送),“RX”的全称是“Receive”(接收)。
II2:这个不太明确详细含义,大概是某种特定的标识或参数。
使能:意思是使某一功能或操纵得以启用、生效或实现。
它通常用于描述开启或激活某个特定的本领或机制。
遍历:按照肯定的规则依次访问和处理数据结构中的每个元素的过程。
它就像是逐一查抄数据结构中的每一项,确保不遗漏任何一个元素。
常见的数据结构遍历包括数组遍历、链表遍历、树结构遍历等。通过遍历,可以对数据举行各种操纵,如读取、修改、统计等。
技术细节

蓝牙部分

在界说 TX(发送)引脚时,通常初始化为推挽输出模式;而界说 RX(接收)引脚时,一般初始化为浮空输入或上拉输入模式。设置PA9,PA10分别为TX,RX.
  1. #include "stm32f10x.h"                  // Device header
  2. #include <stdio.h>
  3. #include <stdarg.h>
  4. #include "Delay.h"
  5. #include <stdlib.h>
  6. uint8_t USART1_RxData;                //存储从串口接收到的数据的变量
  7. uint8_t USART1_RxFlag;                //指示串口接收状态的变量,通常用于表示是否有新的数据接收到、接收是否完成等状态信息。
  8. void USART1_Init(void)
  9. {
  10.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);       
  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);        //开启时钟
  12.         GPIO_InitTypeDef GPIO_InitStructure;   //定义结构体
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出,TX
  14.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  15.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  16.         GPIO_Init(GPIOA, &GPIO_InitStructure);                                       
  17.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//表示输入上拉模式。
  18. 在这种模式下,对应引脚被配置为输入模式,并且内部有上拉电阻,使得引脚在没有外部输入时保持高电平。
  19.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  20.         GPIO_Init(GPIOA, &GPIO_InitStructure);                                       
  21.        
  22.         USART_InitTypeDef USART_InitStructure;                                       
  23.         USART_InitStructure.USART_BaudRate = 9600;        //波特率                       
  24.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//这里是选择不用硬件流控制,硬件流控制是一种数据传输的控制方式。它通过使用特定的硬件信号线(如 RTS/CTS 等)来在发送方和接收方之间进行通信,以协调数据的发送和接收速度,确保数据传输的准确性和稳定性,避免数据丢失或错乱。以下情况通常会使用硬件流控制:
  25. 高速数据传输:当数据传输速率较高,需要更精确地控制数据发送和接收时。
  26. 对数据准确性要求高:在一些关键应用中,为了保证数据的完整性,会采用硬件流控制。
  27. 长距离传输:在信号容易受到干扰的长距离传输中,硬件流控制有助于提高传输的可靠性。
  28.         USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;        //两种模式均选择
  29.         USART_InitStructure.USART_Parity = USART_Parity_No;        //        Parity 的意思是奇偶,这里是选择不需要奇偶校验,奇偶校验是一种简单的校验方法,用于检测数据在传输或存储过程中是否发生错误。
  30. 它通过在数据编码中添加一位校验位,使数据中“1”的个数为奇数(奇校验)或偶数(偶校验)。接收方通过检查校验位来判断数据是否正确。
  31.         USART_InitStructure.USART_StopBits = USART_StopBits_1;        //停止位1位
  32.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;                //数据位8位,8b就是8bit。
  33.         USART_Init(USART1, &USART_InitStructure);               
  34.        
  35.         USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                //开启中断       
  36.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                //配置 NVIC 优先级分组为 2。       
  37.         NVIC_InitTypeDef NVIC_InitStructure;                                       
  38.         NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;               
  39.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                       
  40.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;               
  41.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                //使能中断、抢占优先级和响应优先级都设置为 1。抢占优先级:指的是中断能够抢占其他低优先级中断的能力。具有较高抢占优先级的中断可以先被执行,从而中断正在执行的低优先级中断。
  42. 响应优先级:也称为子优先级,它决定了在具有相同抢占优先级的中断同时发生时的执行顺序。响应优先级较高的中断会先被处理。对比串口3,第一个串口的抢占优先级和响应优先级都为 1,意味着它在中断处理中的优先级相对较低。
  43. 第三个串口的抢占优先级为 1,与第一个串口相同,但响应优先级设置为 3,相对较高。这意味着在相同抢占优先级的中断中,第二个串口的中断会优先得到响应和处理
  44.         NVIC_Init(&NVIC_InitStructure);                                               
  45.        
  46.         USART_Cmd(USART1, ENABLE);                //使能                                               
  47. }
  48. //下面是一些函数
  49. USART1_SendByte 和 USART1_SendArray 函数用于通过串口发送单个字节或数组数据。
  50. USART1_SendString 函数用于发送字符串数据。
  51. Serial_Pow 函数用于计算幂运算。
  52. USART1_SendNumber 函数用于发送数字。
  53. USART1_fputc 函数用于将字符输出到串口,使其可以像标准输出一样使用。
  54. USART1_Printf 函数用于格式化并发送数据到串口。
  55. USART1_GetRxFlag 和 USART1_GetRxData 函数用于获取接收标志和接收数据。
  56. USART1_IRQHandler 函数是串口中断处理函数,用于处理接收数据的事件。
  57. void USART1_SendByte(uint8_t Byte)
  58. {
  59.         USART_SendData(USART1, Byte);        //将指定的字节数据写入串口 1 的发送寄存器。       
  60.         while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);        //这是一个等待循环,它会一直等待,直到串口 1 的发送缓冲区为空(即发送完成标志 USART_FLAG_TXE 被设置)。
  61. }
  62. void USART1_SendArray(uint8_t *Array, uint16_t Length)
  63. {
  64.         uint16_t i;
  65.         for (i = 0; i < Length; i ++)               
  66.         {
  67.                 USART1_SendByte(Array[i]);               
  68.         }
  69. }//uint16_t i:定义一个循环变量 i。
  70. for (i = 0; i < Length; i ++):通过循环,从数组的第一个元素开始,依次将每个元素作为一个字节发送出去。
  71. 在每次循环中,通过调用 USART1_SendByte(Array[i]),将当前数组元素发送出去。
  72. void USART1_SendString(char *String)
  73. {
  74.         uint8_t i;
  75.         for (i = 0; String[i] != '\0'; i ++)
  76.         {
  77.                 USART1_SendByte(String[i]);               
  78.         }
  79. }
  80. //uint8_t i:定义一个用于遍历字符串的索引变量i。
  81. for (i = 0; String[i]!= '\0'; i ++):这是一个循环,从字符串的开头开始,一直到遇到字符串的结束标志('\0')为止。
  82. 在循环中,通过USART1_SendByte(String[i]),将字符串的每个字符依次作为一个字节发送出去。这样就实现了将整个字符串通过串口发送出去的功能。
  83. uint32_t Serial_Pow(uint32_t X, uint32_t Y)
  84. {
  85.         uint32_t Result = 1;       
  86.         while (Y --)               
  87.         {
  88.                 Result *= X;               
  89.         }
  90.         return Result;
  91. }
  92. //Serial_Pow 函数用于计算一个数的指定次幂。
  93. uint32_t Result = 1:初始化结果为 1。
  94. while (Y --):这是一个循环,循环次数为 Y 次。
  95. 在循环中,通过不断将当前结果乘以 X,来计算幂值。每次循环后,Y 的值减 1。
  96. 当循环结束后,返回计算得到的幂值。
  97. void USART1_SendNumber(uint32_t Number, uint8_t Length)
  98. {
  99.         uint8_t i;
  100.         for (i = 0; i < Length; i ++)               
  101.         {
  102.                 USART1_SendByte(Number / Serial_Pow(10, Length - i - 1) % 10 + '0');       
  103.         }
  104. }
  105. //uint8_t i:定义一个循环变量 i。
  106. for (i = 0; i < Length; i ++):通过循环,从数字的高位到低位,逐位处理。
  107. 在每次循环中,计算当前位的数值,即 Number 除以 Serial_Pow(10, Length - i - 1) 取余后再加上 '0',将其转换为字符。然后使用 USART1_SendByte 发送该字符。这样就实现了将数字按位发送的效果。
  108. int USART1_fputc(int ch, FILE *f)
  109. {
  110.         USART1_SendByte(ch);                       
  111.         return ch;
  112. }
  113. //USART1_fputc 函数:
  114. USART1_SendByte(ch):将输入的字符 ch 通过 USART1_SendByte 发送出去。
  115. return ch:返回输入的字符。
  116. void USART1_Printf(char *format, ...)
  117. {
  118.         char String[100];                               
  119.         va_list arg;                                       
  120.         va_start(arg, format);                       
  121.         vsprintf(String, format, arg);       
  122.         va_end(arg);                                       
  123.         USART1_SendString(String);
  124. }//定义一个字符数组 String[100] 用于存储格式化后的字符串。
  125. 使用 va_list 和相关函数来处理可变参数,将格式化后的字符串存储到 String 中。
  126. 最后通过 USART1_SendString 将格式化后的字符串发送出去
  127. uint8_t USART1_GetRxFlag(void)
  128. {
  129.         if (USART1_RxFlag == 1)                       
  130.         {
  131.                 USART1_RxFlag = 0;
  132.                 return 1;                                       
  133.         }
  134.         return 0;                                               
  135. }
  136. //检查 USART1_RxFlag 是否为 1,如果是则将其重置为 0,并返回 1,表示接收到数据。
  137. uint8_t USART1_GetRxData(void)
  138. {
  139.         return USART1_RxData;                       
  140. }//返回接收到的串口数据 USART1_RxData。
  141. void USART1_IRQHandler(void)
  142. {
  143.         if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)               
  144.         {
  145.                 USART1_RxData = USART_ReceiveData(USART1);                               
  146.                 USART1_RxFlag = 1;                                                                               
  147.                 USART_ClearITPendingBit(USART1, USART_IT_RXNE);//清除中断挂起位。               
  148.                                                                                                                                
  149.                                                                                                                                
  150.         }
  151. }
  152. //在中断处理函数中,当接收到串口数据(USART_IT_RXNE 标志位被设置为 SET)时,获取接收到的数据并设置 USART1_RxFlag 为 1。
复制代码
语言控制部分(与上文代码大体结构雷同,上文代码中均有表明,此段代码不做表明,参考上文即可理解)


  1. #include "stm32f10x.h"                  // Device header
  2. #include <stdio.h>
  3. #include <stdarg.h>
  4. #include "Delay.h"
  5. #include <stdlib.h>
  6. uint8_t USART3_RxData;               
  7. uint8_t USART3_RxFlag;       
  8. void USART3_Init(void)
  9. {
  10.        
  11.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);       
  12.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);       
  13.         GPIO_InitTypeDef GPIO_InitStructure;
  14.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  15.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  16.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  17.         GPIO_Init(GPIOB, &GPIO_InitStructure);                                       
  18.        
  19.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  20.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  21.         GPIO_Init(GPIOB, &GPIO_InitStructure);                                       
  22.        
  23.        
  24.         USART_InitTypeDef USART_InitStructure;                                       
  25.         USART_InitStructure.USART_BaudRate = 9600;                               
  26.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  27.         USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;       
  28.         USART_InitStructure.USART_Parity = USART_Parity_No;               
  29.         USART_InitStructure.USART_StopBits = USART_StopBits_1;       
  30.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;               
  31.         USART_Init(USART3, &USART_InitStructure);                                       
  32.         USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);                       
  33.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);               
  34.         NVIC_InitTypeDef NVIC_InitStructure;                                                 
  35.     NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;               
  36.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                       
  37.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;               
  38.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;               
  39.         NVIC_Init(&NVIC_InitStructure);                                                       
  40.        
  41.        
  42.         USART_Cmd(USART3, ENABLE);                                                               
  43. }
  44. uint8_t USART3_GetRxFlag(void)
  45. {
  46.         if (USART3_RxFlag == 1)                       
  47.         {
  48.                 USART3_RxFlag = 0;
  49.                 return 1;                               
  50.         }
  51.         return 0;                                               
  52. }
  53. uint8_t USART3_GetRxData(void)
  54. {
  55.         return USART3_RxData;               
  56. }
  57. void USART3_IRQHandler(void)
  58. {
  59.         if (USART_GetITStatus(USART3, USART_IT_RXNE) == SET)
  60.         {
  61.                 USART3_RxData = USART_ReceiveData(USART3);                       
  62.                 USART3_RxFlag = 1;                                                                               
  63.                 USART_ClearITPendingBit(USART3, USART_IT_RXNE);                       
  64.                                                                                                                                
  65.         }
  66. }
复制代码
OLED部分

因内容太多,放于下一期文章,本文侧重点在于控制体系
舵机部分

舵机原理见(【STM32(意法半导体推出的32位微控制器)通过HC-05主从机一体蓝牙模块实现对舵机(SG90)的控制(含源码) - CSDN App】http://t.csdnimg.cn/O6hDl)
PWM、Servo、Movement三个文件共同为驱动舵机服务
PA6:右前脚,PA7:右后脚,PB0:左前脚,PB1:左后脚
PWM

  1. #include "stm32f10x.h"                  // Device header
  2. void PWM_Init(void)
  3. {
  4.     // 使能 TIM3 的时钟
  5.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);   
  6.     // 使能 GPIOA 的时钟
  7.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   
  8.     // 使能 GPIOB 的时钟
  9.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);   
  10.     // GPIO 初始化结构体设置
  11.     GPIO_InitTypeDef GPIO_InitStructure;
  12.     // 设置 GPIO 模式为复用推挽输出
  13.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  14.     // 设置 GPIO 引脚为 PA6 和 PA7
  15.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
  16.     // 设置 GPIO 速度为 50MHz
  17.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  18.     // 初始化 GPIOA
  19.     GPIO_Init(GPIOA, &GPIO_InitStructure);                    
  20.     // 设置 GPIO 引脚为 PB0 和 PB1
  21.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
  22.     // 初始化 GPIOB
  23.     GPIO_Init(GPIOB, &GPIO_InitStructure);                    
  24.     // 配置 TIM3 内部时钟
  25.     TIM_InternalClockConfig(TIM3);        
  26.     // TIM 时间基准初始化结构体设置
  27.     TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;           
  28.     // 设置时钟分频为 1
  29.     TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;  
  30.     // 设置计数器模式为向上计数
  31.     TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  32.     // 设置周期为 20000 - 1
  33.     TIM_TimeBaseInitStructure.TIM_Period = 20000 - 1;            
  34.     // 设置预分频器为 72 - 1
  35.     TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;            
  36.     // 设置重复计数器为 0
  37.     TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;         
  38.     // 初始化 TIM3 的时间基准
  39.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);           
  40.     // TIM 输出比较初始化结构体设置
  41.     TIM_OCInitTypeDef TIM_OCInitStructure;                        
  42.     // 结构体初始化
  43.     TIM_OCStructInit(&TIM_OCInitStructure);                        
  44.     // 设置输出比较模式为 PWM1
  45.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;            
  46.     // 设置输出极性为高
  47.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;      
  48.     // 设置输出使能为启用
  49.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  
  50.     // 设置脉冲宽度为 0
  51.     TIM_OCInitStructure.TIM_Pulse = 0;                              
  52.     // 初始化 TIM3 的通道 2
  53.     TIM_OC2Init(TIM3, &TIM_OCInitStructure);                       
  54.     // 初始化 TIM3 的通道 3
  55.     TIM_OC3Init(TIM3, &TIM_OCInitStructure);
  56.     // 初始化 TIM3 的通道 1
  57.     TIM_OC1Init(TIM3, &TIM_OCInitStructure);
  58.     // 初始化 TIM3 的通道 4
  59.     TIM_OC4Init(TIM3, &TIM_OCInitStructure);
  60.     // 使能 TIM3
  61.     TIM_Cmd(TIM3, ENABLE);      
  62. }
  63. void PWM_SetCompare1(uint16_t Compare)
  64. {
  65.         TIM_SetCompare1(TIM3, Compare);               
  66. }
  67. void PWM_SetCompare2(uint16_t Compare)
  68. {
  69.         TIM_SetCompare2(TIM3, Compare);               
  70. }
  71. void PWM_SetCompare3(uint16_t Compare)
  72. {
  73.         TIM_SetCompare3(TIM3, Compare);               
  74. }
  75. void PWM_SetCompare4(uint16_t Compare)
  76. {
  77.         TIM_SetCompare4(TIM3, Compare);               
  78. }
  79. //设置比较值的主要目的是控制 PWM(脉冲宽度调制)信号的占空比。
  80. 通过改变比较值,可以调整输出信号高电平的持续时间,从而实现对被控对象的精确控制,比如调节电机的转速、灯光的亮度等。不同的比较值对应着不同的占空比,进而影响输出的效果。
复制代码
SERVO

Angle 是舵机角度,范围:0~180
  1. #include "stm32f10x.h"                  // Device header  // 包含 STM32 芯片相关的头文件
  2. #include "PWM.h"  // 包含 PWM 相关的头文件
  3. void Servo_Init(void)  // 定义 Servo_Init 函数
  4. {
  5.     PWM_Init();                                                                          // 调用 PWM_Init 函数进行初始化
  6. }
  7. void Servo_SetAngle1(float Angle)  // 定义 Servo_SetAngle1 函数,用于设置角度 1
  8. {
  9.     PWM_SetCompare1(Angle / 180 * 2000 + 500);        // 根据输入的角度计算比较值并设置
  10. }
  11. void Servo_SetAngle2(float Angle)  // 定义 Servo_SetAngle2 函数,用于设置角度 2
  12. {
  13.     PWM_SetCompare2(Angle / 180 * 2000 + 500);        // 同上
  14. }
  15. void Servo_SetAngle3(float Angle)  // 定义 Servo_SetAngle3 函数,用于设置角度 3
  16. {
  17.     PWM_SetCompare3(Angle / 180 * 2000 + 500);        // 同上
  18. }
  19. void Servo_SetAngle4(float Angle)  // 定义 Servo_SetAngle4 函数,用于设置角度 4
  20. {
  21.     PWM_SetCompare4(Angle / 180 * 2000 + 500);        // 同上
  22. }
  23. uint8_t Servo_GetAngle1(void)  // 定义 Servo_GetAngle1 函数,用于获取角度 1
  24. {
  25.     return (TIM_GetCapture1(TIM3) - 500) * 180 / 2000;  // 通过定时器捕获值计算并返回角度
  26. }
  27. uint8_t Servo_GetAngle2(void)  // 定义 Servo_GetAngle2 函数,用于获取角度 2
  28. {
  29.     return (TIM_GetCapture2(TIM3) - 500) * 180 / 2000;  // 同上
  30. }
  31. uint8_t Servo_GetAngle3(void)  // 定义 Servo_GetAngle3 函数,用于获取角度 3
  32. {
  33.     return (TIM_GetCapture3(TIM3) - 500) * 180 / 2000;  // 同上
  34. }
  35. uint8_t Servo_GetAngle4(void)  // 定义 Servo_GetAngle4 函数,用于获取角度 4
  36. {
  37.     return (TIM_GetCapture4(TIM3) - 500) * 180 / 2000;  // 同上
  38. }
  39. //这样的计算是为了将角度范围转换为相应的定时器比较值,从而实现对 PWM 信号占空比的精确控制,以达到控制伺服o 电机转动角度的目的。
复制代码
MOVEMENT(此段函数是设置一些角度)

  1. #include "stm32f10x.h"                  // Device header
  2. #include "Servo.h"
  3. #include "PWM.h"
  4. #include "Delay.h"
  5. #include "stdlib.h"
  6. int i,j;
  7. int movedelay=150;
  8. uint8_t angle_1, angle_2, angle_3, angle_4;
  9.        
  10. void move_stand(void){
  11.         Servo_SetAngle1(90);
  12.         Servo_SetAngle2(90);
  13.         Servo_SetAngle3(90);
  14.         Servo_SetAngle4(90);
  15.         Delay_ms(500);
  16. }
  17. void move_forward(void){
  18.         Servo_SetAngle1(135);
  19.         Servo_SetAngle4(45);
  20.         Delay_ms(movedelay);
  21.        
  22.         Servo_SetAngle2(45);
  23.         Servo_SetAngle3(135);
  24.         Delay_ms(movedelay);
  25.        
  26.         Servo_SetAngle1(90);
  27.         Servo_SetAngle4(90);
  28.         Delay_ms(movedelay);
  29.        
  30.         Servo_SetAngle2(90);
  31.         Servo_SetAngle3(90);
  32.         Delay_ms(movedelay);
  33.        
  34.         Servo_SetAngle2(135);
  35.         Servo_SetAngle3(45);
  36.         Delay_ms(movedelay);
  37.        
  38.         Servo_SetAngle1(45);
  39.         Servo_SetAngle4(135);
  40.         Delay_ms(movedelay);
  41.        
  42.         Servo_SetAngle2(90);
  43.         Servo_SetAngle3(90);
  44.         Delay_ms(movedelay);
  45.        
  46.         Servo_SetAngle1(90);
  47.         Servo_SetAngle4(90);
  48.         Delay_ms(movedelay);
  49. }
  50. void move_behind(void){
  51.        
  52.         Servo_SetAngle1(45);
  53.         Servo_SetAngle4(135);
  54.         Delay_ms(movedelay);
  55.                
  56.         Servo_SetAngle2(135);
  57.         Servo_SetAngle3(45);
  58.         Delay_ms(movedelay);
  59.                
  60.         Servo_SetAngle1(90);
  61.         Servo_SetAngle4(90);
  62.         Delay_ms(movedelay);
  63.        
  64.         Servo_SetAngle2(90);
  65.         Servo_SetAngle3(90);
  66.         Delay_ms(movedelay);
  67.         Servo_SetAngle2(45);
  68.         Servo_SetAngle3(135);
  69.         Delay_ms(movedelay);
  70.                
  71.         Servo_SetAngle1(135);
  72.         Servo_SetAngle4(45);
  73.         Delay_ms(movedelay);
  74.        
  75.         Servo_SetAngle2(90);
  76.         Servo_SetAngle3(90);
  77.         Delay_ms(movedelay);
  78.        
  79.         Servo_SetAngle1(90);
  80.         Servo_SetAngle4(90);
  81.         Delay_ms(movedelay);
  82. }
  83. void move_right(void){
  84.         Servo_SetAngle1(45);
  85.         Servo_SetAngle4(45);
  86.         Delay_ms(movedelay);
  87.        
  88.         Servo_SetAngle2(135);
  89.         Servo_SetAngle3(135);
  90.         Delay_ms(movedelay);
  91.        
  92.         Servo_SetAngle1(90);
  93.         Servo_SetAngle4(90);
  94.         Delay_ms(movedelay);
  95.        
  96.         Servo_SetAngle2(90);
  97.         Servo_SetAngle3(90);
  98.         Delay_ms(movedelay);
  99. }
  100. void move_left(void)
  101. {
  102.         Servo_SetAngle2(135);
  103.         Servo_SetAngle3(135);
  104.         Delay_ms(movedelay);
  105.        
  106.         Servo_SetAngle1(45);
  107.         Servo_SetAngle4(45);
  108.         Delay_ms(movedelay);
  109.        
  110.         Servo_SetAngle2(90);
  111.         Servo_SetAngle3(90);
  112.         Delay_ms(movedelay);
  113.        
  114.         Servo_SetAngle1(90);
  115.         Servo_SetAngle4(90);
  116.         Delay_ms(movedelay);
  117. }
  118. void move_hello(void)
  119. {
  120.         for(i=0;i<20;i++)//
  121.         {
  122.         Servo_SetAngle1(90-i);
  123.         Servo_SetAngle2(90+i);
  124.         Servo_SetAngle4(90-i);
  125.                 Delay_ms(4);
  126.         }
  127.         for(i=0;i<60;i++)
  128.         {
  129.         Servo_SetAngle2(110+i);
  130.         Servo_SetAngle4(70-i);
  131.                 Delay_ms(4);
  132.         }
  133.         for(i=0;i<60;i++)
  134.         {
  135.                 Servo_SetAngle1(70+i);
  136.                 Delay_ms(4);
  137.         }
  138.         Delay_ms(50);
  139.         Servo_SetAngle1(180);
  140.         Delay_ms(500);
  141.         Servo_SetAngle1(130);
  142.         Delay_ms(500);
  143.         Servo_SetAngle1(180);
  144.         Delay_ms(500);
  145.         Servo_SetAngle1(130);
  146.         Delay_ms(500);
  147.         Servo_SetAngle1(70);
  148.         Delay_ms(500);
  149. }
  150. void move_shake_qianhou(void)
  151. {  
  152.         Servo_SetAngle2(135);
  153.         Servo_SetAngle1(135);
  154.         Servo_SetAngle3(45);
  155.         Servo_SetAngle4(45);
  156.         Delay_ms(150);
  157.         Servo_SetAngle1(90);
  158.         Servo_SetAngle2(90);
  159.         Servo_SetAngle3(90);
  160.         Servo_SetAngle4(90);
  161.         Delay_ms(150);
  162.         Servo_SetAngle2(45);
  163.         Servo_SetAngle1(45);
  164.         Servo_SetAngle3(135);
  165.         Servo_SetAngle4(135);
  166.         Delay_ms(150);
  167.         Servo_SetAngle1(90);
  168.         Servo_SetAngle2(90);
  169.         Servo_SetAngle3(90);
  170.         Servo_SetAngle4(90);
  171.         Delay_ms(150);
  172.        
  173.        
  174. }
  175. void move_shake_zuoyou(void)
  176. {
  177.         Servo_SetAngle1(135);
  178.         Servo_SetAngle2(135);
  179.         Delay_ms(movedelay);
  180.         Servo_SetAngle3(135);
  181.         Servo_SetAngle4(135);
  182.         Delay_ms(movedelay);
  183.         Servo_SetAngle1(90);
  184.         Servo_SetAngle2(90);
  185.         Delay_ms(movedelay);
  186.         Servo_SetAngle3(90);
  187.         Servo_SetAngle4(90);
  188.         Delay_ms(movedelay);
  189.         Servo_SetAngle3(45);
  190.         Servo_SetAngle4(45);
  191.         Delay_ms(movedelay);
  192.         Servo_SetAngle1(45);
  193.         Servo_SetAngle2(45);
  194.         Delay_ms(movedelay);
  195.         Servo_SetAngle3(90);
  196.         Servo_SetAngle4(90);
  197.         Delay_ms(movedelay);
  198.         Servo_SetAngle1(90);
  199.         Servo_SetAngle2(90);
  200.         Delay_ms(movedelay);
  201. }
  202. void move_dance(void)
  203. {
  204.         Servo_SetAngle1(135);
  205.         Servo_SetAngle2(135);
  206.         Delay_ms(movedelay);
  207.         Servo_SetAngle3(135);
  208.         Servo_SetAngle4(135);
  209.         Delay_ms(movedelay);
  210.         Servo_SetAngle1(90);
  211.         Servo_SetAngle2(90);
  212.         Delay_ms(movedelay);
  213.         Servo_SetAngle3(90);
  214.         Servo_SetAngle4(90);
  215.         Delay_ms(movedelay);
  216.        
  217.         Servo_SetAngle2(135);
  218.         Servo_SetAngle1(135);
  219.         Servo_SetAngle3(45);
  220.         Servo_SetAngle4(45);
  221.         Delay_ms(150);
  222.         Servo_SetAngle1(90);
  223.         Servo_SetAngle2(90);
  224.         Servo_SetAngle3(90);
  225.         Servo_SetAngle4(90);
  226.         Delay_ms(150);
  227.        
  228.        
  229.         Servo_SetAngle3(45);
  230.         Servo_SetAngle4(45);
  231.         Delay_ms(movedelay);
  232.         Servo_SetAngle1(45);
  233.         Servo_SetAngle2(45);
  234.         Delay_ms(movedelay);
  235.         Servo_SetAngle3(90);
  236.         Servo_SetAngle4(90);
  237.         Delay_ms(movedelay);
  238.         Servo_SetAngle1(90);
  239.         Servo_SetAngle2(90);
  240.         Delay_ms(movedelay);
  241.        
  242.         Servo_SetAngle2(45);
  243.         Servo_SetAngle1(45);
  244.         Servo_SetAngle3(135);
  245.         Servo_SetAngle4(135);
  246.         Delay_ms(150);
  247.         Servo_SetAngle1(90);
  248.         Servo_SetAngle2(90);
  249.         Servo_SetAngle3(90);
  250.         Servo_SetAngle4(90);
  251.         Delay_ms(150);
  252.        
  253. }
  254. void move_head_up(void)
  255. {
  256.         for(i=0;i<20;i++)
  257.         {
  258.                 Servo_SetAngle1(90-i);
  259.                 Servo_SetAngle3(90+i);
  260.                 Delay_ms(10);
  261.         }
  262.         for(i=0;i<65;i++)
  263.         {
  264.                 Servo_SetAngle2(90+i);
  265.                 Servo_SetAngle4(90-i);
  266.                 Delay_ms(10);
  267.         }
  268. }
  269. void move(uint16_t set1 , uint16_t set2 , uint16_t set3 , uint16_t set4 , uint16_t speed){
  270.         angle_1 = Servo_GetAngle1();
  271.         angle_2 = Servo_GetAngle2();
  272.         angle_3 = Servo_GetAngle3();
  273.         angle_4 = Servo_GetAngle4();
  274.         while (angle_1 != set1 || angle_3 != set3 || angle_2 != set2 || angle_4 != set4) {
  275.                 if (angle_1 > set1) {
  276.                         --angle_1;
  277.                         Servo_SetAngle1(angle_1);
  278.                 } else if (angle_1 < set1) {
  279.                         ++angle_1;
  280.                         Servo_SetAngle1(angle_1);
  281.                 }
  282.        
  283.                 if (angle_3 > set3) {
  284.                         --angle_3;
  285.                         Servo_SetAngle3(angle_3);
  286.                 } else if (angle_3 < set3) {
  287.                         ++angle_3;
  288.                         Servo_SetAngle3(angle_3);
  289.                 }
  290.                 if (angle_2 > set2) {
  291.                         --angle_2;
  292.                         Servo_SetAngle2(angle_2);
  293.                 } else if (angle_2 < set2) {
  294.                         ++angle_2;
  295.                         Servo_SetAngle2(angle_2);
  296.                 }
  297.                 if (angle_4 > set4) {
  298.                         --angle_4;
  299.                         Servo_SetAngle4(angle_4);
  300.                 } else if (angle_4 < set4) {
  301.                         ++angle_4;
  302.                         Servo_SetAngle4(angle_4);
  303.                 }
  304.                 Delay_ms(1000/speed);
  305.         }
  306. }
  307. void move_slow_stand(uint8_t previous_mode){
  308.         if (previous_mode == '0')
  309.                 return;
  310.         angle_1 = Servo_GetAngle1();
  311.         angle_2 = Servo_GetAngle2();
  312.         angle_3 = Servo_GetAngle3();
  313.         angle_4 = Servo_GetAngle4();
  314.         while (angle_1 != 90 || angle_3 != 90 || angle_2 != 90 || angle_4 != 90) {
  315.                 if (angle_1 > 90) {
  316.                         --angle_1;
  317.                         Servo_SetAngle1(angle_1);
  318.                 } else if (angle_1 < 90) {
  319.                         ++angle_1;
  320.                         Servo_SetAngle1(angle_1);
  321.                 }
  322.                 //
  323.                 if (angle_3 > 90) {
  324.                         --angle_3;
  325.                         Servo_SetAngle3(angle_3);
  326.                 } else if (angle_3 < 90) {
  327.                         ++angle_3;
  328.                         Servo_SetAngle3(angle_3);
  329.                 }
  330.                 if (angle_2 > 90) {
  331.                         --angle_2;
  332.                         Servo_SetAngle2(angle_2);
  333.                 } else if (angle_2 < 90) {
  334.                         ++angle_2;
  335.                         Servo_SetAngle2(angle_2);
  336.                 }
  337.                 //
  338.                 if (angle_4 > 90) {
  339.                         --angle_4;
  340.                         Servo_SetAngle4(angle_4);
  341.                 } else if (angle_4 < 90) {
  342.                         ++angle_4;
  343.                         Servo_SetAngle4(angle_4);
  344.                 }
  345.                 Delay_ms(10);
  346.         }
  347. }
  348. void move_stretch(void){
  349.           for(i=0;i<65;i++)
  350.         {
  351.     Servo_SetAngle2(90+i);
  352.         Servo_SetAngle4(90-i);
  353.         Delay_ms(5);
  354.         }
  355.           for(i=0;i<20;i++)
  356.         {
  357.   Servo_SetAngle1(90-i);
  358.         Servo_SetAngle3(90+i);
  359.         Delay_ms(5);
  360.         }
  361.         Delay_ms(1000);
  362.         for(i=0;i<60;i++)
  363.         {
  364.                 Servo_SetAngle1(70+i);
  365.                 Delay_ms(4);
  366.         }
  367.         Delay_ms(1000);
  368.         Servo_SetAngle1(180);
  369.         Delay_ms(500);
  370.         Servo_SetAngle1(130);
  371.         Delay_ms(500);
  372.         Servo_SetAngle1(180);
  373.         Delay_ms(500);
  374.         Servo_SetAngle1(130);
  375.         Delay_ms(500);
  376.         Servo_SetAngle1(70);
  377.         Delay_ms(5);
  378. }
  379. void move_two_hands(void){
  380.         Servo_SetAngle3(20);
  381.         Servo_SetAngle2(20);
  382.         Delay_ms(200);
  383.         Servo_SetAngle3(90);
  384.         Servo_SetAngle2(90);
  385.         Delay_ms(200);
  386.         Servo_SetAngle1(160);
  387.         Servo_SetAngle4(160);
  388.         Delay_ms(200);
  389.         Servo_SetAngle1(90);
  390.         Servo_SetAngle4(90);
  391.         Delay_ms(200);
  392. }
  393. void lan_yao(void){
  394.   for(i=0;i<75;i++)
  395.         {
  396.         Servo_SetAngle1(90+i);
  397.         Servo_SetAngle3(90-i);
  398.         Servo_SetAngle2(90+i/2);
  399.         Servo_SetAngle4(90-i/2);
  400.         Delay_ms(5);
  401.         }
  402.         Delay_ms(movedelay*50);
  403.         for(i=0;i<75;i++)
  404.         {
  405.         Servo_SetAngle1(165-i);
  406.         Servo_SetAngle3(15+i);
  407.         Servo_SetAngle2(127-i/2);
  408.         Servo_SetAngle4(53+i/2);
  409.         Delay_ms(5);
  410.         }
  411.         Delay_ms(movedelay);
  412. }
  413. void move_sleep_p(void) {
  414.         for(i=0;i<75;i++)
  415.         {
  416.                 Servo_SetAngle1(90+i);
  417.                 Servo_SetAngle3(90-i);
  418.                 Delay_ms(10);
  419.         }
  420.         for(i=0;i<75;i++)
  421.         {
  422.                 Servo_SetAngle4(90+i);
  423.                 Servo_SetAngle2(90-i);
  424.                 Delay_ms(10);
  425.         }
  426. }
  427. void move_sleep_w(void) {
  428.                 for(i=0;i<75;i++)
  429.         {
  430.                 Servo_SetAngle3(90+i);
  431.                 Servo_SetAngle1(90-i);
  432.                 Delay_ms(10);
  433.         }
  434.         for(i=0;i<75;i++)
  435.         {
  436.                 Servo_SetAngle2(90+i);
  437.                 Servo_SetAngle4(90-i);
  438.                 Delay_ms(10);
  439.         }
  440. }
复制代码
各器件共同部分(各种器件连在一起完成某个动作)

  1. #include "stm32f10x.h"                  // Device header
  2. #include "stdlib.h"
  3. #include "LED.h"
  4. #include "Delay.h"
  5. #include "OLED.h"
  6. #include "Servo.h"
  7. #include "PWM.h"
  8. #include "Movement.h"
  9. #include "usart1.h"
  10. #include "usart3.h"
  11. #include "stdio.h"
  12. extern uint8_t move_mode1 ;
  13. extern uint8_t move_mode3 ;
  14. extern uint8_t move_mode ;
  15. extern uint8_t previous_mode ;
  16. void mode_forward(void)
  17. {
  18.                         OLED_ShowImage(0, 0, 128, 64, BMP2);
  19.                         move_forward();
  20.                         LED13_Turn();
  21.                         previous_mode = move_mode;
  22.        
  23. }
  24. void mode_behind(void)
  25. {
  26.                         OLED_ShowImage(0, 0, 128, 64, BMP2);
  27.                         move_behind();
  28.                         LED13_Turn();
  29.                         previous_mode = move_mode;
  30.        
  31. }
  32. void mode_left(void)
  33. {
  34.                         OLED_ShowImage(0, 0, 128, 64, BMP3);
  35.                         move_left();
  36.                         LED13_Turn();
  37.                         previous_mode = move_mode;
  38.        
  39.        
  40. }
  41. void mode_right(void)
  42. {
  43.                         OLED_ShowImage(0, 0, 128, 64, BMP4);
  44.                         move_right();
  45.                         LED13_Turn();
  46.                         previous_mode = move_mode;
  47. }
  48. void mode_swing_qianhou(void)
  49. {
  50.                         OLED_ShowImage(0, 0, 128, 64, BMP11);
  51.                         move_shake_qianhou();
  52.                         LED13_Turn();
  53.                         previous_mode = move_mode;
  54. }
  55. void mode_swing_zuoyou(void)
  56. {
  57.                         OLED_ShowImage(0, 0, 128, 64, BMP11);
  58.                         move_shake_zuoyou();
  59.                         LED13_Turn();
  60.                         previous_mode = move_mode;
  61. }
  62. void mode_dance(void)
  63. {
  64.                         OLED_ShowImage(0, 0, 128, 64, BMP5);
  65.                         move_dance();
  66.                         LED13_Turn();
  67.                         previous_mode = move_mode;
  68.        
  69. }
  70. void mode_stand(void)
  71. {
  72.                         OLED_ShowImage(0, 0, 128, 64, BMP1);
  73.                         move_stand();
  74.                         LED13_Turn();
  75.                         previous_mode = move_mode;
  76.                         move_mode = '0';
  77.        
  78. }
  79. void mode_slowstand(void)
  80. {
  81.                        
  82.                         OLED_ShowImage(0, 0, 128, 64, BMP1);
  83.                         move_slow_stand(previous_mode);
  84.                         LED13_Turn();
  85.                         previous_mode = move_mode;
  86.                         move_mode = '0';
  87. }
  88. void mode_strech(void)
  89. {
  90.                         OLED_ShowImage(0, 0, 128, 64, BMP1);
  91.                         move_slow_stand(previous_mode);
  92.                         OLED_ShowImage(0, 0, 128, 64, BMP2);
  93.                         move_stretch();
  94.                         OLED_ShowImage(0, 0, 128, 64, BMP12);
  95.                         LED13_Turn();
  96.                         previous_mode = move_mode;
  97.                         move_mode = '0';
  98.                
  99. }
  100. void mode_hello(void)
  101. {
  102.                         if (previous_mode != '5' && previous_mode != 'D') {
  103.                                 OLED_ShowImage(0, 0, 128, 64, BMP1);
  104.                                 move_slow_stand(previous_mode);
  105.                         }
  106.         OLED_ShowImage(0, 0, 128, 64, BMP12);
  107.                 int i;
  108.         for(i=0;i<20;i++)
  109.         {
  110.         Servo_SetAngle1(90-i);
  111.         Servo_SetAngle2(90+i);
  112.         Servo_SetAngle4(90-i);
  113.                 Delay_ms(7);
  114.         }
  115.         for(i=0;i<40;i++)
  116.         {
  117.         Servo_SetAngle2(110+i);
  118.         Servo_SetAngle4(70-i);
  119.                 Delay_ms(7);
  120.         }
  121.         for(i=0;i<60;i++)
  122.         {
  123.                 Servo_SetAngle1(70+i);
  124.                 Delay_ms(4);
  125.         }
  126.         Delay_ms(50);
  127.         Servo_SetAngle1(180);
  128.         Delay_ms(400);
  129.         Servo_SetAngle1(130);
  130.         Delay_ms(400);
  131.         Servo_SetAngle1(180);
  132.         Delay_ms(400);
  133.         Servo_SetAngle1(130);
  134.         Delay_ms(400);
  135.         Servo_SetAngle1(70);
  136.         Delay_ms(500);
  137.                         LED13_Turn();
  138.                         previous_mode = move_mode;
  139.                         move_mode = '0';
  140. }
  141. void mode_twohands(void)
  142. {
  143.                         OLED_ShowImage(0, 0, 128, 64, BMP1);
  144.                         move_stand();
  145.                         move_two_hands();
  146.                         LED13_Turn();
  147.                         previous_mode = move_mode;
  148.                         move_mode = '0';
  149.        
  150. }
  151. void mode_lanyao(void)
  152. {
  153.                         OLED_ShowImage(0, 0, 128, 64, BMP1);
  154.                         move_slow_stand(previous_mode);
  155.                         OLED_ShowImage(0, 0, 128, 64, BMP9);
  156.                         lan_yao();
  157.                         OLED_ShowImage(0, 0, 128, 64, BMP1);
  158.                         LED13_Turn();
  159.                         previous_mode = move_mode;
  160.                         move_mode = '0';
  161.        
  162. }
  163. void mode_headup(void)
  164. {
  165.                         OLED_ShowImage(0, 0, 128, 64, BMP1);
  166.                         move_slow_stand(previous_mode);
  167.                         OLED_ShowImage(0, 0, 128, 64, BMP10);
  168.                         move_head_up();
  169.                         LED13_Turn();
  170.                         previous_mode = move_mode;
  171.                         move_mode = '0';
  172.        
  173. }
  174. void mode_sleeppa(void)
  175. {
  176.                         if (previous_mode != '5' && previous_mode != 'q') {
  177.                                 OLED_ShowImage(0, 0, 128, 64, BMP1);
  178.                                 move_slow_stand(previous_mode);
  179.                         }
  180.                         if (rand()%2) {
  181.                                 OLED_ShowImage(0, 0, 128, 64, BMP6);
  182.                         }
  183.                         else{
  184.                                 OLED_ShowImage(0, 0, 128, 64, BMP8);
  185.                         }
  186.                         move_sleep_p();
  187.                         previous_mode = move_mode;
  188.                         move_mode = '0';
  189. }
  190. void mode_sleepwo(void)
  191. {
  192.                         if (previous_mode != '5' && previous_mode != 'q') {
  193.                                 OLED_ShowImage(0, 0, 128, 64, BMP1);
  194.                                 move_slow_stand(previous_mode);
  195.                                 Delay_s(1);
  196.                         }
  197.                         if (rand()%2) {
  198.                                 OLED_ShowImage(0, 0, 128, 64, BMP6);
  199.                         }
  200.                         else{
  201.                                 OLED_ShowImage(0, 0, 128, 64 , BMP8);
  202.                         }
  203.                         move_sleep_w();
  204.                         previous_mode = move_mode;
  205.                         move_mode = '0';
  206.                
  207. }
复制代码
主函数逻辑

  1. #include "stm32f10x.h"                  // 包含 STM32 芯片的头文件
  2. #include "stdlib.h"
  3. #include <stdio.h>
  4. #include "LED.h"
  5. #include "Delay.h"
  6. #include "OLED.h"
  7. #include "Servo.h"
  8. #include "PWM.h"
  9. #include "Movement.h"
  10. #include "usart1.h"
  11. #include "usart3.h"
  12. #include "Mode.h"
  13. // 定义变量
  14. uint8_t RxData;  // 接收数据变量
  15. uint8_t move_mode1 = '0';  // 模式 1
  16. uint8_t move_mode3 = '0';  // 模式 3
  17. uint8_t move_mode = '0';  // 当前模式
  18. uint8_t previous_mode = '0';  // 上一个模式
  19. int main(void)  // 主函数
  20. {
  21.     LED_Init();  // 初始化 LED
  22.     OLED_Init();  // 初始化 OLED
  23.     USART1_Init();  // 初始化 USART1
  24.     USART3_Init();  // 初始化 USART3
  25.     Servo_Init();  // 初始化舵机
  26.     OLED_Clear();  // 清屏
  27.     OLED_ShowImage(0, 0, 128, 64, BMP1);  // 显示图像
  28.     mode_stand();  // 进入站立模式
  29.     while (1)  // 主循环
  30.     {
  31.         move_mode1 = USART1_GetRxData();  // 获取 USART1 接收的数据
  32.         move_mode3 = USART3_GetRxData();  // 获取 USART3 接收的数据
  33.         if (USART1_GetRxFlag())  // 如果 USART1 有接收标志
  34.         {
  35.             move_mode = move_mode1;  // 更新当前模式为模式 1
  36.         }
  37.         else if (USART3_GetRxFlag())  // 如果 USART3 有接收标志
  38.         {
  39.             move_mode = move_mode3;  // 更新当前模式为模式 3
  40.         }
  41.         if (move_mode == 'f')  // 如果当前模式为前进
  42.         {
  43.             mode_forward();  // 执行前进模式
  44.         }
  45.         else if (move_mode == 'b')  // 如果当前模式为后退
  46.         {
  47.             mode_behind();  // 执行后退模式
  48.         }
  49.         else if (move_mode == 'l')  // 如果当前模式为左移
  50.         {
  51.             mode_left();  // 执行左移模式
  52.         }
  53.         else if (move_mode == 'r')  // 如果当前模式为右移
  54.         {
  55.             mode_right();  // 执行右移模式
  56.         }
  57.         else if (move_mode == 'w')  // 如果当前模式为前后摆动
  58.         {
  59.             mode_swing_qianhou();  // 执行前后摆动模式
  60.         }
  61.         else if (move_mode == 'z')  // 如果当前模式为左右摆动
  62.         {
  63.             mode_swing_zuoyou();  // 执行左右摆动模式
  64.         }
  65.         else if (move_mode == 'd')  // 如果当前模式为舞蹈
  66.         {
  67.             mode_dance();  // 执行舞蹈模式
  68.         }
  69.         else if (move_mode == '5')  // 如果当前模式为站立
  70.         {
  71.             mode_stand();  // 执行站立模式
  72.         }
  73.         else if (move_mode == 'q' && previous_mode!= '0')  // 如果当前模式为缓慢站立且上一个模式不为 0
  74.         {
  75.             mode_slowstand();  // 执行缓慢站立模式
  76.         }
  77.         else if (move_mode =='s' && previous_mode!= '')  // 如果当前模式为伸展且上一个模式不为伸展
  78.         {
  79.             mode_strech();  // 执行伸展模式
  80.         }
  81.         else if (move_mode == 'j')  // 如果当前模式为双手
  82.         {
  83.             mode_twohands();  // 执行双手模式
  84.         }
  85.         else if (move_mode == 'y')  // 如果当前模式为懒腰
  86.         {
  87.             mode_lanyao();  // 执行懒腰模式
  88.         }
  89.         else if (move_mode == '1')  // 如果当前模式为抬头
  90.         {
  91.             mode_headup();  // 执行抬头模式
  92.         }
  93.         else if (move_mode == 'p' && previous_mode!= 'p')  // 如果当前模式为睡眠且上一个模式不为睡眠
  94.         {
  95.             mode_sleeppa();  // 执行睡眠模式
  96.         }
  97.         else if (move_mode == '2' && previous_mode!= '2')  // 如果当前模式为另一种睡眠且上一个模式不为另一种睡眠
  98.         {
  99.             mode_sleepwo();  // 执行另一种睡眠模式
  100.         }
  101.     }
  102. }
复制代码
LD3320串口版语音模块(需单独烧录)

放置开源代码中,不举行表明,可参考文章(http://【STM32F103C8T6与LD3320举行串口通讯控制LED灯的亮灭 - CSDN App】http://t.csdnimg.cn/8qo2F)

开源代码

通过网盘分享的文件:软件.zip
链接: https://pan.baidu.com/s/1lWq7ZRIU3ooZQUHlGB4-mg?pwd=2003 提取码: 2003


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

商道如狼道

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表