基于STM32的厨房环境监测系统

发布时间:2024-11-29 04:03

科技驱动的环保监测系统实时监控环境污染 #生活知识# #科技生活# #科技改变生活# #科技环保#

前言        

        本篇文章将之前所有的文章进行整合,是之前几篇文章的综合版。

MQ-2烟雾传感器模块功能实现(STM32)

MQ-7一氧化碳传感器模块功能实现(STM32)

dht11温湿度模块功能实现(STM32)

0.96寸 4针OLED屏模块功能实现(STM32)

按键修改阈值功能、报警功能、空气质量功能实现(STM32)

ESP8266与手机App通信(STM32)

需求分析    

        需求概述

        根据实际需求,本系统主要功能三种:首先,32单片机的各个模块能够正常工作,能够正确地监测厨房内的空气质量、烟雾浓度、CO浓度、温度和湿度等参数,并将这些环境参数传送至OLED屏幕进行显示。其次,这个系统需要能够根据环境参数的变化触发报警机制,例如当空气质量等级较差时触发报警,当温度超过设定阈值时触发报警。最后,这个系统需要能够通过按键调整设定的高低温度,并可以通过手机APP设置环境参数阈值;也需要能够通过Wi-Fi将环境数据发送到手机APP上,并可以通过APP远程监控厨房内的环境变化,以及设置环境参数阈值。

        整体操作流程

        第一,采集环境参数数据,包括烟雾浓度、CO浓度、温度和湿度,然后根据这些参数评判空气质量;第二,将数据传输到OLED屏幕上进行显示,以及触发相应的报警机制;第三,通过按键调整设定的高低温度,并设置环境参数阈值;第四,将环境数据通过Wi-Fi发送到手机APP上进行远程监控,并可以通过APP设置环境参数阈值。整体操作流程示意图如图所示:

整体操作流程示意图

         功能需求

        环境参数采集:系统需要能够正确采集烟雾浓度、CO浓度、温度和湿度等参数数据,并对空气质量做出正确评判。

        数据显示:系统需要能够将监测到的环境数据通过OLED屏幕进行显示。

        报警机制:系统需要能够根据环境参数的变化触发报警机制,例如当空气质量等级较差时触发报警,当温度超过设定阈值时触发报警。

        按键调整设置:系统需要能够通过按键调整设置的高低温度,并可以通过手机APP设置环境参数阈值。

        远程监控:系统需要能够通过Wi-Fi将环境数据发送到手机APP上,并可以通过APP远程监控厨房内的环境变化,以及设置环境参数阈值。

        系统可靠性:系统需要保证在长时间运行的情况下能够稳定工作,并且具有一定的抗干扰能力。

        用户友好性:系统需要简单易用,并且提供清晰明了的操作界面,使得用户能够方便地操作和设置系统。

        非功能需求

        性能需求:系统需要具有足够的性能,以便能够在实时监测环境参数的同时,快速进行数据处理和显示。

        可靠性需求:系统需要保证高可靠性,以便在长时间运行的情况下不会出现故障。

        可维护性需求:系统需要能够方便地进行维护和修复,以便及时解决故障或升级系统。

        易用性需求:系统需要提供简单易用的操作界面,以便用户能够方便地设置和操作系统。

        可扩展性需求:系统需要具有一定的可扩展性,以便能够在未来根据需要增加新的监测参数或功能。

        耗电量需求:系统需要保证较低的耗电量,以便节省能源并延长系统的使用寿命。

        响应时间需求:系统需要保证在监测到异常情况时能够及时触发报警机制,以便及时采取相应的措施。

功能实现      

        烟雾传感器功能实现

        所选的烟雾传感器MQ-2型烟雾传感器属于二氧化锡半导体气敏材料,属于表面离子式N型半导体。当处于200~300摄氏度时,二氧化锡吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从而使其电阻值增加。当与烟雾接触时,如果晶粒间界处的势垒收到烟雾的调至而变化,就会引起表面导电率的变化。利用这一点就可以获得这种烟雾存在的信息,烟雾的浓度越大,导电率越大,输出电阻越低,则输出的模拟信号就越大。

        本课题使用MQ-2传感器监测CH4的浓度。32单片机可以通过ADC(模数转换器)读取MQ-2传感器输出的模拟电压信号。首先可以先获取ADC在一定时间内的平均值,其次,可以利用公式将ADC的平均值转化为MQ-2的输出电压值,接着根据这个电压信号和传感器特性曲线(即上图中的带黄色三角形的折线)计算出CH4的浓度。例如,定义Smog_Get_Vol()函数用于读取MQ-2传感器的电压值。它使用了STM32的ADC模块来获取模拟信号,并将其转换为数字值。接着,函数将模拟电压值转换为数字值,并将其除以4096.0,以获得0到3.3V范围内的电压值。最后,函数返回电压值,该值与CH4的浓度成正比。然后再定义Smog_GetPPM()函数用于计算MQ-2传感器检测到的CH4浓度。在这个函数里先通过调用Smog_Get_Vol()函数来获取MQ-2传感器的电压值。然后,计算MQ-2传感器的电阻值(RS),该值基于传感器的电压值和电路中的电阻值。在这里,电路中的电阻值(RL)和空气中的CH4浓度下MQ-2传感器的电阻值(R0)是预先确定的常量。最后,该函数计算CH4的浓度(ppm),并返回该值。

        MQ2.c

#include "mq2.h"

#define CAL_PPM 10

#define RL 10

#define R0 26

void MQ2_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

ADC_CommonInitTypeDef ADC_CommonInitStructure;

ADC_InitTypeDef ADC_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;

GPIO_Init(GPIOA, &GPIO_InitStructure);

ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;

ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;

ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;

ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;

ADC_CommonInit(&ADC_CommonInitStructure);

ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;

ADC_InitStructure.ADC_ScanConvMode = DISABLE;

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

ADC_InitStructure.ADC_NbrOfConversion = 1;

ADC_Init(ADC1, &ADC_InitStructure);

ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_3Cycles);

ADC_Cmd(ADC1, ENABLE);

}

uint32_t MQ2_ADC_Read(void)

{

ADC_SoftwareStartConv(ADC1);

while( ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);

return ADC_GetConversionValue(ADC1);

}

u16 ADC1_Average_Data(u8 ADC_Channel)

{

u16 temp_val=0;

u8 t;

for(t=0;t<SMOG_READ_TIMES;t++)

{

temp_val+=MQ2_ADC_Read();

delay_ms(5);

}

temp_val/=SMOG_READ_TIMES;

return (u16)temp_val;

}

float Smog_Get_Vol(void)

{

u16 adc_value = 0;

float voltage = 0;

adc_value = ADC1_Average_Data(ADC_Channel_4);

delay_ms(5);

voltage = (3.3/4096.0)*(adc_value);

return voltage;

}

float Smog_GetPPM()

{

float RS = (3.3f - Smog_Get_Vol()) / Smog_Get_Vol() * RL;

float ppm = 98.322f * pow(RS/R0, -1.458f);

return ppm;

}

        mq2.h

#ifndef _MQ2_H

#define _MQ2_H

#include <stm32f4xx.h>

#include "sys.h"

#include "delay.h"

#include "math.h"

#define SMOG_READ_TIMES10

void MQ2_Init(void);

float Smog_Get_Vol(void);

float Smog_GetPPM(void);

#endif

        CO传感器模块功能实现

        所选的CO传感器MQ-7也是一种基于半导体的烟雾传感器,由微型AL2O3陶瓷管、二氧化锡(SnO2)敏感层、测量电极和加热器组成,其工作原理与上述MQ-2传感器一致,是基于化学反应和电学信号转换。

        MQ-7烟雾传感器内部有一块小小的加热器,通过电流加热,使得传感器的工作环境温度升高,同时加速气体分子的运动。当空气中存在烟雾、煤气等有机化合物时,这些化合物会在加热器上发生化学反应,释放出一些气体,如二氧化碳、一氧化碳等。这些气体会进入传感器内部的敏感元件,与氧气发生化学反应,导致敏感元件的电阻发生变化,当空气中的CO浓度增加时,电阻减小,从而输出一个模拟信号。而32单片机通过模数转换器(ADC)读取传感器输出的模拟电压信号,并根据传感器特性曲线函数将电压值转换为一氧化碳浓度值。具体步骤为:首先获取ADC在一定时间内的平均值,其次,可以利用公式将ADC的平均值转化为MQ-7的输出电压值,接着根据这个电压信号和传感器特性曲线计算出CO的浓度。由于MQ-7的原理与上述的MQ-2类似,此处不做详细说明。

        MQ7.c

#include "mq7.h"

#define CAL_PPM 10

#define RL 10

#define R0 16

u16 MQ7_Buffer[4];

void CO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

GPIO_Init(GPIOA, &GPIO_InitStructure);

adc_Init();

}

u16 ADC2_Average_Data(u8 ADC_Channel)

{

u16 temp_val=0;

u8 t;

for(t=0;t<CO_READ_TIMES;t++)

{

temp_val+=ADC_Read();

delay_ms(5);

}

temp_val/=CO_READ_TIMES;

return (u16)temp_val;

}

float CO_Get_Vol()

{

u16 adc_value = 0;

float voltage = 0;

adc_value = ADC2_Average_Data(ADC_Channel_6);

delay_ms(5);

voltage = (3.3/4096.0)*(adc_value);

return voltage;

}

float MQ7_GetPPM()

{

float RS = (3.3f - CO_Get_Vol()) / CO_Get_Vol() * RL;

float ppm = 98.322f * pow(RS/R0, -1.458f);

return ppm;

}

        adc.c 

#include "adc.h"

void adc_Init()

{

GPIO_InitTypeDef GPIO_InitStructure;

ADC_CommonInitTypeDef ADC_CommonInitStructure;

ADC_InitTypeDef ADC_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;

GPIO_Init(GPIOA, &GPIO_InitStructure);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE);

ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;

ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;

ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;

ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;

ADC_CommonInit(&ADC_CommonInitStructure);

ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;

ADC_InitStructure.ADC_ScanConvMode = DISABLE;

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

ADC_InitStructure.ADC_NbrOfConversion = 1;

ADC_Init(ADC2, &ADC_InitStructure);

ADC_RegularChannelConfig(ADC2, ADC_Channel_6, 1, ADC_SampleTime_3Cycles);

ADC_Cmd(ADC2, ENABLE);

ADC_SoftwareStartConv(ADC2);

}

uint16_t ADC_Read(void)

{

ADC_SoftwareStartConv(ADC2);

while (ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC) == RESET);

return ADC_GetConversionValue(ADC2);

}

        mq7.h

#ifndef _MQ7_H

#define _MQ7_H

#include <stm32f4xx.h>

#include "sys.h"

#include "delay.h"

#include "math.h"

#include "adc.h"

#define SMOG_PIN46_R1000

#define CO_READ_TIMES10

void CO_Init(void);

u16 ADC2_Average_Data(u8 ADC_Channel);

float CO_Get_Vol(void);

float MQ7_GetPPM(void);

#endif

        adc.h

#ifndef _ADC_H

#define _ADC_H

#include <stm32f4xx.h>

#include "sys.h"

#include "delay.h"

void adc_Init(void);

uint16_t ADC_Read(void);

#endif

        温湿度模块功能实现 

        DTH11内部集成了温湿度传感器模块和数字式信号处理电路,它可以将温度和湿度值转换为数字信号输出。数字信号输出格式为二进制数,包括40位数据,其中包含8位的湿度整数数据、8位的湿度小数数据、8位的温度整数数据、8位的温度小数数据以及8位校验和。STM32通过读取DTH11输出的数字信号,就可以得到温度和湿度的精确值,进而对环境进行控制。

        STM32单片机通过引脚与dth11传感器进行连接,包括VCC、GND、DATA三个引脚。单片机向dth11传感器发送开始信号,即拉低DATA引脚,持续至少18ms,然后再将DATA引脚拉高,等待dth11传感器的响应。此时dth11传感器会发送一个80us的低电平响应信号,然后再发送一个80us的高电平信号,表示已经准备好发送数据。接着,dth11传感器开始向单片机发送40位二进制数据,包括湿度值、温度值、校验位等信息。每一位数据都有固定的发送方式,即:首先,dth11传感器会将DATA引脚拉低50us,表示开始发送一位数据;其次,dth11传感器会根据实际数值将DATA引脚拉高26~28us表示0,或者拉高70us表示1;最后,单片机需要在每一位数据发送完毕后,将DATA引脚拉高,等待下一位数据的发送。当单片机接收到40位数据后,需要对数据进行解析,获取温度和湿度数值,以及校验位信息。

        在实际操作时,可以定义一个dht11_read_data()函数用于从DHT11传感器读取温度和湿度数据,该函数首先通过调用dht11_start()函数启动DHT11传感器,并等待其应答。如果DHT11传感器在100次内没有应答,则函数返回-1表示启动失败。接着,该函数通过调用dht11_readbyte()函数读取5个字节的数据,其中前两个字节是湿度数据,接下来两个字节是温度数据,最后一个字节是校验和。最后,该函数计算校验和,如果校验和不匹配,则函数返回-2表示数据读取失败。如果一切正常,则函数返回0,读取到的湿度和温度数据存储在输入的缓冲区(buf)中。

        DHT11.c

#include "DHT11.h"

void dht11_outputmode(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);

