嵌入式学习小组
直播中

神之小风

12年用户 842经验值
私信 关注

怎样通过STM32F103C8T6最小系统对OLED进行控制呢

怎样通过STM32F103C8T6最小系统对OLED进行控制呢?有哪些设计步骤呢?

回帖(2)

李宏

2021-12-23 10:15:00
一、项目概述及方案设计

1.嵌入式系统的广泛应用

1.1.1嵌入式系统的简介

        嵌入式系统是指操作系统和功能软件集成于计算机硬件系统之中。简单的说就是系统的应用软件与系统的硬件一体化,类似于BIOS的工作方式。具有软件代码小、高度自动化、响应速度快等特点。特别适合于要求实时的和多任务的体系。
        根据IEEE(电气和电子工程师协会)的定义,嵌入式系统是“控制、监视或者辅助装置、机器和设备运行的装置”(devices used to control, monitor, or assist the operation of equipment, machinery or plants)。从中可以看出嵌入式系统是软件和硬件的综合体,还可以涵盖机械等附属装置。目前国内一个普遍被认同的定义是:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
1.1.2嵌入式系统的应用

1.工业控制:
基于嵌入式芯片的工业自动化设备将获得长足的发展,目前已经有大量的8、16、32 位嵌入式微控制器在应用中,网络化是提高生产效率和产品质量、减少人力资源主要途径,如工业过程控制、数字机床、电力系统、电网安全、电网设备监测、石油化工系统。就传统的工业控制产品而言,低端型采用的往往是8位单片机。但是随着技术的发展,32位、64位的处理器逐渐成为工业控制设备的核心,在未来几年内必将获得长足的发展。
2.交通管理:
在车辆导航、流量控制、信息监测与汽车服务方面,嵌入式系统技术已经获得了广泛的应用,内嵌GPS模块,GSM模块的移动定位终端已经在各种运输行业获得了成功的使用。目前GPS设备已经从尖端产品进入了普通百姓的家庭,只需要几千元,就可以随时随地找到你的位置。
3.  信息家电:
这成称为嵌入式系统最大的应用领域,冰箱、空调等的网络化、智能化将引领人们的生活步入一个崭新的空间。即使你不在家里,也可以通过电话线、网络进行远程控制。在这些设备中,嵌入式系统将大有用武之地。
4.  家庭智能管理系统:
水、电、煤气表的远程自动抄表,安全防火、防盗系统,其中嵌有的专用控制芯片将代替传统的人工检查,并实现更高,更准确和更安全的性能。目前在服务领域,如远程点菜器等已经体现了嵌入式系统的优势。
5.  POS网络及电子商务:
公共交通无接触智能卡(Contactless Smartcard, CSC)发行系统,公共电话卡发行系统,自动售货机,各种智能ATM终端将全面走入人们的生活,到时手持一卡就可以行遍天下。
6.环境工程与自然:
水文资料实时监测,防洪体系及水土质量监测、堤坝安全,地震监测网,实时气象信息网,水源和空气污染监测。在很多环境恶劣,地况复杂的地区,嵌入式系统将实现无人监测。
7.机器人:
嵌入式芯片的发展将使机器人在微型化,高智能方面优势更加明显,同时会大幅度降低机器人的价格,使其在工业领域和服务领域获得更广泛的应用。
这些应用中,可以着重于在控制方面的应用。就远程家电控制而言,除了开发出支持TCP/IP的嵌入式系统之外,家电产品控制协议也需要制订和统一,这需要家电生产厂家来做。同样的道理,所有基于网络的远程控制器件都需要与嵌入式系统之间实现接口,然后再由嵌入式系统来控制并通过网络实现控制。所以,开发和探讨嵌入式系统有着十分重要的意义。
2.项目背景及意义

        随着生活水平的提高,消费电子产品的需求量越来越高,智能手机、平板电脑、显示屏等都需要屏幕显示,并且大家要求的图像颜色、清晰度等不断提高,更加促进光电行业的发展。OLED显示技术与传统的TFT-LCD显示方式不同,无需背光灯,采用非常薄的有机材料涂层和玻璃基板,当有电流通过时,这些有机材料就会发光,而且OLED显示屏幕可以做得更轻更薄,可视角度更大,并且能够显着节省电能。
        OLED 显示技术依驱动方式不同,分为无源驱动OLED(PMOLED)和有源驱OLED(AMOLED)两种。与之相比,AMOLED 具有更多的优势,如采用TFT 基板作为显示基板,理论上可以做任意大的彩色OLED 面板,并且可以实现OLED电视、超薄显示和柔性显示等。
3.设计目标

