串口传输、点阵汉字、OLED

一、串口通信
需要进行以下步骤:
准备发送端和接收端的开发环境,并确保串口连接正常。
在发送端,打开要发送的文件,并读取文件内容。
将读取的文件内容通过串口发送给接收端。
在接收端,监听串口数据,并将接收到的数据写入到目标文件中。
实验准备
需要两台电脑,电脑上都下载好串口调试助手,方便接收和发送显示文件。两个串口线连接这两台电脑。打开串口调试助手,开始实验。
在这里插入图片描述

sscom串口助手
sscom串口助手是一款功能强大的串口通信工具,用于在计算机与串口设备之间进行数据交互。它提供了直观的界面和丰富的功能,使用户可以轻松实现串口通信的调试、监控和控制。
主要特点
串口通信调试:sscom串口助手支持用户通过串口与外部设备进行通信调试,可以发送和接收数据,并以多种格式显示接收到的数据,方便用户进行数据分析和问题排查。
数据监控与记录:该工具可以实时监控串口数据的接收情况,并将数据以图表、表格等形式进行展示,以便用户快速分析和监测串口通信的状态。
数据发送和接收:用户可以自定义发送数据的格式和内容,并实时监控串口接收到的数据。同时,sscom串口助手还支持数据的自动发送和循环发送,方便用户进行数据的模拟和测试。
自定义串口参数:用户可以灵活设置串口的波特率、数据位、停止位、校验位等参数,以适配不同的串口设备和通信需求。
实验过程
准备一张需要发送的图片:
在这里插入图片描述
———————————————

在发送端,打开sscom助手,选择要发送的图片:
在这里插入图片描述

同时,设置发送的波特率,检验位等参数,接收方需要设置相同的参数,此点尤为重要
发送图片,在另外一台电脑上打开串口助手接收:
在这里插入图片描述

完全接收后,点击保存数据,并在响应的地方找到保存的数据,将后缀DAT改为发送数据的后缀名:
可以看见显示了发送的图片:
在这里插入图片描述

二、汉字点阵
区位码和机内码
区位码和机内码是计算机中用于表示汉字的两种编码方式。
区位码(Quwei Code):
区位码是一种早期的汉字编码方式,用于将汉字转换为计算机能够理解的数字编码。区位码将每个汉字分为区和位两个部分进行编码。其中,区码表示汉字所在的区,取值范围为0xA1至0xFE;位码表示汉字在区内的位置,取值范围为0xA1至0xFE。通过区位码,可以将汉字转换为一个两字节的编码。
区位码的缺点是无法表示所有的汉字,因为汉字的数量远远超过了区位码的编码范围。为了解决这个问题,后来出现了更加完备的汉字编码方式,如GB2312、GBK和GB18030。
机内码(Internal Code):
机内码是一种在计算机内部使用的汉字编码方式,用于在计算机内部表示和处理汉字。机内码通常采用固定长度的编码,每个汉字对应一个特定的编码,这样可以保证在计算机内部统一处理汉字。
机内码的常见编码方式包括Unicode和GBK。Unicode是一种国际标准的字符编码方案,包含了世界上几乎所有的字符,每个字符都有唯一的编码。GBK是一种国家标准的中文字符集编码,扩展了GB2312的编码范围,支持更多的汉字和符号。
机内码的优点是能够准确地表示和处理汉字,确保在计算机内部的字符处理过程中不会出现乱码或信息丢失的问题。
区位码和机内码是汉字编码的两种不同方式,区位码主要适用于早期的汉字编码需求,而机内码则是现代计算机系统中普遍使用的汉字编码方式。随着计算机技术的发展和国际化的需求,机内码已经成为了广泛使用的汉字编码方式,保证了汉字在计算机系统中的准确表示和处理。
点阵字库存储
点阵字库是一种用于存储和表示字形的数据结构,广泛应用于计算机、打印机、显示屏等设备中。它将每个字符的字形表示为一个由二进制位组成的矩阵,其中每个位表示一个像素的状态(如黑或白)。点阵字库的存储方式可以有多种形式,如位图、字节序列或字节流等。
点阵字库的存储方式主要有两种:固定宽度和变宽度。
固定宽度点阵字库:
固定宽度点阵字库将每个字符的字形表示为一个固定宽度的矩阵。例如,一个8x8的固定宽度点阵字库可以表示每个字符为一个8行8列的矩阵。每个像素位可以用一个二进制位表示,0代表空白像素,1代表实心像素。这种存储方式简单直观,适用于具有相同宽度的等宽字体。
变宽度点阵字库:
变宽度点阵字库将每个字符的字形表示为一个变宽度的矩阵。由于不同字符的宽度可能不同,所以在存储时需要考虑字符的实际宽度。一种常见的存储方式是使用位图,每个字符的字形被编码为一个位图图像。在位图中,每个像素位表示一个像素的状态(如黑或白)。字符的宽度可以通过位图的宽度进行确定。
点阵字库的存储方式决定了字库的占用空间和字形的显示效果。固定宽度点阵字库通常占用的空间相对较小,但在显示时可能会出现字符间距不均匀的问题。变宽度点阵字库可以更准确地表示字符的字形,但相应地需要更多的存储空间。
点阵字库的存储方式对于字形的渲染和显示有着重要的影响。设备在使用点阵字库时,可以根据存储的字形数据来绘制字符的轮廓或像素点阵,以实现字符的显示和输出。
利用汉字机内码获取汉字
利用汉字的机内码获取汉字的原理是通过查找对应的字形数据来获取字符的具体形态。计算机中使用的汉字编码方式(如GBK、Unicode)将每个汉字映射到一个唯一的机内码,这个机内码可以作为索引来查找相应的字形数据。通过读取和解析字库或字形数据,计算机可以获取汉字的点阵或轮廓信息,从而实现对汉字的显示和处理。
在Linux(Ubuntu)下使用C++调用OpenCV显示图片及文字
实验要求
打开一个名为"logo.txt"的文本文件(其中只有一行文本文件,包括你自己的名字和学号),按照名字和学号去读取汉字24*24点阵字形字库(压缩包中的文件HZKf2424.hz)中对应字符的字形数据,将名字和学号叠加显示在此图片右下位置。
资料配置
一张需要显示的图片
24x24的点阵hz文件
ASCII码.zf文件
需要显示的文本文件
在这里插入图片描述