GPIO_InitStructure.GPIO_Pin= GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode= GPIO_Mode_OUT;

GPIO_InitStructure.GPIO_OType= GPIO_OType_PP;

GPIO_InitStructure.GPIO_Speed= GPIO_Speed_100MHz;

GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_NOPULL;

GPIO_Init(GPIOG, &GPIO_InitStructure);

}

void dht11_inputmode(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);

GPIO_InitStructure.GPIO_Pin= GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IN;

GPIO_InitStructure.GPIO_OType= GPIO_OType_PP;

GPIO_InitStructure.GPIO_Speed= GPIO_Speed_100MHz;

GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_NOPULL;

GPIO_Init(GPIOG, &GPIO_InitStructure);

}

uint32_t dht11_start(void)

{

uint32_t i;

dht11_outputmode();

PGout(9) = 0;

delay_ms(20);

PGout(9) = 1;

delay_us(30);

dht11_inputmode();

i=0;

while(i<100)

{

if(PGin(9) == 0)

break;

i++;

delay_us(1);

}

if(i>=100)

return 1;

i=0;

while(i<100)

{

if(PGin(9))

break;

i++;

delay_us(1);

}

if(i>=100)

return 2;

return 0;

}

uint8_t dht11_readbyte(void)

{

int i;

uint8_t d=0;

while(PGin(9));

for(i=0; i<8; i++)

{

while(PGin(9)==0);

delay_us(40);

if(PGin(9))

{

d |= 1<<(7-i);

while(PGin(9));

}

}

return d;

}

int dht11_read_data(uint8_t *buf)

{

int i=0;

while(i<100)

{

if(dht11_start() == 0)

break;

i++;

delay_us(1);

}

if(i>=100)

return -1;

for(i=0; i<5; i++)

{

buf[i] = dht11_readbyte();

}

if(buf[4] != buf[0]+buf[1]+buf[2]+buf[3])

return -2;

return 0;

}

        DHT11.h

#ifndef _DHT11_H

#define _DHT11_H

#include <stm32f4xx.h>

#include "sys.h"

#include "delay.h"

int dht11_read_data(uint8_t *buf);

#endif

        OLED模块功能实现

        在32单片机中使用0.96寸4针OLED屏模块时,需要将单片机的输出信号转化为OLED屏幕可识别的信号。因此,需要使用相应的OLED控制器,通过I2C总线进行通信,将单片机的输出信号转化为OLED屏幕可识别的信号。代码中应定义OLED屏模块的驱动函数,OLED屏模块的驱动程序主要包括以下几个部分:写入函数(用于向OLED发送命令或数据)、清屏函数(用于清除OLED上的所有内容)、显示函数(用于将缓冲区中的内容写入到OLED上)、点亮或熄灭像素点的函数、显示字符或字符串的函数等。最后初始化OLED屏模块,具体步骤为:首先开启GPIOB的时钟;然后设置GPIOB的8、9引脚为输出模式,推挽输出,100MHz速率,上拉;延时200ms,等待OLED屏幕启动;发送OLED的初始化命令序列;最后清空OLED屏幕。由于环境参数是变动的,所以可以考虑将环境参数变量和环境阈值转化为字符串形式再由OLED屏输出。

        oled.c

#include "oled.h"

#include "stdlib.h"

#include "oledfont.h"

u8 OLED_GRAM[144][8];

void delay(u32 t)

{

while(t--);

}

void OLED_ColorTurn(u8 i)

{

if(i==0)

{

OLED_WR_Byte(0xA6,OLED_CMD);

}

if(i==1)

{

OLED_WR_Byte(0xA7,OLED_CMD);

}

}

void OLED_DisplayTurn(u8 i)

{

if(i==0)

{

OLED_WR_Byte(0xC8,OLED_CMD);

OLED_WR_Byte(0xA1,OLED_CMD);

}

if(i==1)

{

OLED_WR_Byte(0xC0,OLED_CMD);

OLED_WR_Byte(0xA0,OLED_CMD);

}

}

void I2C_Start(void)

{

OLED_SDIN_Set();delay(1);

OLED_SCLK_Set();delay(1);

OLED_SDIN_Clr();delay(1);

OLED_SCLK_Clr();delay(1);

}

void I2C_Stop(void)

{

OLED_SCLK_Set();delay(1);

OLED_SDIN_Clr();delay(1);

OLED_SDIN_Set();delay(1);

}

void I2C_WaitAck(void)

{

OLED_SCLK_Set();delay(1);

OLED_SCLK_Clr();delay(1);

}

void Send_Byte(u8 dat)

{

u8 i;

for(i=0;i<8;i++)

{

OLED_SCLK_Clr();

delay(1);

if(dat&0x80)

{

OLED_SDIN_Set();delay(1);

}

else

{

OLED_SDIN_Clr();delay(1);

}

OLED_SCLK_Set();

delay(1);

OLED_SCLK_Clr();

delay(1);

dat<<=1;

}

}

void OLED_WR_Byte(u8 dat,u8 mode)

{

I2C_Start();

Send_Byte(0x78);

I2C_WaitAck();

if(mode){Send_Byte(0x40);}

else{Send_Byte(0x00);}

I2C_WaitAck();

Send_Byte(dat);

I2C_WaitAck();

I2C_Stop();

}

void OLED_DisPlay_On(void)

{

OLED_WR_Byte(0x8D,OLED_CMD);

OLED_WR_Byte(0x14,OLED_CMD);

OLED_WR_Byte(0xAF,OLED_CMD);

}

void OLED_DisPlay_Off(void)

{

OLED_WR_Byte(0x8D,OLED_CMD);

OLED_WR_Byte(0x10,OLED_CMD);

OLED_WR_Byte(0xAF,OLED_CMD);

}

void OLED_Refresh(void)

{

u8 i,n;

for(i=0;i<8;i++)

{

OLED_WR_Byte(0xb0+i,OLED_CMD);

OLED_WR_Byte(0x00,OLED_CMD);

OLED_WR_Byte(0x10,OLED_CMD);

for(n=0;n<128;n++)

OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA);

}

}

void OLED_Clear(void)

{

u8 i,n;

for(i=0;i<8;i++)

{

for(n=0;n<128;n++)

{

OLED_GRAM[n][i]=0;

}

}

OLED_Refresh();

}

void OLED_DrawPoint(u8 x,u8 y)

{

u8 i,m,n;

i=y/8;

m=y%8;

n=1<<m;

OLED_GRAM[x][i]|=n;

}

void OLED_ClearPoint(u8 x,u8 y)

{

u8 i,m,n;

i=y/8;

m=y%8;

n=1<<m;

OLED_GRAM[x][i]=~OLED_GRAM[x][i];

OLED_GRAM[x][i]|=n;

OLED_GRAM[x][i]=~OLED_GRAM[x][i];

}

void OLED_DrawLine(u8 x1,u8 y1,u8 x2,u8 y2)

{

u8 i,k,k1,k2,y0;

if((x1<0)||(x2>128)||(y1<0)||(y2>64)||(x1>x2)||(y1>y2))return;

if(x1==x2)

{

for(i=0;i<(y2-y1);i++)

{

OLED_DrawPoint(x1,y1+i);

}

}

else if(y1==y2)

{

for(i=0;i<(x2-x1);i++)

{

OLED_DrawPoint(x1+i,y1);

}

}

else

{

k1=y2-y1;

k2=x2-x1;

k=k1*10/k2;

for(i=0;i<(x2-x1);i++)

{

OLED_DrawPoint(x1+i,y1+i*k/10);

}

}

}

void OLED_DrawCircle(u8 x,u8 y,u8 r)

{

int a, b,num;

a = 0;

b = r;

while(2 * b * b >= r * r)

{

OLED_DrawPoint(x + a, y - b);

OLED_DrawPoint(x - a, y - b);

OLED_DrawPoint(x - a, y + b);

OLED_DrawPoint(x + a, y + b);

OLED_DrawPoint(x + b, y + a);

OLED_DrawPoint(x + b, y - a);

OLED_DrawPoint(x - b, y - a);

OLED_DrawPoint(x - b, y + a);

a++;

num = (a * a + b * b) - r*r;

if(num > 0)

{

b--;

a--;

}

}

}

void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1)

{

u8 i,m,temp,size2,chr1;

u8 y0=y;

size2=(size1/8+((size1%8)?1:0))*(size1/2);

chr1=chr-' ';

for(i=0;i<size2;i++)

{

if(size1==12)

{temp=asc2_1206[chr1][i];}

else if(size1==16)

{temp=asc2_1608[chr1][i];}

else if(size1==24)

{temp=asc2_2412[chr1][i];}

else return;

for(m=0;m<8;m++)

{

if(temp&0x80)OLED_DrawPoint(x,y);

else OLED_ClearPoint(x,y);

temp<<=1;

y++;

if((y-y0)==size1)

{

y=y0;

x++;

break;

}

}

}

}

void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1)

{

while((*chr>=' ')&&(*chr<='~'))

{

OLED_ShowChar(x,y,*chr,size1);

x+=size1/2;

if(x>128-size1)

{

x=0;

y+=2;

}

chr++;

}

}

u32 OLED_Pow(u8 m,u8 n)

{

u32 result=1;

while(n--)

{

result*=m;

}

return result;

}

显示2个数字

x,y :起点坐标

len :数字的位数

size:字体大小

void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size1)

{

u8 t,temp;

for(t=0;t<len;t++)

{

temp=(num/OLED_Pow(10,len-t-1))%10;

if(temp==0)

{

OLED_ShowChar(x+(size1/2)*t,y,'0',size1);

}

else

{

OLED_ShowChar(x+(size1/2)*t,y,temp+'0',size1);

}

}

}

void OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1)

{

u8 i,m,n=0,temp,chr1;

u8 x0=x,y0=y;

u8 size3=size1/8;

while(size3--)

{

chr1=num*size1/8+n;

n++;

for(i=0;i<size1;i++)

{

if(size1==16)

{temp=Hzk1[chr1][i];}

else if(size1==24)

{temp=Hzk2[chr1][i];}

else if(size1==32)

{temp=Hzk3[chr1][i];}

else if(size1==64)

{temp=Hzk4[chr1][i];}

else return;

for(m=0;m<8;m++)

{

if(temp&0x01)OLED_DrawPoint(x,y);

else OLED_ClearPoint(x,y);

temp>>=1;

y++;

}

x++;

if((x-x0)==size1)

{x=x0;y0=y0+8;}

y=y0;

}

}

}

void OLED_ShowChinese2(u8 x,u8 y,u8 num,u8 size1)

{

u8 i,m,n=0,temp,chr1;

u8 x0=x,y0=y;

u8 size3=size1/8;

while(size3--)

{

chr1=num*size1/8+n;

n++;

for(i=0;i<size1;i++)

{

if(size1==16)

{temp=Hzk5[chr1][i];}

else if(size1==24)

{temp=Hzk2[chr1][i];}

else if(size1==32)

{temp=Hzk3[chr1][i];}

else if(size1==64)

{temp=Hzk4[chr1][i];}

else return;

for(m=0;m<8;m++)

{

if(temp&0x01)OLED_DrawPoint(x,y);

else OLED_ClearPoint(x,y);

temp>>=1;

y++;

}

x++;

if((x-x0)==size1)

{x=x0;y0=y0+8;}

y=y0;

}

}

}

void OLED_ShowChinese3(u8 x,u8 y,u8 num,u8 size1)

{

u8 i,m,n=0,temp,chr1;

u8 x0=x,y0=y;

u8 size3=size1/8;

while(size3--)

{

chr1=num*size1/8+n;

n++;

for(i=0;i<size1;i++)

{

if(size1==16)

{temp=Hzk6[chr1][i];}

else return;

for(m=0;m<8;m++)

{

if(temp&0x01)OLED_DrawPoint(x,y);

else OLED_ClearPoint(x,y);

temp>>=1;

y++;

}

x++;

if((x-x0)==size1)

{x=x0;y0=y0+8;}

y=y0;

}

}

}

void OLED_ScrollDisplay(u8 num,u8 space)

{

u8 i,n,t=0,m=0,r;

int c=161;

while(c)

{

if(m==0)

{

OLED_ShowChinese(128,0,t,16);

OLED_ShowChinese(128,16,t,16);

OLED_ShowChinese(128,32,t,16);

OLED_ShowChinese(128,48,t,16);

t++;

}

if(t==num)

{

for(r=0;r<16*space;r++)

{

for(i=0;i<144;i++)

{

for(n=0;n<8;n++)

{

OLED_GRAM[i-1][n]=OLED_GRAM[i][n];

}

}

OLED_Refresh();

}

t=0;

}

m++;

if(m==16){m=0;}

for(i=0;i<144;i++)

{

for(n=0;n<8;n++)

{

OLED_GRAM[i-1][n]=OLED_GRAM[i][n];

}

}

OLED_Refresh();

c--;

if (c==0) break;

}

}

void OLED_WR_BP(u8 x,u8 y)

{

OLED_WR_Byte(0xb0+y,OLED_CMD);

OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);

OLED_WR_Byte((x&0x0f),OLED_CMD);

}

void OLED_ShowPicture(u8 x0,u8 y0,u8 x1,u8 y1,u8 BMP[])

