【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设计,视频分享,技术交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/223978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue中实现PDF文件流预览

代码示例 <template><div class"print"><div v-if"!viewShow" class"opt-box"><div style"height: 700px; overflow: auto;"><el-table :data"tableData" border><el-table-column prop…

HTML基础标签

但实际上无论声明为中文还是英文都可以写&#xff0c;中文/英文 主要是浏览器在进行调用翻译功能的时候&#xff0c;会按照声明的语言来进行翻译。 标签语义&#xff1a; 标签的属性一般都是在第一个标签中定义该标签效果所拥有的属性。 即标签的作用是什么 <>标签功能…

CSS——标准流、浮动、Flex布局

1、标准流 标准流也叫文档流&#xff0c;指的是标签在页面中默认的排布规则&#xff0c;例如&#xff1a;块元素独占一行&#xff0c;行内元素可以一行显示多个。 2、浮动 作用&#xff1a;让块元素水平排列 属性名&#xff1a;float 属性值&#xff1a; left&#xff1a;…

做为一个产品经理带你详细了解--动态面板的使用

&#x1f4da;&#x1f4da; &#x1f3c5;我是bing人&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Axure》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一…

卫星影像5天一更新的地图网站

如果全球影像每5天一更新&#xff0c;并集多种地图数据源于一体的PB级海量地图数据该怎样去管理呢&#xff1f; 这是当我了解到SOAR网站之后&#xff0c;思考过的一个问题。 全球最大的在线地图网站 在SOAR的官方网站&#xff0c;据称它是世界上最大的在线地图网站。 它是集…

如何远程访问Axure RP制作的本地web站点实现协同办公

文章目录 前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4.2 启动website隧道4.3 获取公网URL地址4.4. 公网远程访问内网web站点4.5 配置固定二级子域名公网访问内网web站点4.5.1创建一条固定…

深入理解Java关键字volatile

前置知识-了解以下CPU结构 如下图所示&#xff0c;每个CPU都会有自己的一二级缓存&#xff0c;其中一级缓存分为数据缓存和指令缓存&#xff0c;这些缓存的数据都是从内存中读取的&#xff0c;而且每次都会加载一个cache line&#xff0c;关于cache line的大小可以使用命令cat…

stm32与Freertos入门(二)移植FreeRTOS到STM32中

简介 注意&#xff1a;FreeRTOS并不是实时操作系统&#xff0c;而是分时复用的&#xff0c;只不过切换频率很快&#xff0c;感觉上是同时在工作。本次使用的单片机型号为STM32F103C8T6,通过CubeMX快速移植。 一、CubeMX快速移植 1、选择芯片 打开CubeMX软件&#xff0c;进行…

(独白)我为什么选择了计算机行业?

为什么可能很简单&#xff0c;但为什么的为什么就有点长了。就当作讲故事吧 在高中毕业后选择专业时&#xff0c;和大多数人一样&#xff0c;我根本不知道要选择什么专业&#xff0c;更不知道哪个专业发展前景好&#xff0c;哪个专业好就业。在当时比较火的专业我记得应该是土…

使用广播星历进行 GPS 卫星位置的计算

目录 1.计算卫星运动的平均角速度 n 2.计算观测瞬间卫星的近地点角 3.计算偏近点角 4.计算真近点角 f 5.计算升交角距 6.计算摄动改正项 7.进行摄动改正 8.计算卫星在轨道面坐标系中的位置 9.计算观测瞬间升交点的经度 L 10.计算卫星在瞬时地球坐标系中的位置 11.…

JDK21+HADOOP3.2.2+Windows安装步骤

哈哈哈 最近转战大数据这块了&#xff0c;分享一下hadoop3.2.2的安装步骤 借鉴了不少大佬的文章&#xff0c;如有雷同&#xff0c;都是大佬们的 1.JDK安装 我选择的是JDK21 以下是下载网址和截图&#xff0c;这个没有太多的&#xff0c;一般下载最新的就可以 JDK: Java Down…

SQL数列

SQL数列 1、数列概述2、SQL数列2.1、简单递增序列2.2、等差数列2.3、等比数列3、SQL数列的应用3.1、连续问题3.2、多维分析1、数列概述 数列是最常见的数据形式之一,实际数据开发场景中遇到的基本都是有限数列。常见的数列例如:简单递增序列、等差数列、等比数列等 SQL如何实…

Helplook VS Salesforce:哪个知识库更好?

对于组织来说&#xff0c;选择一个合适的平台来管理在线知识库可能是一个具有挑战性的任务。而Salesforce的知识管理功能可以帮助组织更好地管理和分享他们的知识&#xff0c;从而更好地为客户提供服务。这是一种将知识管理集成到CRM平台中的方法&#xff0c;可以简化知识共享和…

vue el-cascader组件change失效以及下拉框不消失的问题

文章目录 1.前言2. 碰到的问题3. 如何解决这两个问题 1.前言 最近项目上用到el-cascader这个组件,需要可以选第一级菜单&#xff0c;也需要可以选第二级菜单&#xff0c;点击完成之后需要关闭下拉框。其实功能比较简单&#xff0c;找了很多资料&#xff0c;没有找到合适的方案…

分类预测 | GASF-CNN格拉姆角场-卷积神经网络的数据分类预测

分类预测 | GASF-CNN格拉姆角场-卷积神经网络的数据分类预测 目录 分类预测 | GASF-CNN格拉姆角场-卷积神经网络的数据分类预测分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.GASF-CNN格拉姆角场-卷积神经网络的数据分类预测&#xff08;完整源码和数据) 2.自…

音乐制作软件Ableton Live 11 mac功能特点

Ableton Live 11 mac是一款数字音频工作站软件&#xff0c;用于音乐制作、录音、混音和现场演出是一款流行的音乐制作软件。 Ableton Live 11 mac特点和功能 Comping功能&#xff1a;Live 11增加了Comping功能&#xff0c;允许用户在不同的录音轨道上进行多次录音&#xff0c;…

springboot自定义starter步骤

引入相关依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional> </dependency><dependency><groupId>org.pro…

《Java已死、前端已凉》:真相与焦虑的辩证

文章目录 Java 企业级支柱Java 在企业级应用中的地位后端开发的支柱Java生态系统的强大 前端&#xff1a;蓬勃发展的创新引擎新技术的涌现用户体验的重要性 Java的演进与创新云原生时代的 Java开发效率和生态系统 前端技术的未来走向WebAssembly 的崛起可访问性和国际化的重要性…

中海达亮相能源北斗与时空智能创新技术应用大会

12月7日-8日&#xff0c;2023年能源北斗与时空智能创新技术应用大会暨鹭岛论坛在厦门举办。本次活动以“能源北斗时空智能”为主题&#xff0c;由中关村智能电力产业技术联盟、中国能源研究会、中国卫星导航定位协会、中国电力科学研究院有限公司、国网信息通信产业集团有限公司…

Java学习之面向对象

一、面向对象 1、引入面向对象 方法中封装的是具体实现某一功能的代码&#xff0c;而通过书写一个拥有多个特定方法的类&#xff0c;来存放的就是一个又一个的方法。 方法都存放在类里面&#xff0c;当需要使用的时候&#xff0c;不用去找具体的方法&#xff0c;而是先找这个…