1:通过STM32F103C8T6最小系统对OLED控制,使得OLED正常显示小组成员的姓名及小组下载好的图片。
2:通过STM32F103C8T6最小系统对OLED控制,使得OLED正常滚动显示的小组成员的姓名及小组下载好的图片。
扩展:
3:通过STM32F103C8T6最小系统对OLED模块和温湿度传感器DHT11的控制,使OLED正常显示DHT11所测得的当下环境的温度和湿度。
4.设计方案对比分析

        完成设计目标,可以通过程序对直接寄存器的设置进行实现,也可以通过库函数来对寄存器设置进行实现,我们选择了通过对库函数来进行实现,因为库函数还是相对于寄存器简单点,而且OLED的库函数配置只需要对其IO口修改和字的数组和图片的数组修改即可。由于最小系统接地和电源的IO口有限,通过查阅资料得知可通过自己画PCB来实现这种功能,由于资源能力有限我们采用面包板对其电源和接地IO口进行扩展来实现该功能。
二、主要相关技术

1.OLED简介

OLED,即有机发光二极管( Organic Light Emitting Diode)。 在此我们使用的是中景园电子的 0.96 寸 OLED 显示屏,该屏有以下特点:
1)0.96 寸 OLED 有黄蓝,白,蓝三种颜色可选;其中黄蓝是屏上 1/4 部分为黄光,下 3/4 为蓝;而且是固定区域显示固定颜色,颜色和显示区域均不能修改;白光则为纯白,也就是黑底白字;蓝色则为纯蓝,也就是黑底蓝字。
2)分辨率为 128*64
3)多种接口方式;OLED 裸屏总共种接口包括:6800、8080 两种并行接口方式、3 线或 4 线的串行 SPI 接口方式、 IIC 接口方式(只需要 2 根线就可以控制 OLED 了!),这五种接口是通过屏上的 BS0~BS2 来配置的。
4)本次实验采用的为中景园电子的四针的IIC 模块。
2.外设模块(OLED和DHT11)

2.1DHT11模块简介

        DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为 4 针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。
2.2引脚说明


Pin
名称
注释
1
VDD
供电 3-5.5VDC
2
DATA
串行数据,单总线
3
NC
空脚,请悬空
4
GND
接地,电源负极
2.3测量分辩率

测量分辨率分别为 8bit(温度)、8bit(湿度)。     
3.虚拟开发环境

        本课程设计所用的虚拟的开发环境为keil公司开发的MDK5;Keil是德国知名软件公司Keil(现已并入ARM 公司)开发的微控制器软件开发平台,是目前ARM内核单片机开发的主流工具。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器在内的完整开发方案,通过一个集成开发环境(uVision)将这些功能组合在一起。uVision当前最高版本是uVision3,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。
4.固件库

实现目标1、2所用固件库(只放了主要代码)
main.c

#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "bmp.h"

int main(void)
  {        u8 t;
                delay_init();                     //          
                NVIC_Configuration();          //
        LED_Init();                             //
        //                delay_ms(8000);
                OLED_Init();                        //
                OLED_Clear()          ;
       
                t=' ';
               
        while(1)
        {               
                OLED_Clear();
                OLED_WR_Byte(0x2e,OLED_CMD);    //
                OLED_WR_Byte(0x2a,OLED_CMD);    //
                OLED_WR_Byte(0x00,OLED_CMD);                //
                OLED_WR_Byte(0x00,OLED_CMD);    //
                OLED_WR_Byte(0x00,OLED_CMD);                //
                OLED_WR_Byte(0x01,OLED_CMD);                //
                OLED_WR_Byte(0x03,OLED_CMD);                //
               
                OLED_ShowCHinese(0,0,0);//
                OLED_ShowCHinese(18,0,1);//
                OLED_ShowCHinese(36,0,2);//
                OLED_ShowCHinese(0,2,3);//
                OLED_ShowCHinese(18,2,4);//
                OLED_ShowCHinese(36,2,5);//
                OLED_ShowCHinese(0,4,6);//
                OLED_ShowCHinese(18,4,7);//
                OLED_ShowCHinese(36,4,8);//
                OLED_ShowCHinese(0,6,9);//
                OLED_ShowCHinese(18,6,10);//
                OLED_ShowCHinese(36,6,11);//
               
                OLED_WR_Byte(0x2f,OLED_CMD);    //
   
               
                //OLED_ShowString(0,3,"19990592",16);
                //OLED_ShowString(8,2,"ZHONGJINGYUAN");  
         //        OLED_ShowString(20,4,"2014/05/01");  
                //OLED_ShowString(0,6,"ASCII:",16);  
                //OLED_ShowString(63,6,"CODE:",16);  
                //OLED_ShowChar(48,6,t,16);//   
                t++;
                if(t>'~')t=' ';
                //
                        delay_ms(9000);
                delay_ms(9000);
                OLED_DrawBMP(0,0,128,8,BMP1);  //
                delay_ms(9000);
                                        delay_ms(9000);
                delay_ms(9000);
                delay_ms(9000);
//                OLED_DrawBMP(0,0,128,8,BMP1);
//                delay_ms(8000);
//                                        delay_ms(8000);
//                delay_ms(8000);
//                delay_ms(8000);
                OLED_Clear();     //
                OLED_WR_Byte(0x2e,OLED_CMD);    //
               
               



        }          
       
}
oled.c