{

u32 j=0;

u8 x=0,y=0;

if(y%8==0)y=0;

else y+=1;

for(y=y0;y<y1;y++)

{

OLED_WR_BP(x0,y);

for(x=x0;x<x1;x++)

{

OLED_WR_Byte(BMP[j],OLED_DATA);

j++;

}

}

}

void OLED_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

GPIO_Init(GPIOB, &GPIO_InitStructure);

delay_ms(200);

OLED_WR_Byte(0xAE,OLED_CMD);

OLED_WR_Byte(0x00,OLED_CMD);

OLED_WR_Byte(0x10,OLED_CMD);

OLED_WR_Byte(0x40,OLED_CMD);

OLED_WR_Byte(0x81,OLED_CMD);

OLED_WR_Byte(0xCF,OLED_CMD);

OLED_WR_Byte(0xA1,OLED_CMD);

OLED_WR_Byte(0xC8,OLED_CMD);

OLED_WR_Byte(0xA6,OLED_CMD);

OLED_WR_Byte(0xA8,OLED_CMD);

OLED_WR_Byte(0x3f,OLED_CMD);

OLED_WR_Byte(0xD3,OLED_CMD);

OLED_WR_Byte(0x00,OLED_CMD);

OLED_WR_Byte(0xd5,OLED_CMD);

OLED_WR_Byte(0x80,OLED_CMD);

OLED_WR_Byte(0xD9,OLED_CMD);

OLED_WR_Byte(0xF1,OLED_CMD);

OLED_WR_Byte(0xDA,OLED_CMD);

OLED_WR_Byte(0x12,OLED_CMD);

OLED_WR_Byte(0xDB,OLED_CMD);

OLED_WR_Byte(0x40,OLED_CMD);

OLED_WR_Byte(0x20,OLED_CMD);

OLED_WR_Byte(0x02,OLED_CMD);

OLED_WR_Byte(0x8D,OLED_CMD);

OLED_WR_Byte(0x14,OLED_CMD);

OLED_WR_Byte(0xA4,OLED_CMD);

OLED_WR_Byte(0xA6,OLED_CMD);

OLED_WR_Byte(0xAF,OLED_CMD);

OLED_Clear();

}

        oled.h

#ifndef __OLED_H

#define __OLED_H

#include "sys.h"

#include "stdlib.h"

#include "delay.h"

#define OLED_SCLK_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_8)

#define OLED_SCLK_Set() GPIO_SetBits(GPIOB,GPIO_Pin_8)

#define OLED_SDIN_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_9)

#define OLED_SDIN_Set() GPIO_SetBits(GPIOB,GPIO_Pin_9)

#define OLED_CMD 0

#define OLED_DATA 1

#define u8 unsigned char

#define u32 unsigned int

void OLED_ClearPoint(u8 x,u8 y);

void OLED_ColorTurn(u8 i);

void OLED_DisplayTurn(u8 i);

void I2C_Start(void);

void I2C_Stop(void);

void I2C_WaitAck(void);

void Send_Byte(u8 dat);

void OLED_WR_Byte(u8 dat,u8 cmd);

void OLED_DisPlay_On(void);

void OLED_DisPlay_Off(void);

void OLED_Refresh(void);

void OLED_Clear(void);

void OLED_DrawPoint(u8 x,u8 y);

void OLED_DrawLine(u8 x1,u8 y1,u8 x2,u8 y2);

void OLED_DrawCircle(u8 x,u8 y,u8 r);

void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1);

void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1);

void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size1);

void OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1);

void OLED_ShowChinese2(u8 x,u8 y,u8 num,u8 size1);

void OLED_ShowChinese3(u8 x,u8 y,u8 num,u8 size1);

void OLED_ScrollDisplay(u8 num,u8 space);

void OLED_WR_BP(u8 x,u8 y);

void OLED_ShowPicture(u8 x0,u8 y0,u8 x1,u8 y1,u8 BMP[]);

void OLED_Init(void);

#endif

        oledfont.h

#ifndef __OLEDFONT_H

#define __OLEDFONT_H

const unsigned char asc2_1206[95][12]={

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x3F,0x40,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x40,0x00,0x00,0x00},

{0x09,0x00,0x0B,0xC0,0x3D,0x00,0x0B,0xC0,0x3D,0x00,0x09,0x00},

{0x18,0xC0,0x24,0x40,0x7F,0xE0,0x22,0x40,0x31,0x80,0x00,0x00},

{0x18,0x00,0x24,0xC0,0x1B,0x00,0x0D,0x80,0x32,0x40,0x01,0x80},

{0x03,0x80,0x1C,0x40,0x27,0x40,0x1C,0x80,0x07,0x40,0x00,0x40},

{0x10,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x20,0x40,0x40,0x20},

{0x00,0x00,0x40,0x20,0x20,0x40,0x1F,0x80,0x00,0x00,0x00,0x00},

{0x09,0x00,0x06,0x00,0x1F,0x80,0x06,0x00,0x09,0x00,0x00,0x00},

{0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0x00,0x00},

{0x00,0x10,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00},

{0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x20,0x01,0xC0,0x06,0x00,0x38,0x00,0x40,0x00,0x00,0x00},

{0x1F,0x80,0x20,0x40,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00},

{0x00,0x00,0x10,0x40,0x3F,0xC0,0x00,0x40,0x00,0x00,0x00,0x00},

{0x18,0xC0,0x21,0x40,0x22,0x40,0x24,0x40,0x18,0x40,0x00,0x00},

{0x10,0x80,0x20,0x40,0x24,0x40,0x24,0x40,0x1B,0x80,0x00,0x00},

{0x02,0x00,0x0D,0x00,0x11,0x00,0x3F,0xC0,0x01,0x40,0x00,0x00},

{0x3C,0x80,0x24,0x40,0x24,0x40,0x24,0x40,0x23,0x80,0x00,0x00},

{0x1F,0x80,0x24,0x40,0x24,0x40,0x34,0x40,0x03,0x80,0x00,0x00},

{0x30,0x00,0x20,0x00,0x27,0xC0,0x38,0x00,0x20,0x00,0x00,0x00},

{0x1B,0x80,0x24,0x40,0x24,0x40,0x24,0x40,0x1B,0x80,0x00,0x00},

{0x1C,0x00,0x22,0xC0,0x22,0x40,0x22,0x40,0x1F,0x80,0x00,0x00},

{0x00,0x00,0x00,0x00,0x08,0x40,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x04,0x60,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0x40,0x40},

{0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x00,0x00},

{0x00,0x00,0x40,0x40,0x20,0x80,0x11,0x00,0x0A,0x00,0x04,0x00},

{0x18,0x00,0x20,0x00,0x23,0x40,0x24,0x00,0x18,0x00,0x00,0x00},

{0x1F,0x80,0x20,0x40,0x27,0x40,0x29,0x40,0x1F,0x40,0x00,0x00},

{0x00,0x40,0x07,0xC0,0x39,0x00,0x0F,0x00,0x01,0xC0,0x00,0x40},

{0x20,0x40,0x3F,0xC0,0x24,0x40,0x24,0x40,0x1B,0x80,0x00,0x00},

{0x1F,0x80,0x20,0x40,0x20,0x40,0x20,0x40,0x30,0x80,0x00,0x00},

{0x20,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00},

{0x20,0x40,0x3F,0xC0,0x24,0x40,0x2E,0x40,0x30,0xC0,0x00,0x00},

{0x20,0x40,0x3F,0xC0,0x24,0x40,0x2E,0x00,0x30,0x00,0x00,0x00},

{0x0F,0x00,0x10,0x80,0x20,0x40,0x22,0x40,0x33,0x80,0x02,0x00},

{0x20,0x40,0x3F,0xC0,0x04,0x00,0x04,0x00,0x3F,0xC0,0x20,0x40},

{0x20,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x00,0x00},

{0x00,0x60,0x20,0x20,0x20,0x20,0x3F,0xC0,0x20,0x00,0x20,0x00},

{0x20,0x40,0x3F,0xC0,0x24,0x40,0x0B,0x00,0x30,0xC0,0x20,0x40},

{0x20,0x40,0x3F,0xC0,0x20,0x40,0x00,0x40,0x00,0x40,0x00,0xC0},

{0x3F,0xC0,0x3C,0x00,0x03,0xC0,0x3C,0x00,0x3F,0xC0,0x00,0x00},

{0x20,0x40,0x3F,0xC0,0x0C,0x40,0x23,0x00,0x3F,0xC0,0x20,0x00},

{0x1F,0x80,0x20,0x40,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00},

{0x20,0x40,0x3F,0xC0,0x24,0x40,0x24,0x00,0x18,0x00,0x00,0x00},

{0x1F,0x80,0x21,0x40,0x21,0x40,0x20,0xE0,0x1F,0xA0,0x00,0x00},

{0x20,0x40,0x3F,0xC0,0x24,0x40,0x26,0x00,0x19,0xC0,0x00,0x40},

{0x18,0xC0,0x24,0x40,0x24,0x40,0x22,0x40,0x31,0x80,0x00,0x00},

{0x30,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x30,0x00,0x00,0x00},

{0x20,0x00,0x3F,0x80,0x00,0x40,0x00,0x40,0x3F,0x80,0x20,0x00},

{0x20,0x00,0x3E,0x00,0x01,0xC0,0x07,0x00,0x38,0x00,0x20,0x00},

{0x38,0x00,0x07,0xC0,0x3C,0x00,0x07,0xC0,0x38,0x00,0x00,0x00},

{0x20,0x40,0x39,0xC0,0x06,0x00,0x39,0xC0,0x20,0x40,0x00,0x00},

{0x20,0x00,0x38,0x40,0x07,0xC0,0x38,0x40,0x20,0x00,0x00,0x00},

{0x30,0x40,0x21,0xC0,0x26,0x40,0x38,0x40,0x20,0xC0,0x00,0x00},

{0x00,0x00,0x00,0x00,0x7F,0xE0,0x40,0x20,0x40,0x20,0x00,0x00},

{0x00,0x00,0x70,0x00,0x0C,0x00,0x03,0x80,0x00,0x40,0x00,0x00},

{0x00,0x00,0x40,0x20,0x40,0x20,0x7F,0xE0,0x00,0x00,0x00,0x00},

{0x00,0x00,0x20,0x00,0x40,0x00,0x20,0x00,0x00,0x00,0x00,0x00},

{0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10},

{0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x02,0x80,0x05,0x40,0x05,0x40,0x03,0xC0,0x00,0x40},

{0x20,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x03,0x80,0x00,0x00},

{0x00,0x00,0x03,0x80,0x04,0x40,0x04,0x40,0x06,0x40,0x00,0x00},

{0x00,0x00,0x03,0x80,0x04,0x40,0x24,0x40,0x3F,0xC0,0x00,0x40},

{0x00,0x00,0x03,0x80,0x05,0x40,0x05,0x40,0x03,0x40,0x00,0x00},

{0x00,0x00,0x04,0x40,0x1F,0xC0,0x24,0x40,0x24,0x40,0x20,0x00},

{0x00,0x00,0x02,0xE0,0x05,0x50,0x05,0x50,0x06,0x50,0x04,0x20},

{0x20,0x40,0x3F,0xC0,0x04,0x40,0x04,0x00,0x03,0xC0,0x00,0x40},

{0x00,0x00,0x04,0x40,0x27,0xC0,0x00,0x40,0x00,0x00,0x00,0x00},

{0x00,0x10,0x00,0x10,0x04,0x10,0x27,0xE0,0x00,0x00,0x00,0x00},

{0x20,0x40,0x3F,0xC0,0x01,0x40,0x07,0x00,0x04,0xC0,0x04,0x40},

{0x20,0x40,0x20,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00},

{0x07,0xC0,0x04,0x00,0x07,0xC0,0x04,0x00,0x03,0xC0,0x00,0x00},

{0x04,0x40,0x07,0xC0,0x04,0x40,0x04,0x00,0x03,0xC0,0x00,0x40},

{0x00,0x00,0x03,0x80,0x04,0x40,0x04,0x40,0x03,0x80,0x00,0x00},

{0x04,0x10,0x07,0xF0,0x04,0x50,0x04,0x40,0x03,0x80,0x00,0x00},

{0x00,0x00,0x03,0x80,0x04,0x40,0x04,0x50,0x07,0xF0,0x00,0x10},

{0x04,0x40,0x07,0xC0,0x02,0x40,0x04,0x00,0x04,0x00,0x00,0x00},

{0x00,0x00,0x06,0x40,0x05,0x40,0x05,0x40,0x04,0xC0,0x00,0x00},

{0x00,0x00,0x04,0x00,0x1F,0x80,0x04,0x40,0x00,0x40,0x00,0x00},

{0x04,0x00,0x07,0x80,0x00,0x40,0x04,0x40,0x07,0xC0,0x00,0x40},

{0x04,0x00,0x07,0x00,0x04,0xC0,0x01,0x80,0x06,0x00,0x04,0x00},

{0x06,0x00,0x01,0xC0,0x07,0x00,0x01,0xC0,0x06,0x00,0x00,0x00},

{0x04,0x40,0x06,0xC0,0x01,0x00,0x06,0xC0,0x04,0x40,0x00,0x00},

{0x04,0x10,0x07,0x10,0x04,0xE0,0x01,0x80,0x06,0x00,0x04,0x00},

{0x00,0x00,0x04,0x40,0x05,0xC0,0x06,0x40,0x04,0x40,0x00,0x00},