logo.txt文件用ANSI格式保存
在这里插入图片描述

实验代码
代码word.cpp

#include<opencv2/opencv.hpp>
#include "opencv2/core/core_c.h"

//#include "opencv2/core/core_c.h"
//#include "opencv2/imgproc/imgproc_c.h"
//#include "opencv2/photo/photo_c.h"
//#include "opencv2/video/tracking_c.h"
//#include "opencv2/objdetect/objdetect_c.h"
//#include<opencv4/opencv2/cxcore.h>
#include<opencv4/opencv2/highgui.hpp>
#include<math.h>



using namespace cv;
using namespace std;

void paint_chinese(Mat& image,int x_offset,int y_offset,unsigned long offset);
void paint_ascii(Mat& image,int x_offset,int y_offset,unsigned long offset);
void put_text_to_image(int x_offset,int y_offset,String image_path,char* logo_path);

int main()
{
    String image_path="plan.jpg";//图片的名字
    char* logo_path="logo.txt";//汉字文件的名字
    put_text_to_image(200,350,image_path,logo_path);//change txt place
    return 0;
}

void paint_ascii(Mat& image,int x_offset,int y_offset,unsigned long offset){
    //绘制的起点坐标
	Point p;
	p.x = x_offset;
	p.y = y_offset;
	 //存放ascii字膜
	char buff[16];           
	//打开ascii字库文件
	FILE *ASCII;

	if ((ASCII = fopen("Asci0816.zf", "rb")) == NULL){
		printf("Can't open ascii.zf,Please check the path!");
		//getch();
		exit(0);
	}

	fseek(ASCII, offset, SEEK_SET);
	fread(buff, 16, 1, ASCII);

	int i, j;
	Point p1 = p;
	for (i = 0; i<16; i++)                  //十六个char
	{
		p.x = x_offset;
		for (j = 0; j < 8; j++)              //一个char八个bit
		{
			p1 = p;
			if (buff[i] & (0x80 >> j))    /*测试当前位是否为1*/
			{
				/*
					由于原本ascii字膜是8*16的,不够大,
					所以原本的一个像素点用4个像素点替换,
					替换后就有16*32个像素点
					ps:感觉这样写代码多余了,但目前暂时只想到了这种方法
				*/
				circle(image, p1, 0, Scalar(0, 0, 255), -1);
				p1.x++;
				circle(image, p1, 0, Scalar(0, 0, 255), -1);
				p1.y++;
				circle(image, p1, 0, Scalar(0, 0, 255), -1);
				p1.x--;
			   circle(image, p1, 0, Scalar(0, 0, 255), -1);
			}						
            p.x+=2;            //原来的一个像素点变为四个像素点,所以x和y都应该+2
		}
		p.y+=2;
	}
}
void paint_chinese(Mat& image,int x_offset,int y_offset,unsigned long offset){//在图片上画汉字
    Point p;
    p.x=x_offset;
    p.y=y_offset;
    FILE *HZK;
    char buff[72];//72个字节,用来存放汉字的

    if((HZK=fopen("HZKf2424.hz","rb"))==NULL){
        printf("Can't open HZKf2424.hz,Please check the path!");
        exit(0);//退出
    }
    fseek(HZK, offset, SEEK_SET);/*将文件指针移动到偏移量的位置*/
    fread(buff, 72, 1, HZK);/*从偏移量的位置读取72个字节,每个汉字占72个字节*/
    bool mat[24][24];//定义一个新的矩阵存放转置后的文字字膜
    int i,j,k;
    for (i = 0; i<24; i++)                 /*24x24点阵汉字,一共有24行*/
	{
        	for (j = 0; j<3; j++)                /*横向有3个字节,循环判断每个字节的*/
			for (k = 0; k<8; k++)              /*每个字节有8位,循环判断每位是否为1*/
				if (buff[i * 3 + j] & (0x80 >> k))    /*测试当前位是否为1*/
				{
					mat[j * 8 + k][i] = true;          /*为1的存入新的字膜中*/
				}
				else {
					mat[j * 8 + k][i] = false;
				}
	}
	
    for (i = 0; i < 24; i++)
	{
		p.x = x_offset;
		for (j = 0; j < 24; j++)
		{		
			if (mat[i][j])
				circle(image, p, 1, Scalar(255, 0, 0), -1);		  //写(替换)像素点
			p.x++;                                                //右移一个像素点
		}
		p.y++;                                                    //下移一个像素点
	}
}