void OLED_Init(void)
{        

         

         
        GPIO_InitTypeDef  GPIO_InitStructure;
       

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);         //使能A端口时钟
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;         
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50Mhz
        GPIO_Init(GPIOA, &GPIO_InitStructure);          //初始化GPIOD3,6
        GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_7);       


delay_ms(800);
OLED_WR_Byte(0xAE,OLED_CMD);//--display off
        OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
        OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
        OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  
        OLED_WR_Byte(0xB0,OLED_CMD);//--set page address
        OLED_WR_Byte(0x81,OLED_CMD); // contract control
        OLED_WR_Byte(0xFF,OLED_CMD);//--128   
        OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap
        OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse
        OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
        OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty
        OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
        OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset
        OLED_WR_Byte(0x00,OLED_CMD);//
       
        OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
        OLED_WR_Byte(0x80,OLED_CMD);//
       
        OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
        OLED_WR_Byte(0x05,OLED_CMD);//
       
        OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period
        OLED_WR_Byte(0xF1,OLED_CMD);//
       
        OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
        OLED_WR_Byte(0x12,OLED_CMD);//
       
        OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh
        OLED_WR_Byte(0x30,OLED_CMD);//
       
        OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
        OLED_WR_Byte(0x14,OLED_CMD);//
       
        OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
}  
oledfont.h


char Hzk[][36]={

{0x10,0x12,0xF2,0xAA,0xAA,0xBF,0xA0,0xE0,0xA0,0xA7,0xAA,0xAA,0xEA,0x09,0x0C,0x00},
{0x20,0x20,0xAB,0x6A,0x2A,0x3E,0x2A,0x2B,0x2A,0x3E,0x2A,0x6A,0xAB,0x20,0x20,0x00},

{0x00,0x80,0x60,0xF8,0x07,0x08,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0x08,0x00},
{0x01,0x00,0x00,0xFF,0x00,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x12,0x22,0x1E,0x00},{0x00,0x08,0xC8,0x38,0x8F,0x08,0x28,0x10,0xFC,0x4B,0x48,0xF9,0x4A,0x48,0x08,0x00},
{0x04,0x23,0x70,0x2C,0x23,0x28,0x70,0x00,0xFF,0x22,0x22,0x3F,0x22,0x22,0x20,0x00},

{0x00,0x12,0x22,0x42,0x82,0x62,0x1E,0x00,0x00,0xFE,0x02,0x22,0xDA,0x06,0x00,0x00},
{0x20,0x10,0x08,0x06,0x01,0x06,0x18,0x00,0x00,0xFF,0x08,0x10,0x08,0x07,0x00,0x00},

{0x40,0x48,0x48,0xC8,0x7F,0xC8,0x48,0x00,0x48,0xC8,0x7F,0xC8,0x48,0x40,0x40,0x00},
{0x88,0x46,0x30,0x4F,0x80,0x7F,0x02,0x84,0x62,0x1F,0x80,0xFF,0x02,0x04,0x08,0x00},

{0x10,0x10,0xD0,0xFF,0x90,0x08,0x88,0x68,0x18,0x0F,0xE8,0x08,0x08,0x08,0x08,0x00},
{0x04,0x03,0x00,0xFF,0x00,0x21,0x11,0x0D,0x41,0x81,0x7F,0x01,0x05,0x09,0x30,0x00},
{0x00,0x06,0x84,0xE4,0x3C,0x24,0x24,0x2F,0xF4,0x24,0x24,0x24,0x24,0x26,0x00,0x00},
{0x02,0x01,0x00,0xFF,0x49,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x40,0x00,0x00},

{0x00,0x02,0x82,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x82,0x82,0x02,0x00,0x00},
{0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x44,0x58,0x40,0x40,0x40,0x00},

{0x00,0x08,0x08,0x88,0x48,0x28,0x18,0xFF,0x18,0x28,0x48,0x88,0x08,0x08,0x00,0x00},
{0x82,0x42,0x31,0x00,0x00,0x10,0x60,0x07,0x10,0x60,0x00,0x00,0x11,0xE2,0x02,0x00},

{0x04,0x44,0x84,0x14,0x64,0x0F,0x04,0xE4,0x24,0x2F,0x24,0x24,0xE4,0x04,0x04,0x00},
{0x00,0x08,0x09,0x78,0x04,0x03,0x00,0x3F,0x40,0x40,0x42,0x44,0x43,0x40,0x78,0x00},

{0x44,0x58,0xC0,0x7F,0xD0,0x48,0x00,0x2A,0x12,0xBE,0x00,0x2A,0x92,0x3E,0x00,0x00},
{0x80,0x60,0x1F,0x00,0x7F,0x20,0x14,0x02,0xFF,0x55,0x55,0x7F,0x55,0x55,0x41,0x00},

{0x04,0x34,0xC4,0x04,0xC4,0x3C,0x00,0x04,0xFC,0x04,0x04,0x04,0xC4,0x3C,0x00,0x00},
{0x40,0x30,0x0C,0x03,0x0C,0x30,0x80,0x40,0x20,0x13,0x0C,0x13,0x20,0x40,0x80,0x00},


};
实现扩展目标所用固件库
举报