{0x00,0x00,0x00,0x00,0x04,0x00,0x7B,0xE0,0x40,0x20,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,0x00,0x00},

{0x00,0x00,0x40,0x20,0x7B,0xE0,0x04,0x00,0x00,0x00,0x00,0x00},

{0x40,0x00,0x80,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0x40,0x00},

};

const unsigned char asc2_1608[95][16]={

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xCC,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x08,0x00,0x30,0x00,0x60,0x00,0x08,0x00,0x30,0x00,0x60,0x00,0x00,0x00},

{0x02,0x20,0x03,0xFC,0x1E,0x20,0x02,0x20,0x03,0xFC,0x1E,0x20,0x02,0x20,0x00,0x00},

{0x00,0x00,0x0E,0x18,0x11,0x04,0x3F,0xFF,0x10,0x84,0x0C,0x78,0x00,0x00,0x00,0x00},

{0x0F,0x00,0x10,0x84,0x0F,0x38,0x00,0xC0,0x07,0x78,0x18,0x84,0x00,0x78,0x00,0x00},

{0x00,0x78,0x0F,0x84,0x10,0xC4,0x11,0x24,0x0E,0x98,0x00,0xE4,0x00,0x84,0x00,0x08},

{0x08,0x00,0x68,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x18,0x18,0x20,0x04,0x40,0x02,0x00,0x00},

{0x00,0x00,0x40,0x02,0x20,0x04,0x18,0x18,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00},

{0x02,0x40,0x02,0x40,0x01,0x80,0x0F,0xF0,0x01,0x80,0x02,0x40,0x02,0x40,0x00,0x00},

{0x00,0x80,0x00,0x80,0x00,0x80,0x0F,0xF8,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00},

{0x00,0x01,0x00,0x0D,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80},

{0x00,0x00,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x06,0x00,0x18,0x00,0x60,0x01,0x80,0x06,0x00,0x18,0x00,0x20,0x00},

{0x00,0x00,0x07,0xF0,0x08,0x08,0x10,0x04,0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00},

{0x00,0x00,0x08,0x04,0x08,0x04,0x1F,0xFC,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00},

{0x00,0x00,0x0E,0x0C,0x10,0x14,0x10,0x24,0x10,0x44,0x11,0x84,0x0E,0x0C,0x00,0x00},

{0x00,0x00,0x0C,0x18,0x10,0x04,0x11,0x04,0x11,0x04,0x12,0x88,0x0C,0x70,0x00,0x00},

{0x00,0x00,0x00,0xE0,0x03,0x20,0x04,0x24,0x08,0x24,0x1F,0xFC,0x00,0x24,0x00,0x00},

{0x00,0x00,0x1F,0x98,0x10,0x84,0x11,0x04,0x11,0x04,0x10,0x88,0x10,0x70,0x00,0x00},

{0x00,0x00,0x07,0xF0,0x08,0x88,0x11,0x04,0x11,0x04,0x18,0x88,0x00,0x70,0x00,0x00},

{0x00,0x00,0x1C,0x00,0x10,0x00,0x10,0xFC,0x13,0x00,0x1C,0x00,0x10,0x00,0x00,0x00},

{0x00,0x00,0x0E,0x38,0x11,0x44,0x10,0x84,0x10,0x84,0x11,0x44,0x0E,0x38,0x00,0x00},

{0x00,0x00,0x07,0x00,0x08,0x8C,0x10,0x44,0x10,0x44,0x08,0x88,0x07,0xF0,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x03,0x0C,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x80,0x01,0x40,0x02,0x20,0x04,0x10,0x08,0x08,0x10,0x04,0x00,0x00},

{0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00},

{0x00,0x00,0x10,0x04,0x08,0x08,0x04,0x10,0x02,0x20,0x01,0x40,0x00,0x80,0x00,0x00},

{0x00,0x00,0x0E,0x00,0x12,0x00,0x10,0x0C,0x10,0x6C,0x10,0x80,0x0F,0x00,0x00,0x00},

{0x03,0xE0,0x0C,0x18,0x13,0xE4,0x14,0x24,0x17,0xC4,0x08,0x28,0x07,0xD0,0x00,0x00},

{0x00,0x04,0x00,0x3C,0x03,0xC4,0x1C,0x40,0x07,0x40,0x00,0xE4,0x00,0x1C,0x00,0x04},

{0x10,0x04,0x1F,0xFC,0x11,0x04,0x11,0x04,0x11,0x04,0x0E,0x88,0x00,0x70,0x00,0x00},

{0x03,0xE0,0x0C,0x18,0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x08,0x1C,0x10,0x00,0x00},

{0x10,0x04,0x1F,0xFC,0x10,0x04,0x10,0x04,0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00},

{0x10,0x04,0x1F,0xFC,0x11,0x04,0x11,0x04,0x17,0xC4,0x10,0x04,0x08,0x18,0x00,0x00},

{0x10,0x04,0x1F,0xFC,0x11,0x04,0x11,0x00,0x17,0xC0,0x10,0x00,0x08,0x00,0x00,0x00},

{0x03,0xE0,0x0C,0x18,0x10,0x04,0x10,0x04,0x10,0x44,0x1C,0x78,0x00,0x40,0x00,0x00},

{0x10,0x04,0x1F,0xFC,0x10,0x84,0x00,0x80,0x00,0x80,0x10,0x84,0x1F,0xFC,0x10,0x04},

{0x00,0x00,0x10,0x04,0x10,0x04,0x1F,0xFC,0x10,0x04,0x10,0x04,0x00,0x00,0x00,0x00},

{0x00,0x03,0x00,0x01,0x10,0x01,0x10,0x01,0x1F,0xFE,0x10,0x00,0x10,0x00,0x00,0x00},

{0x10,0x04,0x1F,0xFC,0x11,0x04,0x03,0x80,0x14,0x64,0x18,0x1C,0x10,0x04,0x00,0x00},

{0x10,0x04,0x1F,0xFC,0x10,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0C,0x00,0x00},

{0x10,0x04,0x1F,0xFC,0x1F,0x00,0x00,0xFC,0x1F,0x00,0x1F,0xFC,0x10,0x04,0x00,0x00},

{0x10,0x04,0x1F,0xFC,0x0C,0x04,0x03,0x00,0x00,0xE0,0x10,0x18,0x1F,0xFC,0x10,0x00},

{0x07,0xF0,0x08,0x08,0x10,0x04,0x10,0x04,0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00},

{0x10,0x04,0x1F,0xFC,0x10,0x84,0x10,0x80,0x10,0x80,0x10,0x80,0x0F,0x00,0x00,0x00},

{0x07,0xF0,0x08,0x18,0x10,0x24,0x10,0x24,0x10,0x1C,0x08,0x0A,0x07,0xF2,0x00,0x00},

{0x10,0x04,0x1F,0xFC,0x11,0x04,0x11,0x00,0x11,0xC0,0x11,0x30,0x0E,0x0C,0x00,0x04},

{0x00,0x00,0x0E,0x1C,0x11,0x04,0x10,0x84,0x10,0x84,0x10,0x44,0x1C,0x38,0x00,0x00},

{0x18,0x00,0x10,0x00,0x10,0x04,0x1F,0xFC,0x10,0x04,0x10,0x00,0x18,0x00,0x00,0x00},

{0x10,0x00,0x1F,0xF8,0x10,0x04,0x00,0x04,0x00,0x04,0x10,0x04,0x1F,0xF8,0x10,0x00},

{0x10,0x00,0x1E,0x00,0x11,0xE0,0x00,0x1C,0x00,0x70,0x13,0x80,0x1C,0x00,0x10,0x00},

{0x1F,0xC0,0x10,0x3C,0x00,0xE0,0x1F,0x00,0x00,0xE0,0x10,0x3C,0x1F,0xC0,0x00,0x00},

{0x10,0x04,0x18,0x0C,0x16,0x34,0x01,0xC0,0x01,0xC0,0x16,0x34,0x18,0x0C,0x10,0x04},

{0x10,0x00,0x1C,0x00,0x13,0x04,0x00,0xFC,0x13,0x04,0x1C,0x00,0x10,0x00,0x00,0x00},

{0x08,0x04,0x10,0x1C,0x10,0x64,0x10,0x84,0x13,0x04,0x1C,0x04,0x10,0x18,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFE,0x40,0x02,0x40,0x02,0x40,0x02,0x00,0x00},

{0x00,0x00,0x30,0x00,0x0C,0x00,0x03,0x80,0x00,0x60,0x00,0x1C,0x00,0x03,0x00,0x00},

{0x00,0x00,0x40,0x02,0x40,0x02,0x40,0x02,0x7F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x00,0x00},

{0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01},

{0x00,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x98,0x01,0x24,0x01,0x44,0x01,0x44,0x01,0x44,0x00,0xFC,0x00,0x04},

{0x10,0x00,0x1F,0xFC,0x00,0x88,0x01,0x04,0x01,0x04,0x00,0x88,0x00,0x70,0x00,0x00},

{0x00,0x00,0x00,0x70,0x00,0x88,0x01,0x04,0x01,0x04,0x01,0x04,0x00,0x88,0x00,0x00},

{0x00,0x00,0x00,0x70,0x00,0x88,0x01,0x04,0x01,0x04,0x11,0x08,0x1F,0xFC,0x00,0x04},

{0x00,0x00,0x00,0xF8,0x01,0x44,0x01,0x44,0x01,0x44,0x01,0x44,0x00,0xC8,0x00,0x00},

{0x00,0x00,0x01,0x04,0x01,0x04,0x0F,0xFC,0x11,0x04,0x11,0x04,0x11,0x00,0x18,0x00},

{0x00,0x00,0x00,0xD6,0x01,0x29,0x01,0x29,0x01,0x29,0x01,0xC9,0x01,0x06,0x00,0x00},

{0x10,0x04,0x1F,0xFC,0x00,0x84,0x01,0x00,0x01,0x00,0x01,0x04,0x00,0xFC,0x00,0x04},

{0x00,0x00,0x01,0x04,0x19,0x04,0x19,0xFC,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x03,0x00,0x01,0x01,0x01,0x19,0x01,0x19,0xFE,0x00,0x00,0x00,0x00},

{0x10,0x04,0x1F,0xFC,0x00,0x24,0x00,0x40,0x01,0xB4,0x01,0x0C,0x01,0x04,0x00,0x00},

{0x00,0x00,0x10,0x04,0x10,0x04,0x1F,0xFC,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00},

{0x01,0x04,0x01,0xFC,0x01,0x04,0x01,0x00,0x01,0xFC,0x01,0x04,0x01,0x00,0x00,0xFC},

{0x01,0x04,0x01,0xFC,0x00,0x84,0x01,0x00,0x01,0x00,0x01,0x04,0x00,0xFC,0x00,0x04},

{0x00,0x00,0x00,0xF8,0x01,0x04,0x01,0x04,0x01,0x04,0x01,0x04,0x00,0xF8,0x00,0x00},

{0x01,0x01,0x01,0xFF,0x00,0x85,0x01,0x04,0x01,0x04,0x00,0x88,0x00,0x70,0x00,0x00},

{0x00,0x00,0x00,0x70,0x00,0x88,0x01,0x04,0x01,0x04,0x01,0x05,0x01,0xFF,0x00,0x01},

{0x01,0x04,0x01,0x04,0x01,0xFC,0x00,0x84,0x01,0x04,0x01,0x00,0x01,0x80,0x00,0x00},

{0x00,0x00,0x00,0xCC,0x01,0x24,0x01,0x24,0x01,0x24,0x01,0x24,0x01,0x98,0x00,0x00},

{0x00,0x00,0x01,0x00,0x01,0x00,0x07,0xF8,0x01,0x04,0x01,0x04,0x00,0x00,0x00,0x00},

{0x01,0x00,0x01,0xF8,0x00,0x04,0x00,0x04,0x00,0x04,0x01,0x08,0x01,0xFC,0x00,0x04},

{0x01,0x00,0x01,0x80,0x01,0x70,0x00,0x0C,0x00,0x10,0x01,0x60,0x01,0x80,0x01,0x00},

{0x01,0xF0,0x01,0x0C,0x00,0x30,0x01,0xC0,0x00,0x30,0x01,0x0C,0x01,0xF0,0x01,0x00},

{0x00,0x00,0x01,0x04,0x01,0x8C,0x00,0x74,0x01,0x70,0x01,0x8C,0x01,0x04,0x00,0x00},

{0x01,0x01,0x01,0x81,0x01,0x71,0x00,0x0E,0x00,0x18,0x01,0x60,0x01,0x80,0x01,0x00},

{0x00,0x00,0x01,0x84,0x01,0x0C,0x01,0x34,0x01,0x44,0x01,0x84,0x01,0x0C,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x3E,0xFC,0x40,0x02,0x40,0x02},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x40,0x02,0x40,0x02,0x3E,0xFC,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x60,0x00,0x80,0x00,0x80,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x20,0x00},

};