void put_text_to_image(int x_offset,int y_offset,String image_path,char* logo_path){//将汉字弄上图片
//x和y就是第一个字在图片上的起始坐标
    //通过图片路径获取图片
    Mat image=imread(image_path);
    int length=19;//要打印的字符长度(打印多少字节长度就为多少,根据自己的情况调整)
    unsigned char qh,wh;//定义区号,位号
    unsigned long offset;//偏移量
    unsigned char hexcode[30];//用于存放记事本读取的十六进制,记得要用无符号
    FILE* file_logo;

    if ((file_logo = fopen(logo_path, "rb")) == NULL){
		printf("Can't open txtfile,Please check the path!");
		//getch();
		exit(0);
	}

    fseek(file_logo, 0, SEEK_SET);
    fread(hexcode, length, 1, file_logo);
    int x =x_offset,y = y_offset;//x,y:在图片上绘制文字的起始坐标

    for(int m=0;m<length;){
        if(hexcode[m]==0x23){
            break;//读到#号时结束
        }
        else if(hexcode[m]>0xaf){
            qh=hexcode[m]-0xaf;//使用的字库里是以汉字啊开头,而不是以汉字符号开头
            wh=hexcode[m+1] - 0xa0;//计算位码
            offset=(94*(qh-1)+(wh-1))*72L;
            paint_chinese(image,x,y,offset);
            /*
            计算在汉字库中的偏移量
            对于每个汉字,使用24*24的点阵来表示的
            一行有三个字节,一共24行,所以需要72个字节来表示
            */

            m=m+2;//一个汉字的机内码占两个字节,
            x+=24;//一个汉字为24*24个像素点,由于是水平放置,所以是向右移动24个像素点
        }

        else{
        //当读取的字符为ASCII码时
        wh=hexcode[m];
        offset=wh*16l;//计算英文字符的偏移量
        paint_ascii(image,x,y,offset);
        m++;//英文字符在文件里表示只占一个字节,所以往后移一位就行了
        x+=16;
        }

    }

    cv::imshow("image", image);
    cv::waitKey();
}

