【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

相关文章

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

MyBatis设计SQL返回布尔值(Boolean)的常见方法

《MyBatis设计SQL返回布尔值(Boolean)的常见方法》这篇文章主要为大家详细介绍了MyBatis设计SQL返回布尔值(Boolean)的几种常见方法,文中的示例代码讲解详细,感兴趣的小伙伴... 目录方案一:使用COUNT查询存在性(推荐)方案二:条件表达式直接返回布尔方案三:存在性检查(EXI

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

css实现图片旋转功能

《css实现图片旋转功能》:本文主要介绍了四种CSS变换效果:图片旋转90度、水平翻转、垂直翻转,并附带了相应的代码示例,详细内容请阅读本文,希望能对你有所帮助... 一 css实现图片旋转90度.icon{ -moz-transform:rotate(-90deg); -webkit-transfo

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用

Qt QWidget实现图片旋转动画

《QtQWidget实现图片旋转动画》这篇文章主要为大家详细介绍了如何使用了Qt和QWidget实现图片旋转动画效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、效果展示二、源码分享本例程通过QGraphicsView实现svg格式图片旋转。.hpjavascript

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

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