const unsigned char asc2_2412[95][36]={

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x38,0x0F,0xFE,0x38,0x0F,0x80,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x06,0x00,0x00,0x0C,0x00,0x00,0x38,0x00,0x00,0x31,0x00,0x00,0x06,0x00,0x00,0x0C,0x00,0x00,0x38,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x61,0x80,0x00,0x67,0xF8,0x07,0xF9,0x80,0x00,0x61,0x80,0x00,0x61,0x80,0x00,0x61,0x80,0x00,0x61,0x80,0x00,0x67,0xF8,0x07,0xF9,0x80,0x00,0x61,0x80,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xC0,0xE0,0x03,0xE0,0xF0,0x06,0x30,0x08,0x04,0x18,0x08,0x1F,0xFF,0xFE,0x04,0x0E,0x08,0x07,0x87,0xF0,0x03,0x81,0xE0,0x00,0x00,0x00,0x00,0x00,0x00},

{0x01,0xF0,0x00,0x06,0x0C,0x00,0x04,0x04,0x08,0x06,0x0C,0x70,0x01,0xF9,0xC0,0x00,0x0E,0x00,0x00,0x3B,0xE0,0x00,0xEC,0x18,0x07,0x08,0x08,0x04,0x0C,0x18,0x00,0x03,0xE0,0x00,0x00,0x00},

{0x00,0x01,0xE0,0x00,0x07,0xF0,0x03,0xF8,0x18,0x04,0x1C,0x08,0x04,0x17,0x08,0x07,0xE1,0xD0,0x03,0xC0,0xE0,0x00,0x23,0xB0,0x00,0x3C,0x08,0x00,0x20,0x08,0x00,0x00,0x10,0x00,0x00,0x00},

{0x00,0x00,0x00,0x01,0x00,0x00,0x31,0x00,0x00,0x32,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x01,0xFF,0xC0,0x07,0x80,0xF0,0x0C,0x00,0x18,0x10,0x00,0x04,0x20,0x00,0x02,0x00,0x00,0x00},

{0x00,0x00,0x00,0x20,0x00,0x02,0x10,0x00,0x04,0x0C,0x00,0x18,0x07,0x80,0xF0,0x01,0xFF,0xC0,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x66,0x00,0x00,0x66,0x00,0x00,0x3C,0x00,0x00,0x18,0x00,0x03,0xFF,0xC0,0x00,0x18,0x00,0x00,0x3C,0x00,0x00,0x66,0x00,0x00,0x66,0x00,0x00,0x42,0x00},

{0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x01,0xFF,0xC0,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00},

{0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x31,0x00,0x00,0x32,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x1C,0x00,0x00,0x70,0x00,0x01,0x80,0x00,0x0E,0x00,0x00,0x38,0x00,0x00,0xC0,0x00,0x07,0x00,0x00,0x1C,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x7F,0x80,0x01,0xFF,0xE0,0x03,0x80,0x70,0x06,0x00,0x18,0x04,0x00,0x08,0x04,0x00,0x08,0x06,0x00,0x18,0x03,0x80,0x70,0x01,0xFF,0xE0,0x00,0x7F,0x80,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x08,0x01,0x00,0x08,0x01,0x00,0x08,0x03,0xFF,0xF8,0x07,0xFF,0xF8,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x01,0xC0,0x38,0x02,0xC0,0x58,0x04,0x00,0x98,0x04,0x01,0x18,0x04,0x02,0x18,0x04,0x04,0x18,0x06,0x1C,0x18,0x03,0xF8,0x18,0x01,0xE0,0xF8,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x01,0xC0,0xE0,0x03,0xC0,0xF0,0x04,0x00,0x08,0x04,0x08,0x08,0x04,0x08,0x08,0x06,0x18,0x08,0x03,0xF4,0x18,0x01,0xE7,0xF0,0x00,0x01,0xE0,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x0D,0x00,0x00,0x11,0x00,0x00,0x61,0x00,0x00,0x81,0x08,0x03,0x01,0x08,0x07,0xFF,0xF8,0x0F,0xFF,0xF8,0x00,0x01,0x08,0x00,0x01,0x08,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0xFC,0xD0,0x06,0x08,0x08,0x06,0x10,0x08,0x06,0x10,0x08,0x06,0x10,0x08,0x06,0x18,0x38,0x06,0x0F,0xF0,0x06,0x07,0xC0,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x3F,0x80,0x01,0xFF,0xE0,0x03,0x84,0x30,0x02,0x08,0x18,0x04,0x10,0x08,0x04,0x10,0x08,0x04,0x10,0x08,0x07,0x18,0x10,0x03,0x0F,0xF0,0x00,0x07,0xC0,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x07,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0xF8,0x06,0x07,0xF8,0x06,0x18,0x00,0x06,0xE0,0x00,0x07,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x01,0xE1,0xE0,0x03,0xF7,0xF0,0x06,0x34,0x10,0x04,0x18,0x08,0x04,0x18,0x08,0x04,0x0C,0x08,0x04,0x0C,0x08,0x06,0x16,0x18,0x03,0xF3,0xF0,0x01,0xC1,0xE0,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0xF8,0x00,0x03,0xFC,0x30,0x03,0x06,0x38,0x04,0x02,0x08,0x04,0x02,0x08,0x04,0x02,0x08,0x04,0x04,0x10,0x03,0x08,0xF0,0x01,0xFF,0xC0,0x00,0x7F,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x38,0x00,0x70,0x38,0x00,0x70,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x1A,0x00,0x30,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x14,0x00,0x00,0x22,0x00,0x00,0x41,0x00,0x00,0x80,0x80,0x01,0x00,0x40,0x02,0x00,0x20,0x04,0x00,0x10,0x08,0x00,0x08,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x21,0x00,0x00,0x21,0x00,0x00,0x21,0x00,0x00,0x21,0x00,0x00,0x21,0x00,0x00,0x21,0x00,0x00,0x21,0x00,0x00,0x21,0x00,0x00,0x21,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x04,0x00,0x10,0x02,0x00,0x20,0x01,0x00,0x40,0x00,0x80,0x80,0x00,0x41,0x00,0x00,0x22,0x00,0x00,0x14,0x00,0x00,0x08,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x03,0xC0,0x00,0x04,0xC0,0x00,0x04,0x00,0x00,0x08,0x00,0x38,0x08,0x0F,0x38,0x08,0x08,0x38,0x08,0x10,0x00,0x0C,0x30,0x00,0x07,0xE0,0x00,0x03,0xC0,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x3F,0x80,0x00,0xFF,0xE0,0x03,0x80,0x70,0x02,0x0F,0x10,0x06,0x70,0x88,0x04,0xC0,0x88,0x04,0x83,0x08,0x04,0x7F,0x88,0x02,0xC0,0x90,0x03,0x01,0x20,0x00,0xFE,0x40},

{0x00,0x00,0x08,0x00,0x00,0x18,0x00,0x01,0xF8,0x00,0x3E,0x08,0x01,0xC2,0x00,0x07,0x02,0x00,0x07,0xE2,0x00,0x00,0xFE,0x00,0x00,0x1F,0xC8,0x00,0x01,0xF8,0x00,0x00,0x38,0x00,0x00,0x08},

{0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x08,0x08,0x04,0x08,0x08,0x04,0x08,0x08,0x04,0x08,0x08,0x06,0x18,0x08,0x03,0xF4,0x18,0x01,0xE7,0xF0,0x00,0x01,0xE0,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x3F,0x80,0x01,0xFF,0xE0,0x03,0x80,0x70,0x02,0x00,0x18,0x04,0x00,0x08,0x04,0x00,0x08,0x04,0x00,0x08,0x04,0x00,0x10,0x06,0x00,0x20,0x07,0x80,0xC0,0x00,0x00,0x00},

{0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x00,0x08,0x04,0x00,0x08,0x04,0x00,0x08,0x04,0x00,0x18,0x02,0x00,0x10,0x03,0x80,0x70,0x01,0xFF,0xE0,0x00,0x7F,0x80,0x00,0x00,0x00},

{0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x08,0x08,0x04,0x08,0x08,0x04,0x08,0x08,0x04,0x08,0x08,0x04,0x3E,0x08,0x04,0x00,0x08,0x06,0x00,0x18,0x01,0x00,0x60,0x00,0x00,0x00},

{0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x08,0x08,0x04,0x08,0x00,0x04,0x08,0x00,0x04,0x08,0x00,0x04,0x3E,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x3F,0x80,0x01,0xFF,0xE0,0x03,0x80,0x70,0x06,0x00,0x18,0x04,0x00,0x08,0x04,0x02,0x08,0x04,0x02,0x08,0x02,0x03,0xF0,0x07,0x83,0xF0,0x00,0x02,0x00,0x00,0x02,0x00},

{0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x08,0x08,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x04,0x08,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x00,0x08},

{0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x04,0x00,0x08,0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x00,0x08,0x04,0x00,0x08,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x07,0x00,0x00,0x01,0x04,0x00,0x01,0x04,0x00,0x01,0x04,0x00,0x03,0x07,0xFF,0xFE,0x07,0xFF,0xFC,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00},

{0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x0C,0x08,0x00,0x18,0x00,0x00,0x3E,0x00,0x04,0xC7,0x80,0x05,0x03,0xC8,0x06,0x00,0xF8,0x04,0x00,0x38,0x04,0x00,0x18,0x00,0x00,0x08},

{0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x18,0x00,0x00,0x60,0x00,0x00,0x00},

{0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0x80,0x08,0x07,0xFC,0x00,0x00,0x7F,0xC0,0x00,0x03,0xF8,0x00,0x07,0xC0,0x00,0x78,0x00,0x07,0x80,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x00,0x08},

{0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0x00,0x08,0x03,0xC0,0x00,0x00,0xE0,0x00,0x00,0x38,0x00,0x00,0x1E,0x00,0x00,0x07,0x00,0x00,0x01,0xC0,0x04,0x00,0xF0,0x07,0xFF,0xF8,0x04,0x00,0x00},

{0x00,0x00,0x00,0x00,0x7F,0x80,0x01,0xFF,0xE0,0x03,0x80,0x70,0x06,0x00,0x18,0x04,0x00,0x08,0x04,0x00,0x08,0x06,0x00,0x18,0x03,0x00,0x30,0x01,0xFF,0xE0,0x00,0x7F,0x80,0x00,0x00,0x00},

{0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x04,0x08,0x04,0x04,0x00,0x04,0x04,0x00,0x04,0x04,0x00,0x04,0x04,0x00,0x06,0x0C,0x00,0x03,0xF8,0x00,0x01,0xF0,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x7F,0x80,0x01,0xFF,0xE0,0x03,0x80,0x70,0x06,0x00,0x88,0x04,0x00,0x88,0x04,0x00,0xC8,0x06,0x00,0x3C,0x03,0x00,0x3E,0x01,0xFF,0xE6,0x00,0x7F,0x84,0x00,0x00,0x00},

{0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x08,0x08,0x04,0x08,0x00,0x04,0x0C,0x00,0x04,0x0F,0x00,0x04,0x0B,0xC0,0x06,0x10,0xF0,0x03,0xF0,0x38,0x01,0xE0,0x08,0x00,0x00,0x08},

{0x00,0x00,0x00,0x01,0xE0,0xF8,0x03,0xF0,0x30,0x06,0x30,0x10,0x04,0x18,0x08,0x04,0x18,0x08,0x04,0x0C,0x08,0x04,0x0C,0x08,0x02,0x06,0x18,0x02,0x07,0xF0,0x07,0x81,0xE0,0x00,0x00,0x00},

{0x01,0x80,0x00,0x06,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x00,0x08,0x04,0x00,0x00,0x04,0x00,0x00,0x06,0x00,0x00,0x01,0x80,0x00},

{0x04,0x00,0x00,0x07,0xFF,0xE0,0x07,0xFF,0xF0,0x04,0x00,0x18,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x04,0x00,0x10,0x07,0xFF,0xE0,0x04,0x00,0x00},

{0x04,0x00,0x00,0x06,0x00,0x00,0x07,0xE0,0x00,0x07,0xFE,0x00,0x04,0x1F,0xE0,0x00,0x01,0xF8,0x00,0x00,0x38,0x00,0x01,0xE0,0x04,0x3E,0x00,0x07,0xC0,0x00,0x06,0x00,0x00,0x04,0x00,0x00},

{0x04,0x00,0x00,0x07,0xE0,0x00,0x07,0xFF,0xC0,0x04,0x1F,0xF8,0x00,0x07,0xC0,0x07,0xF8,0x00,0x07,0xFF,0x80,0x04,0x3F,0xF8,0x00,0x07,0xC0,0x04,0xF8,0x00,0x07,0x00,0x00,0x04,0x00,0x00},

{0x00,0x00,0x00,0x04,0x00,0x08,0x06,0x00,0x18,0x07,0xC0,0x78,0x05,0xF1,0xC8,0x00,0x3E,0x00,0x00,0x1F,0x80,0x04,0x63,0xE8,0x07,0x80,0xF8,0x06,0x00,0x18,0x04,0x00,0x08,0x00,0x00,0x00},

{0x04,0x00,0x00,0x06,0x00,0x00,0x07,0x80,0x00,0x07,0xE0,0x08,0x04,0x7C,0x08,0x00,0x1F,0xF8,0x00,0x07,0xF8,0x00,0x18,0x08,0x04,0xE0,0x08,0x07,0x00,0x00,0x06,0x00,0x00,0x04,0x00,0x00},