实验结果:
在这里插入图片描述

三、OLED
模块简介
OLED(Organic Light Emitting Diode)是一种采用有机物作为发光材料的显示技术。OLED模块由OLED显示屏和控制电路组成,具有高对比度、快速响应、广视角和低功耗等特点,适用于各种嵌入式系统和电子产品中。

以下是常见的OLED模块的参数表格:
在这里插入图片描述

不同型号和厂商的OLED模块可能具有不同的参数和特性。在选择和使用OLED模块时,需要根据实际需求和项目要求进行选择。
OLED模块广泛应用于智能手表、可穿戴设备、便携式仪器、嵌入式系统、物联网终端等领域。其高品质的图像显示效果和低功耗的特性,使其成为许多电子产品中理想的显示解决方案。
OLED显示文字的方法
利用软件取模
PCtoLCD2002是一款专业的OLED取模软件,它支持多种取模方式,包括逐行、逐列、行列、列行四种取模方式。用户可以根据需要选择字体、大小、文字的长宽,并可独立调整文字的长和宽,生成任意形状的字符。
该软件还支持中英文数字混合的字符串的字模数据生成,并可以选择字体、大小。同时,每行输出数据个数可调整,且支持自定义取模方式及输出格式。
值得一提的是,PCtoLCD2002完美版支持生成的字模可以在任何电脑上使用,不会受到操作系统的限制。
总的来说,PCtoLCD2002完美版是一款功能强大的OLED取模软件,能够满足用户在OLED取模方面的各种需求
在这里插入图片描述

英文
打开取模软件
在这里插入图片描述

汉字取模
2.1 点击模式,选择字符模式
点击选项,进行设置
设置如下,点阵内的数字手动输入999,然后点击确定。
在这里插入图片描述
以生成8x16字符为例
3.1字宽,字高选择16,那么对应的英文长宽就是8x16!!!
在输入栏输入文档开头的全部ASCII码,点击生成字模。
在这里插入图片描述

4将生成的字模复制到oledfont.h的数组中
在这里插入图片描述
STM32F103与OLED的连接
代码:
OLED.c 内容过多,此处只讲OLED.h部分,具体函数请读者自行编写或查阅

#ifndef __OLED_H
#define __OLED_H

void OLED_Init(void);
void OLED_Clear(void);
void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char);
void OLED_ShowString(uint8_t Line, uint8_t Column, char *String);
void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length);
void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);

#endif

这段代码是一个简单的OLED库的头文件,定义了一些函数来控制OLED显示屏的初始化、清屏以及显示字符、字符串、数字和二进制数等功能。
函数解释:

OLED_Init():初始化OLED显示屏。
OLED_Clear():清除OLED显示屏上的内容。
OLED_ShowChar(uint8_t Line, uint8_t Column, char Char):在指定的行和列位置显示一个字符。
OLED_ShowString(uint8_t Line, uint8_t Column, char *String):在指定的行和列位置显示一个字符串。
OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length):在指定的行和列位置显示一个无符号整数。
OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length):在指定的行和列位置显示一个有符号整数。
OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length):在指定的行和列位置显示一个十六进制数。
OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length):在指定的行和列位置显示一个二进制数。

这些函数可以通过调用库文件中的相关函数来实现OLED显示屏的控制和数据显示。用户可以根据需要调用这些函数来显示不同的内容。
示例

void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{
	uint8_t i;
	for (i = 0; i < Length; i++)							
	{
		OLED_ShowChar(Line, Column + i, Number / OLED_Pow(10, Length - i - 1) % 10 + '0');
	}
}

这段代码是OLED_ShowNum()函数的实现,用于在OLED显示屏上显示一个无符号整数。
函数解释:

OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length):函数接受四个参数,分别是要显示的数字所在的行和列位置、要显示的数字以及数字的长度。
for (i = 0; i < Length; i++):使用循环来逐个显示数字的每一位。
OLED_ShowChar(Line, Column + i, Number / OLED_Pow(10, Length - i - 1) % 10 + '0'):调用OLED_ShowChar()函数来显示每一位数字。具体的显示位置由Line和Column + i确定。通过对Number进行数学运算,可以得到每一位数字的值,并将其转换为对应的字符形式。