郭静

2021-12-23 10:15:03
main.c

#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "bmp.h"
#include "Time.h"
#include "DHT11.h"

#define KEY1 PAin(4)
#define KEY2 PAin(2)
#define KEY3 PAin(1)
#define KEY4 PAin(0)

#define KEY_NUM1 1
#define KEY_NUM2 2
#define KEY_NUM3 3
#define KEY_NUM4 4

uint8_t KEY_Value; //°´¼üÖµ±äÁ¿
extern u16 miao,fen,shi;

void LED_GPIO_Init(void)//°´¼üGPIOÅäÖÃ
{
        GPIO_InitTypeDef  GPIO_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         //
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;         
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//
        GPIO_Init(GPIOB, &GPIO_InitStructure);          //
        GPIO_SetBits(GPIOB,GPIO_Pin_0);
}


int main(void)
  {
                u8 temperature;              
          u8 humidity;
                delay_init();                     //          
                NVIC_Configuration();          //       
                OLED_Init();                        //

                DHT11_Init();
                TIM3_Int_Init(999,7199);
                NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
                OLED_Clear();
                OLED_ShowString(24,0, "DHT11",16);
                OLED_ShowCHinese(80,0,0);//²â
                OLED_ShowCHinese(96,0,1);//ÎÂ
                OLED_ShowString(0,2,"Temp:   C",16);         
                OLED_ShowString(0,4,"Humi:   %",16);         
        while(1)
        {               

                        if(miao>=4)
                                        {
                                          PBout(0)=!PBout(0);//LEDÉÁ˸
                  DHT11_Read_Data(&temperature,&humidity);        //                                                       
                              OLED_ShowNum(40,2,temperature,2,16);        //                             
                              OLED_ShowNum(40,4,humidity,2,16);                //
                                          miao=0;
                                        }
        }          
       
}
oledfont.h

char Hzk[][32]={


{0x10,0x60,0x02,0x8C,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0xFF,0x00,0x00},
{0x04,0x04,0x7E,0x01,0x80,0x47,0x30,0x0F,0x10,0x27,0x00,0x47,0x80,0x7F,0x00,0x00},/*"测",0*/

{0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00},
{0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00},/*"温",1*/

};


dht11.c

u8 DHT11_Init(void)
{         
        GPIO_InitTypeDef  GPIO_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         //
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;                                 //
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);                                 //
        GPIO_SetBits(GPIOB,GPIO_Pin_11);                                                 //
                            
        DHT11_Rst();  //¸´Î»DHT11
        return DHT11_Check();//µÈ´ýDHT11µÄ»ØÓ¦
}


三、软件设计

1.系统所用资源

1:杜邦线                       若干条
2:STM32F103C8T6最小系统      1个
3:面包板                       1个
4:DHT11                       1个
5:OLED                        1个
6:USB转TTL模块              1个
2.主流程图


3.模块流程图


四、结语

以上是本人通过查阅资料和自己学习的成果,通过最小系统STM32F103C8T6对OLED进行控制使其显示图像和姓名及用温湿度模块对环境温度进行采集,将环境温度显示在OLED屏幕上,希望这些内容可以帮助读者解决一些基础问题,同时也希望读者能够充分利用网上资源去学习。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分