{0x00,0x00,0x00,0x01,0x00,0x08,0x06,0x00,0x38,0x04,0x00,0xF8,0x04,0x03,0xE8,0x04,0x0F,0x08,0x04,0x7C,0x08,0x05,0xF0,0x08,0x07,0xC0,0x08,0x07,0x00,0x18,0x04,0x00,0x60,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFE,0x20,0x00,0x02,0x20,0x00,0x02,0x20,0x00,0x02,0x20,0x00,0x02,0x20,0x00,0x02,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x07,0x00,0x00,0x00,0xC0,0x00,0x00,0x38,0x00,0x00,0x06,0x00,0x00,0x01,0xC0,0x00,0x00,0x30,0x00,0x00,0x0E,0x00,0x00,0x01,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x02,0x20,0x00,0x02,0x20,0x00,0x02,0x20,0x00,0x02,0x20,0x00,0x02,0x3F,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x10,0x00,0x00,0x30,0x00,0x00,0x20,0x00,0x00,0x30,0x00,0x00,0x10,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x19,0xF8,0x00,0x1B,0x18,0x00,0x22,0x08,0x00,0x26,0x08,0x00,0x24,0x08,0x00,0x24,0x10,0x00,0x3F,0xF8,0x00,0x1F,0xF8,0x00,0x00,0x08,0x00,0x00,0x18},

{0x00,0x00,0x00,0x04,0x00,0x00,0x07,0xFF,0xF8,0x0F,0xFF,0xF0,0x00,0x18,0x18,0x00,0x10,0x08,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x30,0x18,0x00,0x1F,0xF0,0x00,0x0F,0xC0,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x07,0xC0,0x00,0x1F,0xF0,0x00,0x18,0x30,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x3C,0x08,0x00,0x1C,0x10,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x07,0xC0,0x00,0x1F,0xF0,0x00,0x38,0x18,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x20,0x08,0x04,0x10,0x10,0x07,0xFF,0xF8,0x0F,0xFF,0xF0,0x00,0x00,0x10,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,0x00,0x1F,0xF0,0x00,0x12,0x30,0x00,0x22,0x18,0x00,0x22,0x08,0x00,0x22,0x08,0x00,0x32,0x08,0x00,0x1E,0x10,0x00,0x0E,0x20,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x08,0x00,0x20,0x08,0x01,0xFF,0xF8,0x03,0xFF,0xF8,0x06,0x20,0x08,0x04,0x20,0x08,0x04,0x20,0x08,0x07,0x20,0x00,0x03,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x0E,0x6E,0x00,0x1F,0xF3,0x00,0x31,0xB1,0x00,0x20,0xB1,0x00,0x20,0xB1,0x00,0x31,0x91,0x00,0x1F,0x13,0x00,0x2E,0x1E,0x00,0x20,0x0E,0x00,0x30,0x00},

{0x00,0x00,0x00,0x04,0x00,0x08,0x07,0xFF,0xF8,0x0F,0xFF,0xF8,0x00,0x10,0x08,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x20,0x08,0x00,0x3F,0xF8,0x00,0x1F,0xF8,0x00,0x00,0x08,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x20,0x08,0x06,0x3F,0xF8,0x06,0x3F,0xF8,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x03,0x00,0x20,0x01,0x00,0x20,0x01,0x00,0x20,0x03,0x06,0x3F,0xFE,0x06,0x3F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x04,0x00,0x08,0x07,0xFF,0xF8,0x0F,0xFF,0xF8,0x00,0x01,0x88,0x00,0x03,0x00,0x00,0x2F,0xC0,0x00,0x38,0xF8,0x00,0x20,0x38,0x00,0x20,0x08,0x00,0x00,0x08,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x04,0x00,0x08,0x04,0x00,0x08,0x07,0xFF,0xF8,0x0F,0xFF,0xF8,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x20,0x08,0x00,0x3F,0xF8,0x00,0x3F,0xF8,0x00,0x10,0x08,0x00,0x20,0x00,0x00,0x3F,0xF8,0x00,0x3F,0xF8,0x00,0x10,0x08,0x00,0x20,0x00,0x00,0x3F,0xF8,0x00,0x3F,0xF8,0x00,0x00,0x08},

{0x00,0x00,0x00,0x00,0x20,0x08,0x00,0x3F,0xF8,0x00,0x3F,0xF8,0x00,0x10,0x08,0x00,0x10,0x00,0x00,0x20,0x00,0x00,0x20,0x08,0x00,0x3F,0xF8,0x00,0x1F,0xF8,0x00,0x00,0x08,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x07,0xC0,0x00,0x0F,0xF0,0x00,0x18,0x30,0x00,0x30,0x08,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x30,0x08,0x00,0x18,0x30,0x00,0x0F,0xF0,0x00,0x07,0xC0,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x3F,0xFF,0x00,0x3F,0xFF,0x00,0x10,0x11,0x00,0x20,0x09,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x30,0x38,0x00,0x1F,0xF0,0x00,0x0F,0xC0,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x07,0xC0,0x00,0x1F,0xF0,0x00,0x38,0x18,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x20,0x09,0x00,0x10,0x11,0x00,0x1F,0xFF,0x00,0x3F,0xFF,0x00,0x00,0x01,0x00,0x00,0x00},

{0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x3F,0xF8,0x00,0x3F,0xF8,0x00,0x08,0x08,0x00,0x10,0x08,0x00,0x20,0x08,0x00,0x20,0x00,0x00,0x30,0x00,0x00,0x30,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x78,0x00,0x1E,0x18,0x00,0x33,0x08,0x00,0x23,0x08,0x00,0x21,0x08,0x00,0x21,0x88,0x00,0x21,0x98,0x00,0x30,0xF0,0x00,0x38,0x60,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0xFF,0xF0,0x03,0xFF,0xF8,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x3F,0xF0,0x00,0x7F,0xF8,0x00,0x00,0x18,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x20,0x10,0x00,0x3F,0xF8,0x00,0x7F,0xF0,0x00,0x00,0x10,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x30,0x00,0x00,0x3C,0x00,0x00,0x3F,0x80,0x00,0x23,0xF0,0x00,0x00,0x78,0x00,0x00,0x70,0x00,0x23,0x80,0x00,0x3C,0x00,0x00,0x30,0x00,0x00,0x20,0x00},

{0x00,0x20,0x00,0x00,0x3C,0x00,0x00,0x3F,0xE0,0x00,0x23,0xF8,0x00,0x00,0xE0,0x00,0x27,0x00,0x00,0x3E,0x00,0x00,0x3F,0xE0,0x00,0x21,0xF8,0x00,0x01,0xE0,0x00,0x3E,0x00,0x00,0x20,0x00},

{0x00,0x00,0x00,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x38,0x38,0x00,0x3E,0x68,0x00,0x27,0x80,0x00,0x03,0xC8,0x00,0x2C,0xF8,0x00,0x38,0x38,0x00,0x20,0x18,0x00,0x20,0x08,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x30,0x03,0x00,0x3C,0x01,0x00,0x3F,0x83,0x00,0x23,0xEC,0x00,0x00,0x70,0x00,0x23,0x80,0x00,0x3C,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x08,0x00,0x20,0x38,0x00,0x20,0xF8,0x00,0x23,0xE8,0x00,0x2F,0x88,0x00,0x3E,0x08,0x00,0x38,0x08,0x00,0x20,0x18,0x00,0x00,0x70,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x14,0x00,0x1F,0xF7,0xFC,0x30,0x00,0x06,0x20,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x02,0x30,0x00,0x06,0x1F,0xF7,0xFC,0x00,0x14,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x18,0x00,0x00,0x60,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0x00,0x10,0x00,0x00,0x08,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x0C,0x00,0x00,0x10,0x00,0x00},

};

unsigned char Hzk1[22][16]={

{0x00,0x00,0xF0,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00},

{0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x0F,0x00,0x00,0x00},

{0x40,0x40,0x40,0x5F,0x55,0x55,0x55,0x75,0x55,0x55,0x55,0x5F,0x40,0x40,0x40,0x00},

{0x00,0x40,0x20,0x0F,0x09,0x49,0x89,0x79,0x09,0x09,0x09,0x0F,0x20,0x40,0x00,0x00},

{0x00,0xFE,0x02,0x42,0x4A,0xCA,0x4A,0x4A,0xCA,0x4A,0x4A,0x42,0x02,0xFE,0x00,0x00},

{0x00,0xFF,0x40,0x50,0x4C,0x43,0x40,0x40,0x4F,0x50,0x50,0x5C,0x40,0xFF,0x00,0x00},

{0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00},

{0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F,0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x00},

{0x80,0x82,0x82,0x82,0x82,0x82,0x82,0xE2,0xA2,0x92,0x8A,0x86,0x82,0x80,0x80,0x00},

{0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x24,0x24,0xA4,0xFE,0xA3,0x22,0x00,0x22,0xCC,0x00,0x00,0xFF,0x00,0x00,0x00,0x00},

{0x08,0x06,0x01,0xFF,0x00,0x01,0x04,0x04,0x04,0x04,0x04,0xFF,0x02,0x02,0x02,0x00},

{0x10,0x10,0x10,0xFF,0x10,0x90,0x08,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x08,0x00},

{0x04,0x44,0x82,0x7F,0x01,0x80,0x80,0x40,0x43,0x2C,0x10,0x28,0x46,0x81,0x80,0x00},

{0x04,0x04,0x04,0x84,0xE4,0x3C,0x27,0x24,0x24,0x24,0x24,0xE4,0x04,0x04,0x04,0x00},

{0x04,0x02,0x01,0x00,0xFF,0x09,0x09,0x09,0x09,0x49,0x89,0x7F,0x00,0x00,0x00,0x00},

{0x00,0xFE,0x22,0x5A,0x86,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00},

{0x00,0xFF,0x04,0x08,0x07,0x00,0xFF,0x40,0x20,0x03,0x0C,0x14,0x22,0x41,0x40,0x00},

{0x00,0x80,0x40,0x20,0x18,0x06,0x80,0x00,0x07,0x18,0x20,0x40,0x80,0x00,0x00,0x00},

{0x01,0x00,0x20,0x70,0x28,0x26,0x21,0x20,0x20,0x24,0x38,0x60,0x00,0x01,0x01,0x00},

{0x00,0x10,0x12,0x92,0x92,0x92,0x92,0x92,0x92,0x12,0x12,0x02,0xFE,0x00,0x00,0x00},

{0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x3F,0x00,0x40,0x80,0x7F,0x00,0x00,0x00},

};