该函数通过循环将数字分解为每一位,并调用OLED_ShowChar()函数来在OLED显示屏上逐个显示每一位数字。用户可以通过调用该函数,传入相应的参数来实现在OLED显示屏上显示无符号整数的功能。
实验一
显示自己的学号和姓名;
利用汉字取模软件,生成的编码放到oled_front.h中
main函数:

#include "stm32f10x.h"                 
#include "Delay.h"
#include "OLED.h"
#include "Delay.h"
#include "LED.h"
#include "usart.h"

extern unsigned int rec_data[4];

int main(void)
{
	OLED_Init();
	
	OLED_ShowHZ(1,1,12);
	OLED_ShowHZ(1,3,14);
	OLED_ShowHZ(1,5,16);
	OLED_ShowString(2,1,"632107030112");
	while (1)
	{
		
	}

}

实验效果:
在这里插入图片描述

实验二
显示AHT20的温度和湿度:

#include "stm32f10x.h"                 
#include "Delay.h"
#include "OLED.h"
#include "Delay.h"
#include "LightSensor.h"
#include "LED.h"
#include "dht20.h"
#include "usart.h"

extern unsigned int rec_data[4];

int main(void)
{
	OLED_Init();
	uart_init(9600);
	LightSensor_Init();
	LED_Init();
	OLED_ShowHZ(2,5,0); //ÎÂ
	OLED_ShowHZ(2,7,2); //¶È
	OLED_ShowHZ(2,9,4);	//:
	OLED_ShowHZ(2,12,6);//¡æ

	OLED_ShowHZ(4,5,8); //ʪ
	OLED_ShowHZ(4,7,10); //¶È
	OLED_ShowHZ(4,9,4); //:
	OLED_ShowChar(4,12,'%');//%
	
	while (1)
	{
		Delay_s(1);
		DHT20_REC_Data(); //½ÓÊÕdht20Êý¾Ý
	    OLED_ShowNum(2,10,rec_data[2],2);
		OLED_ShowNum(4,10,rec_data[0],2);
		if (LightSensor_Get() == 1)
		{
				LED2_ON();
		}
		else
		{
				LED2_OFF();
		}
	}

}

实验效果:
在这里插入图片描述

实验三
上下或左右的滑动显示长字符:
代码:

OLED_WR_Byte(0x2E,OLED_CMD); //关闭滚动
	OLED_WR_Byte(0x27,OLED_CMD); //水平向左或者右滚动 26/27
	OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节
	OLED_WR_Byte(0x00,OLED_CMD); //起始页 0
	OLED_WR_Byte(0x07,OLED_CMD); //滚动时间间隔
	OLED_WR_Byte(0x07,OLED_CMD); //终止页 2
	OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节
	OLED_WR_Byte(0xFF,OLED_CMD); //虚拟字节
	TEST_MainPage();
	OLED_WR_Byte(0x2F,OLED_CMD); //开启滚动

这段代码是用于控制OLED屏幕进行滚动显示的操作。
下面是对代码的解释:

OLED_WR_Byte(0x2E,OLED_CMD); //关闭滚动
这行代码发送命令给OLED屏幕,将滚动功能关闭。
OLED_WR_Byte(0x27,OLED_CMD); //水平向左或者右滚动 26/27
这行代码发送命令给OLED屏幕,选择水平滚动的方向,可以选择向左滚动或者向右滚动。具体选择通过参数0x27或者0x26来确定。
OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节
OLED_WR_Byte(0x00,OLED_CMD); //起始页 0
OLED_WR_Byte(0x07,OLED_CMD); //滚动时间间隔
OLED_WR_Byte(0x07,OLED_CMD); //终止页 2
OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节
OLED_WR_Byte(0xFF,OLED_CMD); //虚拟字节

