【STM32单片机】旋转太空人设计

2023-12-15 20:36

本文主要是介绍【STM32单片机】旋转太空人设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

本项目使用STM32F103C8T6单片机控制器,使IIC OLED液晶等。
主要功能:
系统运行后,OLED显示动画界面。


二、软件设计

/*
作者:嗨小易(QQ:3443792007)*/void IIC_GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(OLED_SCL_RCC|OLED_SDA_RCC, ENABLE);	/* 打开GPIO时钟 */GPIO_InitStructure.GPIO_Pin = OLED_SCL_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  	//开漏输出GPIO_Init(OLED_SCL_GPIO_PORT, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = OLED_SDA_PIN;GPIO_Init(OLED_SDA_GPIO_PORT, &GPIO_InitStructure);//给一个停止信号, 复位IIC总线上的所有设备到待机模式IIC_Stop();
}//初始化SSD1306
void OLED_Init(void)
{HZ=GB16_NUM();delay_ms(100);IIC_GPIO_Config();Write_IIC_Command(0xAE); //--display offWrite_IIC_Command(0x00); //---set low column addressWrite_IIC_Command(0x10); //---set high column addressWrite_IIC_Command(0x40); //--set start line addressWrite_IIC_Command(0xB0); //--set page addressWrite_IIC_Command(0x81); // contract controlWrite_IIC_Command(0xFF); //--128Write_IIC_Command(0xA1); //set segment remapWrite_IIC_Command(0xA6); //--normal / reverseWrite_IIC_Command(0xA8); //--set multiplex ratio(1 to 64)Write_IIC_Command(0x3F); //--1/32 dutyWrite_IIC_Command(0xC8); //Com scan directionWrite_IIC_Command(0xD3); //-set display offsetWrite_IIC_Command(0x00); //Write_IIC_Command(0xD5); //set osc divisionWrite_IIC_Command(0x80); //Write_IIC_Command(0xD8); //set area color mode offWrite_IIC_Command(0x05); //Write_IIC_Command(0xD9); //Set Pre-Charge PeriodWrite_IIC_Command(0xF1); //Write_IIC_Command(0xDA); //set com pin configuartionWrite_IIC_Command(0x12); //Write_IIC_Command(0xDB); //set VcomhWrite_IIC_Command(0x30); //Write_IIC_Command(0x8D); //set charge pump enableWrite_IIC_Command(0x14); //Write_IIC_Command(0xAF); //--turn on oled panel
}static void IIC_Delay(void)
{uint8_t i=3;while(i--);
}/**************************************************
*	函 数 名: IIC_Start
*	功能说明: CPU发起IIC总线启动信号
*	形    参:无
*	返 回 值: 无
***************************************************/
void IIC_Start(void)
{/* 当SCL高电平时,SDA出现一个下跳沿表示IIC总线启动信号 */OLED_SDA=1;OLED_SCL=1;IIC_Delay();OLED_SDA=0;IIC_Delay();OLED_SCL=0;IIC_Delay();
}/*************************************************
*	函 数 名: IIC_Stop
*	功能说明: CPU发起IIC总线停止信号
*	形    参:无
*	返 回 值: 无
*************************************************/
void IIC_Stop(void)
{/* 当SCL高电平时,SDA出现一个上跳沿表示IIC总线停止信号 */OLED_SDA=0;OLED_SCL=1;IIC_Delay();OLED_SDA=1;
}/***************************************************************************
*	函 数 名: IIC_WaitAck
*	功能说明: CPU产生一个时钟,并读取器件的ACK应答信号
*	形    参:无
*	返 回 值: 返回0表示正确应答,1表示无器件响应
****************************************************************************/
//uint8_t IIC_WaitAck(void)
void IIC_WaitAck(void)
{OLED_SDA=1;	/* CPU释放SDA总线 */IIC_Delay();OLED_SCL=1;	/* CPU驱动SCL = 1, 此时器件会返回ACK应答 */IIC_Delay();OLED_SCL=0;IIC_Delay();
}//向IIC总线写数据
void Write_IIC_Byte(uint8_t _ucByte)
{uint8_t i;/* 先发送字节的高位bit7 */for (i = 0; i < 8; i++){		if (_ucByte & 0x80){OLED_SDA=1;}else{OLED_SDA=0;}IIC_Delay();OLED_SCL=1;IIC_Delay();	OLED_SCL=0;_ucByte <<= 1;	/* 左移一个bit */}
}//写命令
void Write_IIC_Command(u8 IIC_Command)
{IIC_Start();Write_IIC_Byte(OLED_ADDRESS);//OLED地址IIC_WaitAck();Write_IIC_Byte(0x00);//寄存器地址IIC_WaitAck();Write_IIC_Byte(IIC_Command);IIC_WaitAck();IIC_Stop();
}//写数据
void Write_IIC_Data(u8 IIC_Data)
{IIC_Start();Write_IIC_Byte(OLED_ADDRESS);//OLED地址IIC_WaitAck();Write_IIC_Byte(0x40);//寄存器地址IIC_WaitAck();Write_IIC_Byte(IIC_Data);IIC_WaitAck();IIC_Stop();
}//将OLED从休眠中唤醒
void OLED_ON(void)
{Write_IIC_Command(0X8D);  //设置电荷泵Write_IIC_Command(0X14);  //开启电荷泵Write_IIC_Command(0XAF);  //OLED唤醒
}//让OLED休眠 -- 休眠模式下,OLED功耗不到10uA
void OLED_OFF(void)
{Write_IIC_Command(0X8D);  //设置电荷泵Write_IIC_Command(0X10);  //关闭电荷泵Write_IIC_Command(0XAE);  //OLED休眠
}//OLED全屏填充
void OLED_Fill(u8 fill_Data)
{u8 m,n;for(m=0;m<8;m++){Write_IIC_Command(0xb0+m);		//page0-page1Write_IIC_Command(0x00);		//low column start addressWrite_IIC_Command(0x10);		//high column start addressfor(n=0;n<130;n++){Write_IIC_Data(fill_Data);}}
}//设置起始点坐标
void OLED_Set_Pos(u8 x, u8 y) 
{ Write_IIC_Command(0xb0+y);Write_IIC_Command((((x+2)&0xf0)>>4)|0x10);Write_IIC_Command(((x+2)&0x0f)|0x01);
}//更新显存到OLED
void OLED_Refresh(void)
{u8 i,n;for(i=0;i<8;i++){Write_IIC_Command(0xb0+i); //设置行起始地址Write_IIC_Command(0x00);   //设置低列起始地址Write_IIC_Command(0x10);   //设置高列起始地址IIC_Start();Write_IIC_Byte(0x78);IIC_WaitAck();Write_IIC_Byte(0x40);IIC_WaitAck();for(n=0;n<130;n++){Write_IIC_Byte(OLED_GRAM[n][i]);IIC_WaitAck();}IIC_Stop();}
}//清屏
void OLED_Clear(void)
{OLED_Fill(0x00);
}//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
void OLED_ShowChar(u8 x, u8 y, u8 chr)
{u8 c = 0, i = 0;c = chr - ' '; //得到偏移后的值if(x > 130 - 1){x = 0;y = y + 2;}OLED_Set_Pos(x, y);for(i = 0; i < 8; i++)Write_IIC_Data(zf[c * 16 + i]);OLED_Set_Pos(x, y + 1);for(i = 0; i < 8; i++)Write_IIC_Data(zf[c * 16 + i + 8]);
}
//m^n函数
u32 oled_pow(u8 m, u8 n)
{u32 result = 1;while(n--)result *= m;return result;
}
//显示个数字
//x,y :起点坐标
//len :数字的位数
//num:数值(0~4294967295);
//mode:   为1:显示0   为0:显示空格
void OLED_ShowNum(u8 x, u8 y, u32 num, u8 len,u8 mode)
{u8 t, temp;u8 enshow=0;for(t = 0; t < len; t++){temp = (num / oled_pow(10, len - t - 1)) % 10;if(enshow==0&&t<(len-1)){if(temp==0){if(mode)OLED_ShowChar(x + 8*t, y, '0');elseOLED_ShowChar(x + 8*t, y, ' ');continue;}else enshow=1; 		 	 }OLED_ShowChar(x + 8*t, y, temp + '0');}
}//显示中英文字符
void OLED_ShowCH(u8 x, u8 y,u8 *chs)
{u32 i=0;u32 j;char* m;while (*chs != '\0'){if (*chs > 0xa0)				//汉字内码都是大于0xa0{for (i=0 ;i < HZ;i++){	if(x>112){x=0;y=y+2;}if ((*chs == hz_index[i*2]) && (*(chs+1) == hz_index[i*2+1])){OLED_Set_Pos(x, y);for(j=0;j<16;j++)Write_IIC_Data(hz[i*32+j]);OLED_Set_Pos(x,y+1);for(j=0;j<16;j++)Write_IIC_Data(hz[i*32+j+16]);x +=16;break;}}chs+=2;}else{if(x>122){x=0;y=y+2;}m=strchr(zf_index,*chs);if (m!=NULL){OLED_Set_Pos(x, y);for(j = 0; j < 8; j++)Write_IIC_Data(zf[((u8)*m-' ') * 16 + j]);OLED_Set_Pos(x, y + 1);for(j = 0; j < 8; j++)Write_IIC_Data(zf[((u8)*m-' ') * 16 + j + 8]);x += 8;}chs++;}}
}// x0,y0 -- 起始点坐标(x0:0~127, y0:0~7); x1,y1 -- 起点对角线(结束点)的坐标(x1:1~128,y1:1~8)
void OLED_DrawBMP(u8 x0,u8 y0,u8 x1,u8 y1,u8 BMP[])
{u16 j=0;u8 x,y;if(y1%8==0)y = y1/8;elsey = y1/8 + 1;for(y=y0;y<y1;y++){OLED_Set_Pos(x0,y);for(x=x0;x<x1;x++){Write_IIC_Data(BMP[j++]);}}
}//清除最后两行文字
void ShowTrashNoPeople(void)
{u8 m,n;				//m起始行数for(m=0;m<8;m++){Write_IIC_Command(0xb0+m);		//page0-page1Write_IIC_Command(0x00);		//low column start addressWrite_IIC_Command(0x10);		//high column start addressfor(n=0;n<130;n++){Write_IIC_Data(0x00);}}
}

三、实验现象

B站演示视频:https://space.bilibili.com/444388619
在这里插入图片描述


联系作者

专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

这篇关于【STM32单片机】旋转太空人设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/497797

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

poj 2187 凸包or旋转qia壳法

题意: 给n(50000)个点,求这些点与点之间距离最大的距离。 解析: 先求凸包然后暴力。 或者旋转卡壳大法。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <s

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

SprinBoot+Vue网络商城海鲜市场的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者,全网30w+

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系