unsigned char Hzk2[3][72]={

{0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFC,0x84,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0xC0,0x00,0x00,0x00},

{0x00,0x00,0x00,0xFF,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x7F,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

};

unsigned char Hzk3[4][128]={

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0xFF,0xFE,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0xFF,0xFF,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0xFF,0x03,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x1F,0x1F,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0xFF,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x1F,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

};

unsigned char Hzk4[8][512]={

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0xF0,0xF0,0x70,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFE,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0xFF,0xFF,0xFF,0xFF,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0xFF,0xFF,0xFF,0xFF,0x07,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0xFF,0xFF,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x0F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

};

unsigned char Hzk5[16][32]={

{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},

{0x10,0x60,0x02,0x8C,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00},

{0x04,0x04,0x7E,0x01,0x44,0x48,0x50,0x7F,0x40,0x40,0x7F,0x50,0x48,0x44,0x40,0x00},

{0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00},

{0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00},

{0x80,0x70,0x00,0xFF,0x10,0x08,0xFE,0x42,0x42,0x42,0xFA,0x42,0x42,0x42,0xFE,0x00},

{0x80,0x60,0x18,0x07,0x08,0x10,0xFF,0x50,0x48,0x46,0x41,0x42,0x4C,0x40,0xFF,0x00},

{0x10,0x0C,0x05,0x55,0x55,0xD5,0x05,0x7F,0x05,0x55,0x55,0x55,0x05,0x14,0x0C,0x00},

{0x10,0x10,0x10,0x8A,0xA9,0x6B,0x35,0x25,0x25,0xAB,0xE9,0x08,0x10,0x10,0x10,0x00},

{0x10,0x60,0x02,0x8C,0x20,0x18,0x08,0xC8,0x38,0xCF,0x08,0x08,0x28,0x98,0x00,0x00},

{0x04,0x04,0x7E,0x01,0x04,0x02,0x01,0xFF,0x40,0x21,0x06,0x0A,0x11,0x20,0x40,0x00},

{0x00,0xF8,0x01,0x22,0xA0,0xA2,0xA2,0x22,0xFE,0x22,0xAA,0x32,0x02,0xFE,0x00,0x00},

{0x00,0xFF,0x00,0x10,0x13,0x0A,0x4B,0x20,0x17,0x0C,0x13,0x38,0x80,0xFF,0x00,0x00},

{0x00,0x80,0x60,0xF8,0x07,0x04,0xE4,0xA4,0xA4,0xBF,0xA4,0xA4,0xE4,0x04,0x00,0x00},

{0x01,0x00,0x00,0xFF,0x40,0x40,0x7F,0x4A,0x4A,0x4A,0x4A,0x4A,0x7F,0x40,0x40,0x00},

};

unsigned char Hzk6[26][32]={

{0x04,0x84,0x84,0xFC,0x84,0x84,0x00,0xFE,0x02,0x02,0xF2,0x02,0x02,0xFE,0x00,0x00},

{0x20,0x60,0x20,0x1F,0x10,0x90,0x40,0x23,0x18,0x06,0x01,0x7E,0x80,0x83,0xE0,0x00},

{0x08,0x08,0x88,0xC8,0x38,0x0C,0x0B,0x08,0x08,0xE8,0x08,0x08,0x08,0x08,0x08,0x00},

{0x02,0x01,0x00,0xFF,0x40,0x41,0x41,0x41,0x41,0x7F,0x41,0x41,0x41,0x41,0x40,0x00},

{0x00,0x02,0x02,0xF2,0x12,0x12,0x12,0xF2,0x02,0x02,0x02,0xFE,0x02,0x02,0x02,0x00},

{0x00,0x00,0x00,0x0F,0x04,0x04,0x04,0x0F,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00},

{0x00,0x00,0xFC,0x00,0x00,0x02,0x04,0x18,0x00,0x00,0x80,0x7F,0x00,0x00,0x00,0x00},

{0x00,0x00,0x3F,0x10,0x08,0x84,0x40,0x20,0x10,0x0C,0x03,0x08,0x10,0x20,0xC0,0x00},

{0x40,0x42,0xCC,0x00,0x00,0xFE,0x82,0x92,0x92,0xFE,0x92,0x92,0x82,0xFE,0x00,0x00},

{0x00,0x00,0x3F,0x10,0x88,0x7F,0x00,0x1E,0x12,0x12,0x12,0x5E,0x80,0x7F,0x00,0x00},

{0x04,0x74,0xD4,0x54,0xFF,0x54,0xD4,0x74,0x14,0x08,0x77,0x84,0x44,0x3C,0x04,0x00},

{0x82,0x89,0x88,0xE8,0x8B,0x88,0x88,0xF9,0xA8,0xAA,0xA9,0xA8,0xA9,0x8A,0x82,0x00},

{0x10,0x0C,0x44,0x24,0x14,0x04,0x05,0x06,0x04,0x04,0x14,0x24,0x44,0x14,0x0C,0x00},

{0x00,0x40,0x40,0x41,0x41,0x41,0x41,0x7F,0x41,0x41,0x41,0x41,0x40,0x40,0x00,0x00},

{0x20,0x10,0x4C,0x47,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0xD4,0x04,0x04,0x00,0x00},

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x30,0x40,0xF0,0x00},

{0x00,0x00,0xFE,0x12,0x12,0x92,0x92,0x92,0x92,0xFF,0x91,0x91,0x91,0x91,0x10,0x00},

{0x80,0x60,0x1F,0x80,0x80,0x5F,0x40,0x20,0x10,0x0E,0x10,0x10,0x20,0x5F,0x80,0x00},

{0x20,0x20,0x20,0xBE,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBE,0x20,0x20,0x20,0x00},

{0x00,0x80,0x80,0xAF,0xAA,0xAA,0xAA,0xFF,0xAA,0xAA,0xAA,0xAF,0x80,0x80,0x00,0x00},

{0x00,0x80,0x60,0xF8,0x07,0x10,0x10,0x10,0xFF,0x10,0xF0,0x11,0x16,0x10,0x10,0x00},

{0x01,0x00,0x00,0xFF,0x00,0x80,0x60,0x1C,0x03,0x00,0x3F,0x40,0x40,0x40,0x78,0x00},

{0x00,0x00,0xFC,0x24,0x24,0x24,0x25,0x26,0x24,0x24,0x24,0xFC,0x00,0x00,0x00,0x00},

{0x00,0x00,0xFF,0x81,0x41,0x21,0x03,0x05,0x09,0x11,0x29,0x45,0x42,0x80,0x80,0x00},

{0x00,0x04,0x24,0x24,0x25,0x26,0xE4,0x3C,0x24,0x26,0x25,0x24,0x24,0x04,0x00,0x00},

{0x41,0x21,0x11,0x89,0x85,0x8B,0x89,0x89,0xF9,0x89,0x89,0x89,0x89,0x81,0x01,0x00},

};

#endif

        Wi-Fi模块功能实现

        ESP8266-01S可以通过串口与其他设备进行通信,包括32位单片机。在32单片机上使用ESP8266-01S,可以将ESP8266-01S设置为透传模式,以实现数据的收发。透传模式是指将ESP8266-01S设置为将串口收到的所有数据都转发到Wi-Fi网络,并将Wi-Fi网络接收到的所有数据都转发到串口的工作模式。在透传模式下,ESP8266-01S作为一个透明的串口转发器,将串口数据和Wi-Fi数据之间的传输桥梁。要在STM32上使用ESP8266-01S模块分为以下几步。第一,初始化ESP8266-01S:在32单片机上,需要通过串口向ESP8266-01S发送初始化命令,以设置透传模式、工作模式和其他参数。可以使用AT 指令进行初始化,例如AT+RST 重启模块,AT+CWMODE=2 设置模块工作模式为AP 模式等等;第二,设置模块为AP 模式后,使用AT 指令AT+CWSAP 设置模块的热点名称和密码,利用AT+CIPSERVER=1 使模块成为TCP 服务器,这样就可以让App 作为TCP 客户端与模块连接并进行数据的传输;第三,在主函数中使用“AT+CIPSEND” 指令即给TCP 客户端发送数据,接收数据则使用中断函数的办法。

        esp8266.c

#include "esp8266.h"

void atk_8266_start_trans(void)

{

u8 ret = 0;

delay_ms(1000);

delay_ms(1000);

ret = atk_8266_send_cmd("AT","OK", 100);

if(ret == 0 ) printf("AT成功\n");

else printf("AT fail\n");

delay_ms(1000);

ret = atk_8266_send_cmd ("AT+RST" , NULL ,100);

if(ret == 0 ) printf("AT+RST成功\n");

else printf("AT+RST fail\n");

delay_ms(2000);

ret = atk_8266_send_cmd("AT+CWMODE=2","OK",200);

if(ret == 0 ) printf("AT+CWMODE=2\n");

else printf("AT+CWMODE fail\n");

delay_ms(1000);

ret = atk_8266_send_cmd("AT+CWSAP=\"ESP8266-ly\",\"123456789\",11,0","OK",100);

if(ret == 0 ) printf("AT+CWSAP成功\n");

else printf("AT+CWSAP fail\n");

delay_ms(1000);

ret = atk_8266_send_cmd("AT+CIPMUX=1","OK",20);

if(ret == 0 ) printf("AT+CIPMUX=1\n");

else printf("AT+CIPMUX=1 fail\n");

delay_ms(1000);

ret = atk_8266_send_cmd("AT+CIPSERVER=1","OK",200);

if(ret == 0 ) printf("AT+CIPSERVER=1\n");

else printf("AT+CIPSERVER fail\n");

delay_ms(1000);

}

u8 atk_8266_check_cmd(char *str)

{

if(USART3_RX_STA&0x8000)

{

USART3_RX_BUF[USART3_RX_STA&0x7fff]=0;

if(strstr((const char*)USART3_RX_BUF,(const char*)str))

return 1;

else

return 0;

}

return 0;

}

u8 atk_8266_send_cmd(char *cmd, char *ack,u16 waittime)

{

u8 res=0;

USART3_RX_STA=0;

u3_printf("%s\r\n",cmd);

if(ack && waittime)

{

while(--waittime)

{

delay_ms(100);

if(USART3_RX_STA&0x8000)

{

if(atk_8266_check_cmd(ack))

{

printf("ack:%s\r\n",(u8*)ack);

break;

}

}

USART3_RX_STA=0;

}

if(waittime==0)res=1;

}

return res;

}

u8* atk_8266_send_data(char *cmd,u16 waittime)

{

char temp[5];

char *ack=temp;

USART3_RX_STA=0;

u3_printf("%s\r\n",cmd);

if(waittime)

{

while(--waittime)

{

delay_ms(10);

if(USART3_RX_STA&0X8000)

{

USART3_RX_BUF[USART3_RX_STA&0X7fff]=0;

ack=(char*)USART3_RX_BUF;

printf("ack:%s\r\n",(u8*)ack);

USART3_RX_STA=0;

break;

}

}

}

return (u8*)ack;

}

        uart.c

#include "uart.h"

void UART1_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

GPIO_InitStructure.GPIO_Pin= GPIO_Pin_9 | GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF;

GPIO_InitStructure.GPIO_OType= GPIO_OType_PP;

GPIO_InitStructure.GPIO_Speed= GPIO_Speed_100MHz;

GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_NOPULL;

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);

USART_InitStructure.USART_BaudRate = 115200;

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

USART_InitStructure.USART_StopBits = USART_StopBits_1;

USART_InitStructure.USART_Parity = USART_Parity_No;

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_Init(USART1, &USART_InitStructure);

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

USART_Cmd(USART1,ENABLE);

}

void send_string(char *arr)

{

while(*arr)

{

USART_SendData(USART1, *arr++);

while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

}

}

        uart.h

#ifndef _UART_H

#define _UART_H

#include <stm32f4xx.h>

void UART1_Config(void);

void send_string(char *arr);

#endif

        uart3.c 

#include "uart3.h"

#include "delay.h"

#include "stdarg.h"

#include "stdio.h"

#include "string.h"

int i=0;

extern u8 Temperature_yu,Smog_yu,CO_yu;

__align(8) u8 USART3_TX_BUF[USART3_MAX_SEND_LEN];

#ifdef USART3_RX_EN

u8 USART3_RX_BUF [USART3_MAX_RECV_LEN];

u16 USART3_RX_STA=0;

void USART3_IRQHandler(void)

{

u8 res;

int j,k,find;

u8 get_data[11];

char str_get_data[11];

char* token;

if(USART_GetITStatus(USART3,USART_IT_RXNE) != RESET)

{

res =USART_ReceiveData(USART3);

if((USART3_RX_STA&(1<<15))==0)

{

if(USART3_RX_STA<USART3_MAX_RECV_LEN)

{

USART3_RX_BUF[USART3_RX_STA++]=res;

if(res == '\n' && USART3_RX_BUF[USART3_RX_STA - 2] == '\r')

{

if(USART3_RX_BUF[0] == '\n' || USART3_RX_BUF[0] == '\r' ){}

else{

if(i<47){

i++;

}

else{

printf("串口3收到%s",USART3_RX_BUF);

for(j=0;j<20;j++){

find = 0;

if(USART3_RX_BUF[j] == ':')

{

find = 1;

break;

}

}

if(find==1){

for(k=0;k<10;k++){

get_data[k] = USART3_RX_BUF[k+j];

}

printf("get_data%s\n",get_data);

snprintf(str_get_data, sizeof(str_get_data), "%s", get_data);

token = strtok(str_get_data, " ");

if (token != NULL) {

token = strtok(NULL, " ");

if (token != NULL) {

Temperature_yu = atoi(token);

token = strtok(NULL, " ");

if (token != NULL) {

Smog_yu = atoi(token);

token = strtok(NULL, " ");

if (token != NULL){

CO_yu = atoi(token);

} else {

CO_yu = 20;

}

} else {

CO_yu = 20;

}

} else {

Temperature_yu = 40;

Smog_yu = 20;

CO_yu = 20;

}

} else {

Temperature_yu = 40;

Smog_yu = 20;

CO_yu = 20;

}

}

}

}

USART3_RX_STA = 0;

memset(USART3_RX_BUF, 0, sizeof(USART3_RX_BUF));

}

}

else

{

USART3_RX_STA|=1<<15;

}

}

}

}

#endif

void UART3_Config(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);

USART_DeInit(USART3);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF ;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3);

GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3);

USART_InitStructure. USART_BaudRate = 115200;

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

USART_InitStructure.USART_StopBits = USART_StopBits_1;

USART_InitStructure.USART_Parity = USART_Parity_No;

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_Init(USART3, &USART_InitStructure);

USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);

NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

USART3_RX_STA=0;

TIM_Cmd(TIM7,DISABLE);

USART_Cmd (USART3,ENABLE);

}

void u3_printf(char* fmt, ...)

{

u16 i,j;

va_list ap;

va_start(ap,fmt);

vsprintf((char*)USART3_TX_BUF,fmt,ap);

va_end(ap);

i=strlen((const char*)USART3_TX_BUF);

for(j=0;j<i;j++)

{

while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET);

USART_SendData(USART3,(uint8_t)USART3_TX_BUF[j]);

}

}

        uart3.h 

#ifndef _UART3_H

#define _UART3_H

#include "sys.h"

#include <stm32f4xx.h>

#define USART3_MAX_RECV_LEN 500

#define USART3_MAX_SEND_LEN 500

#define USART3_RX_EN 1

extern u8 USART3_RX_BUF[USART3_MAX_RECV_LEN];

extern u8 USART3_TX_BUF[USART3_MAX_SEND_LEN];

extern u16 USART3_RX_STA;

void UART3_Config(void);

void TIM7_Int_Init(u16 arr,u16 psc);

void u3_printf(char* fmt, ...);

#endif

        esp8266.h

#ifndef _ESP8266_H

#define _ESP8266_H

#include <stm32f4xx.h>

#include "sys.h"

#include "delay.h"

#include "uart3.h"

#include "uart.h"

#include "string.h"

#include <stdio.h>

extern char restart[];

extern char cwmode[];

extern char cwlap[];

extern char cwjap[];

extern char cifsr[];

extern char cipmux[];

extern char cipstart[];

extern char cipsend[];

extern char cipserver[];

extern char cwlif[];

extern char cipstatus[];