这些代码依次发送命令给OLED屏幕,设置滚动的参数。包括设置起始页和终止页、滚动时间间隔等参数。其中0x00和0xFF是虚拟字节,可能是为了补齐命令的格式。
TEST_MainPage();
这行代码调用了TEST_MainPage函数,可能用于设置OLED屏幕要滚动显示的内容。
OLED_WR_Byte(0x2F,OLED_CMD); //开启滚动
这行代码发送命令给OLED屏幕,将滚动功能开启。
以上就是对给定代码的解释,它们用于控制OLED屏幕进行滚动显示的操作。具体的功能和效果可能需要参考OLED屏幕的文档或者相关代码来确定。
实验效果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是基于STC15F2K60S2单片机的串口传输温度和OLED显示温度的代码示例: ```c #include <STC15F2K60S2.h> #include <intrins.h> // 定义串口参数 #define BAUD 9600 #define FOSC 24000000L // 定义温度传感器引脚和OLED屏幕引脚 #define SENSOR_PIN P3_0 #define OLED_SCL P1_0 #define OLED_SDA P1_1 // 定义温度传感器数据转换参数 #define VCC 5.0 #define ADC_RES 1024.0 #define TEMP_RES 10.0 // 定义OLED显示屏参数 #define OLED_ADDR 0x78 #define OLED_WIDTH 128 #define OLED_HEIGHT 32 // 定义温度变量和串口接收缓存 float temperature = 0.0; unsigned char rec_buf; // 初始化串口 void init_uart() { TMOD |= 0x20; SCON = 0x50; TH1 = TL1 = -(FOSC/12/32/BAUD); TR1 = 1; ES = 1; EA = 1; } // 串口接收中断 void uart_isr() interrupt 4 { if (RI) { rec_buf = SBUF; RI = 0; } } // 初始化ADC void init_adc() { P1ASF = 0x01; // 将P1.0设置为ADC输入 ADC_RES = 0; // 清零ADC结果寄存器 ADC_CONTR = 0x88; // 启动ADC,选择ADC输入通道和ADC时钟分频 } // 读取温度传感器数据 float read_temperature() { unsigned int ad_value = 0; float voltage = 0.0; ADC_RES = 0; ADC_CONTR |= 0x08; // 开始ADC转换 _nop_(); // 等待ADC转换完成 _nop_(); _nop_(); _nop_(); ad_value = ADC_RES; voltage = ad_value * VCC / ADC_RES; temperature = voltage / TEMP_RES; return temperature; } // 初始化OLED显示屏 void init_oled() { i2c_start(); i2c_send_byte(OLED_ADDR); i2c_send_byte(0x00); i2c_send_byte(0xAE); // 关闭OLED屏幕 i2c_send_byte(0x20); i2c_send_byte(0x00); i2c_send_byte(0x21); i2c_send_byte(0x00); i2c_send_byte(0x7F); i2c_send_byte(0x22); i2c_send_byte(0x00); i2c_send_byte(0x03); i2c_send_byte(0xAF); // 打开OLED屏幕 i2c_stop(); } // 在OLED显示屏上显示温度数据 void show_temperature(float temp) { char temp_str[10] = {0}; sprintf(temp_str, "%.1fC", temp); i2c_start(); i2c_send_byte(OLED_ADDR); i2c_send_byte(0x00); i2c_send_byte(0x40); for (int i = 0; i < 4; i++) { for (int j = 0; j < 64; j++) { i2c_send_byte(0x00); } } i2c_stop(); i2c_start(); i2c_send_byte(OLED_ADDR); i2c_send_byte(0x00); i2c_send_byte(0x40); for (int i = 0; i < 4; i++) { for (int j = 0; j < 32; j++) { int idx = i * 32 + j; if (idx < strlen(temp_str)) { i2c_send_byte(font8x16[temp_str[idx] - ' '][2*j]); i2c_send_byte(font8x16[temp_str[idx] - ' '][2*j+1]); } else { i2c_send_byte(0x00); i2c_send_byte(0x00); } } } i2c_stop(); } void main() { init_uart(); init_adc(); init_oled(); while (1) { read_temperature(); show_temperature(temperature); SBUF = temperature; while (!TI); TI = 0; delay(1000); } } ``` 这段代码使用了STC15F2K60S2单片机内置的ADC模块来读取温度传感器数据,并通过串口将温度数据传输到PC机上。同时,使用了一个OLED屏幕来显示温度数据,使用了I2C通信协议来控制OLED屏幕。需要注意的是,您需要在程序中实现正确的数据格式转换和传输格式,以确保数据的准确性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值