extern char cipsto[];

extern char cipmode[];

extern char test[];

u8 atk_8266_send_cmd(char *cmd,char *ack,u16 waittime);

u8* atk_8266_send_data(char *cmd,u16 waittime);

u8 atk_8266_check_cmd(char *str);

void atk_8266_start_trans(void);

u8 atk_8266_quit_trans(void);

#endif

        主程序

        main.c

#include <stm32f4xx.h>

#include "sys.h"

#include <stdio.h>

#include "delay.h"

#include "led.h"

#include "TIM.h"

#include "uart.h"

#include "uart3.h"

#include "DHT11.h"

#include "mq2.h"

#include "mq7.h"

#include "beep.h"

#include "key.h"

#include "esp8266.h"

#include "oled.h"

int fputc(int ch, FILE *F)

{

USART_SendData(USART1, ch);

while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

return ch;

}

void Yuzhi_change(u8 *yuzhi)

{

if( PAin(0)== 0 )

{

if( *yuzhi<99 )

{

PFout(9) = 0;

(*yuzhi)++;

}

}

else

PFout(9) = 1;

if( PEin(2)== 0 )

{

if( *yuzhi>1 )

{

PFout(10) = 0;

(*yuzhi)--;

}

}

else

PFout(10) = 1;

}

void Yuzhi_kind_change(u8 *kind, u8 *wendu_yu, u8 *yanwu_yu, u8 *CO_yu)

{

switch(*kind)

{

case 1:Yuzhi_change(&*wendu_yu);break;

case 2:Yuzhi_change(&*yanwu_yu);break;

case 3:Yuzhi_change(&*CO_yu);break;

default :break;

}

if( PEin(3)== 0 )

{

PEout(13) = 0;

if( *kind<3 )

(*kind)++;

else if( *kind == 3 )

*kind = 1;

switch(*kind)

{

case 1:Yuzhi_change(&*wendu_yu);break;

case 2:Yuzhi_change(&*yanwu_yu);break;

case 3:Yuzhi_change(&*CO_yu);break;

default :break;

}

}

else

PEout(13) = 1;

}

void s4(int kind, char *str_shidu, char *str_temp, char *str_smog, char *str_co, char *str_temp_yu, char *str_smog_yu, char *str_co_yu, u8 quality)

{

if( PEin(4)== 0 )

{

PEout(14) = 0;

OLED_Clear();

OLED_ShowChinese3(0,0,6,16);

OLED_ShowChinese3(18,0,7,16);

OLED_ShowChinese3(36,0,8,16);

OLED_ShowChinese3(54,0,9,16);

switch(quality)

{

case 1:

OLED_ShowChinese3(72,0,10,16);

OLED_Refresh();

break;

case 2:

OLED_ShowChinese3(72,0,11,16);

OLED_Refresh();

break;

case 3:

OLED_ShowChinese3(72,0,12,16);

OLED_Refresh();

break;

default :break;

}

OLED_ShowChinese3(0,16,0,16);

OLED_ShowChinese3(18,16,1,16);

OLED_ShowChinese3(36,16,2,16);

OLED_ShowChinese3(54,16,3,16);

OLED_ShowChinese3(72,16,4,16);

OLED_ShowChinese3(90,16,5,16);

switch(kind)

{

case 1:

OLED_ShowChinese2(0,32,0,16);

OLED_ShowChinese2(18,32,2,16);

OLED_ShowChinese2(36,32,6,16);

OLED_ShowChinese2(54,32,7,16);

OLED_Refresh();

break;

case 2:

OLED_ShowString(0,32,"CH4",16);

OLED_ShowChinese2(36,32,6,16);

OLED_ShowChinese2(54,32,7,16);

OLED_Refresh();

break;

case 3:

OLED_ShowString(0,32,"CO",16);

OLED_ShowChinese2(36,32,6,16);

OLED_ShowChinese2(54,32,7,16);

OLED_Refresh();

break;

default :break;

}

OLED_Refresh();

delay_ms(1500);

OLED_Clear();

OLED_ShowChinese2(0,0,1,16);

OLED_ShowChinese2(18,0,2,16);

OLED_ShowChar(36,0,':',16);

OLED_ShowString(48,0,&*str_shidu,16);

OLED_ShowChinese2(87,0,6,16);

OLED_ShowChinese2(105,0,7,16);

OLED_ShowChinese2(0,16,0,16);

OLED_ShowChinese2(18,16,2,16);

OLED_ShowChar(36,16,58,16);

OLED_ShowString(48,16,&*str_temp,16);

OLED_ShowString(96,16,&*str_temp_yu,16);

OLED_ShowString(0,32,"CH4:",16);

OLED_ShowString(32,32,&*str_smog,16);

OLED_ShowString(96,32,&*str_smog_yu,16);

OLED_ShowString(0,48,"CO: ",16);

OLED_ShowString(32,48,&*str_co,16);

OLED_ShowString(96,48,&*str_co_yu,16);

OLED_Refresh();

PEout(14) = 1;

}

else

PEout(14) = 1;

}

u8 kind = 1;

u8 Temperature_yu;

u8 Smog_yu;

u8 CO_yu;

u8 quality = 1;

int result[] = {0, 0, 0, 0, 0, 0, 0};

char str[25];

char str_shidu[10];

char str_temp[10];

char str_smog[10];

char str_co[10];

char str_temp_yu[10];

char str_smog_yu[10];

char str_co_yu[10];

extern u8 num1,num2,num3;

int main(void)

{

uint8_t buf[5];

float Smog_ppm = 0;

float CO_ppm = 0;

int i = 0;

u8 ret=0,ret1=0;

Temperature_yu = 40;

Smog_yu = 20;

CO_yu = 20;

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);

led_init();

UART1_Config();

UART3_Config();

MQ2_Init();

CO_Init();

Key_Init();

Beep_init();

OLED_Init();

atk_8266_start_trans();

while(1)

{

if(dht11_read_data(buf)==0){}

Yuzhi_kind_change(&kind, &Temperature_yu, &Smog_yu, &CO_yu);

s4(kind, str_shidu, str_temp, str_smog, str_co, str_temp_yu, str_smog_yu, str_co_yu, quality);

Smog_ppm = Smog_GetPPM();

CO_ppm = MQ7_GetPPM();

result[0] = buf[0];

result[1] = buf[2];

result[2] = (int)Smog_ppm;

result[3] = (int)CO_ppm;

result[4] = Temperature_yu;

result[5] = Smog_yu;

result[6] = CO_yu;

sprintf(str, "%d", result[0]);

for (i = 1; i < 7; i++) {

sprintf(str + strlen(str), " %d", result[i]);

}

sprintf(str + strlen(str), " 0 0 0 0 0 0 0 0 0 0 0 0 0 0");

ret = atk_8266_send_cmd("AT+CIPSEND=0,21",NULL,200);

if(ret == 0 )

{

delay_ms(1000);

ret1 = atk_8266_send_cmd(str, NULL, 200);

if(ret1 == 0 ) printf("SEND OK\n");

else printf("SEND fail\n");

}

else printf("AT+CIPSEND fail\n");

memset(str, 0, sizeof(str));

if( CO_ppm<25 && Smog_ppm<25 && buf[2]<25 )

{

quality = 1;

}

else if( CO_ppm>35 || Smog_ppm>35 || buf[2]>35 )

{

quality = 3;

}

else quality = 2;

if( (CO_ppm >= CO_yu) || (Smog_ppm >= Smog_yu ) || (buf[2]>=Temperature_yu) )

PFout(8) = 1;

else

PFout(8) = 0;

sprintf(str_shidu,"%d",buf[0]);

sprintf(str_temp,"%d",buf[2]);

sprintf(str_temp_yu,"%d",Temperature_yu);

sprintf(str_smog_yu,"%d",Smog_yu);

sprintf(str_co_yu,"%d",CO_yu);

sprintf(str_smog,"%.2f",Smog_ppm);

sprintf(str_co,"%.2f",CO_ppm);

OLED_Clear();

OLED_ShowChinese2(0,0,1,16);

OLED_ShowChinese2(18,0,2,16);

OLED_ShowChar(36,0,':',16);

OLED_ShowString(48,0,str_shidu,16);

OLED_ShowChinese2(87,0,6,16);

OLED_ShowChinese2(105,0,7,16);

OLED_ShowChinese2(0,16,0,16);

OLED_ShowChinese2(18,16,2,16);

OLED_ShowChar(36,16,58,16);

OLED_ShowString(48,16,str_temp,16);

OLED_ShowString(96,16,str_temp_yu,16);

OLED_ShowString(0,32,"CH4:",16);

OLED_ShowString(32,32,str_smog,16);

OLED_ShowString(96,32,str_smog_yu,16);

OLED_ShowString(0,48,"CO: ",16);

OLED_ShowString(32,48,str_co,16);

OLED_ShowString(96,48,str_co_yu,16);

OLED_Refresh();

}

return 0;

}

void USART1_IRQHandler(void)

{

uint8_t d;

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

{

d = USART_ReceiveData(USART1);

}

}

        key.c

#include "key.h"

void Key_Init()

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin= GPIO_Pin_0;

GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IN;

GPIO_InitStructure.GPIO_OType= GPIO_OType_PP;

GPIO_InitStructure.GPIO_Speed= GPIO_Speed_100MHz;

GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_NOPULL;

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin= GPIO_Pin_2;

GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IN;

GPIO_InitStructure.GPIO_OType= GPIO_OType_PP;

GPIO_InitStructure.GPIO_Speed= GPIO_Speed_100MHz;

GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_NOPULL;

GPIO_Init(GPIOE, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin= GPIO_Pin_3;

GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IN;

GPIO_InitStructure.GPIO_OType= GPIO_OType_PP;

GPIO_InitStructure.GPIO_Speed= GPIO_Speed_100MHz;

GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_NOPULL;

GPIO_Init(GPIOE, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin= GPIO_Pin_4;

GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IN;

GPIO_InitStructure.GPIO_OType= GPIO_OType_PP;

GPIO_InitStructure.GPIO_Speed= GPIO_Speed_100MHz;

GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_NOPULL;

GPIO_Init(GPIOE, &GPIO_InitStructure);

}

        key.h

#ifndef _KEY_H

#define _KEY_H

#include <stm32f4xx.h>

#include "sys.h"

#include "delay.h"

#include "math.h"

#include "adc.h"

void Key_Init(void);

#endif

        led.c

#include "led.h"

void led_init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF, ENABLE);

GPIO_InitStructure.GPIO_Pin= GPIO_Pin_9 | GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode= GPIO_Mode_OUT;

GPIO_InitStructure.GPIO_OType= GPIO_OType_PP;

GPIO_InitStructure.GPIO_Speed= GPIO_Speed_100MHz;

GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_NOPULL;

GPIO_Init(GPIOF, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin= GPIO_Pin_13 | GPIO_Pin_14;

GPIO_Init(GPIOE, &GPIO_InitStructure);

PFout(9) = 1;

PFout(10) = 1;

PEout(13) = 1;

PEout(14) = 1;

}

extern uint8_t cmp_led1;

void LED_CTL(u8 num, u8 stat, u8 value)

{

if(stat == 0xFF)

{

if(num == 0x01)

TIM_SetCompare1(TIM14, 0);

if(num == 0x02)

cmp_led1 = 0;

if(num == 0x03)

TIM_SetCompare3(TIM1, 0);

if(num == 0x04)

TIM_SetCompare4(TIM1, 0);

}

else if(stat == 0x00)

{

if(num == 0x01)

TIM_SetCompare1(TIM14, 100);

if(num == 0x02)

cmp_led1 = 100;

if(num == 0x03)

TIM_SetCompare3(TIM1, 100);

if(num == 0x04)

TIM_SetCompare4(TIM1, 100);

}

else if(stat == 0xAF)

{

if(value<100 && value>0)

{

if(num == 0x01)

TIM_SetCompare1(TIM14, value);

if(num == 0x02)

cmp_led1 = value;

if(num == 0x03)

TIM_SetCompare3(TIM1, value);

if(num == 0x04)

TIM_SetCompare4(TIM1, value);

}

}

}

         led.h

#ifndef _LED_H

#define _LED_H

#include <stm32f4xx.h>

#include "sys.h"

void led_init(void);

void LED_CTL(u8 num, u8 stat, u8 value);

#endif

        beep.c

#include "beep.h"

void Beep_init()

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Low_Speed;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

GPIO_Init(GPIOF, &GPIO_InitStructure);

PFout(8) = 0;

}

        beep.h

#ifndef _BEEP_H

#define _BEEP_H

#include <stm32f4xx.h>

#include "sys.h"

#include "delay.h"

void Beep_init(void);

#endif

网址:基于STM32的厨房环境监测系统 https://www.yuejiaxmz.com/news/view/308262

相关内容

基于STM32的户外环境监测系统(五)
基于STM32的室内环境监测系统
基于STM32的室内环境监测系统:打造智能生活新体验
基于STM32单片机的室内环境监测系统设计
基于stm32的家庭安全监测系统
基于STM32的智能家居环境监测与控制系统毕业设计
基于STM32的智能空气质量监测系统
基于STM32单片机的智能家居环境监测与控制系统设计
基于STM32单片机的室内环境监测系统:打造智能生活新体验
基于 STM32 的室内环境监测系统的背景和研究意义

随便看看