2015-01-05 12:41:52 u012163234 阅读数 3101
  • micropython基础入门(esp32/esp8266单片机开发)

    micropython语法和python3一样,编写起来非常方便。如果你快速入门单片机玩物联网而且像轻松实现各种功能,那绝力推荐使用micropython。方便易懂易学。 同时如果你懂C语音,也可以用C写好函数并编译进micropython固件里然后进入micropython调用(非必须)。 能通过WIFI联网(2.1章),也能通过sim卡使用2G/3G/4G/5G联网(4.5章)。 为实现语音控制,本教程会教大家使用tensorflow利用神经网络训练自己的语音模型并应用。 为实现通过网页控制,本教程会教大家linux(debian10 nginx->uwsgi->python3->postgresql)网站前后台入门。 为记录单片机传输过来的数据, 本教程会教大家入门数据库。 本教程会通过通俗易懂的比喻来讲解各种原理与思路,并手把手编写程序来实现各项功能。 micropython版本是 2019年6月发布的1.11; 更多内容请看视频列表。 学习这门课程之前你需要至少掌握: 1: python3基础(变量, 循环, 函数, 常用库, 常用方法)。 本视频使用到的零件与淘宝上大致价格:     1: 超声波传感器(3)     2: MAX9814麦克风放大模块(8)     3: DHT22(15)     4: LED(0.1)     5: 8路5V低电平触发继电器(12)     6: HX1838红外接收模块(2)     7:红外发射管(0.1),HX1838红外接收板(1)     other: 电表, 排线, 面包板(2)*2,ESP32(28)

    332 人正在学习 去看看 陈恩棋

今天使用51单片机学习板调试DHT11湿度传感器,下载程序的时候把DHT11烧掉了。


一开始我使用杜邦线把DHT11的VCC引脚接到学习板上的VCC端,GND接GND,数据端口接51单片机的P0.0。


第一次给单片机下载程序没有什么问题,能下载成功。之后再下载程序发觉下载不了,下载窗口显示正在连接51单片机,后来听到“啪”一声,然后又闻到一股焦味,我吓得立马给单片机断电,检查是哪个元器件烧了。摸了一下DHT11湿度传感器,感觉烫烫的,应该是这个烧了。


检查了一下开发板的电源电路,我突然意识到如果要给传感器接VCC,必须在电源VCC和传感器VCC之间接一个电阻限流,不然就会像今天这样子把DHT11传感器给烧了。


另外,为什么程序下载不进去,我在网上查找到一下信息:


STC单片机下载引导程序需要CPU完全断电,注意:完全断电!完全断电!完全断电!


1、要知道电源并非只从VCC进入,其他管脚也可能有微弱电流,至于多大,并不是非得达到CPU工作的电流。
2、说到这里,大家可能明白了一点,微弱电源就是从你已经连好的ISP下载线进入了,下载线供电能力,有个体和偶然因素,所以很多人换根线或是改改波特率就好了,会判断是下载线不兼容的假像!这个假相迷惑了数代有识青年,并当做教本教育下一代,呵呵。
3、问题如何解决:STC串口线TXD串一个300-500欧电阻、RXD串一个IN4148,保证你从此告别STC下载烦劳。


我认为之前为什么程序下载不进去,是第一点原因。
第一次下载正常运行后,第二次再下载时,DHT11传感器里面有微弱的电流,这些电流传给51,导致51没有完全断电而不能下载程序。

2019-06-26 11:45:52 gongweidi 阅读数 178
  • micropython基础入门(esp32/esp8266单片机开发)

    micropython语法和python3一样,编写起来非常方便。如果你快速入门单片机玩物联网而且像轻松实现各种功能,那绝力推荐使用micropython。方便易懂易学。 同时如果你懂C语音,也可以用C写好函数并编译进micropython固件里然后进入micropython调用(非必须)。 能通过WIFI联网(2.1章),也能通过sim卡使用2G/3G/4G/5G联网(4.5章)。 为实现语音控制,本教程会教大家使用tensorflow利用神经网络训练自己的语音模型并应用。 为实现通过网页控制,本教程会教大家linux(debian10 nginx->uwsgi->python3->postgresql)网站前后台入门。 为记录单片机传输过来的数据, 本教程会教大家入门数据库。 本教程会通过通俗易懂的比喻来讲解各种原理与思路,并手把手编写程序来实现各项功能。 micropython版本是 2019年6月发布的1.11; 更多内容请看视频列表。 学习这门课程之前你需要至少掌握: 1: python3基础(变量, 循环, 函数, 常用库, 常用方法)。 本视频使用到的零件与淘宝上大致价格:     1: 超声波传感器(3)     2: MAX9814麦克风放大模块(8)     3: DHT22(15)     4: LED(0.1)     5: 8路5V低电平触发继电器(12)     6: HX1838红外接收模块(2)     7:红外发射管(0.1),HX1838红外接收板(1)     other: 电表, 排线, 面包板(2)*2,ESP32(28)

    332 人正在学习 去看看 陈恩棋

作者:GWD 时间:2019.06.26

DHT11温湿度传感器(单总线类)
一、 学习要点:
1、(重要)单总线类传感器检测高电平while(DHT11 == 1) temp |=0x01;出错,因为要提前拉高引脚或者加下拉电阻很麻烦,不如改成while(DHT11 == 0) temp<<=1;后程序正确,即检测低电平比检测高电平靠谱;
2、printf与LCD1602等显示字符的函数、屏幕外设要显示数字时怎么把数字转换成自负呢?答:数字后加’0’, shi_1 = val[0] / 10 + ‘0’;
二、手册分析:
(一)、参数、特性
1、传感器概述:DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有枀高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接;
2、引脚说明:
1)、 VDD 供电 3.3-5.5V DC;
2)、 DATA 串行数据,单总线;
3)、 NC 空脚;
4)、 GND 接地,电源负极、
3、典型电路;
在这里插入图片描述
4、建议连接线长度短于 20 米时用 5.1K 上拉电阻, 大于 20 米时根据实际情况降低上拉电阻的阻值;
5、使用 3.3V 电压供电时连接线长度不得大于 100cm。否则线路压降会导致传感器供电不足,造成测量偏差;
6、每次读出的温湿度数值是上一次测量的结果,欲获取实时数据,需连续读取两次,但不建议连续多次读取传感器,每次读取传感器间隔大于 5 秒即可获得准确的数据(有点弱);
7、微处理器与 DHT11 的连接典型应用电路如上图所示, DATA 上拉后与微处理器的 I/O 端口相连。
(二)、通信协议 串行通信-单线双向:
1、DHT11 器件采用简化的单总线通信。单总线即只有一根数据线,系统中的数据交换、控制均由单总线完成,当总线闲置时,其状态为高电平;
2、DATA 用于微处理器与 DHT11 之间的通讯和同步,采用单总线数据格式,一次传送 40 位数据,高位先出(先接收到的是高位);
3、数据格式:
1)、8bit 湿度整数数据 + 8bit 湿度小数数据+8bit 温度整数数据 + 8bit 温度小数数据+8bit 校验位。
注:其中温湿度小数部分为 0。
2)、校验位数据定义:“8bit 湿度整数数据 + 8bit 湿度小数数据+8bit 温度整数数据 + 8bit 温度小数数据” 8bit 校验位等于所得结果的末 8 位
4、接收数据解读:湿度: 0011 0101=35H=53%RH 温度: 0001 1000=18H=24℃
5、数据时序图:用户主机(MCU)发送一次开始信号后, DHT11 从低功耗模式转换到高速模式, 待主机开始信号结束后, DHT11 发送响应信号,送出 40bit 的数据,并触发一次信采集。信号发送如所示;
在这里插入图片描述
6、通信步骤:
步骤一:DHT11 上电后要等待 1S 以越过不稳定状态在此期间不能发送任何指令;
步骤二:开始信号(图2-3)微处理器的 I/O 设置为输出同时输出低电平,且低电平保持时间不能小于 18ms,然后微处理器的 I/O设置为输入状态,释放总线等待 DHT11 作出回答信号;
在这里插入图片描述
步骤三:DHT11 的 DATA 引脚检测到外部信号有低电平时,等待外部信号低电平结束,完成后 DHT11 的 DATA引脚处于输出状态,输出 80 微秒的低电平作为应答信号,紧接着输出 80 微秒的高电平通知外设准备接收数据,微处理器的 I/O 此时处于输入状态,检测到 I/O 有低电平(DHT11 回应信号)后,等待 80 微秒的高电平后的数据接收,发送信号如所示:
在这里插入图片描述
步骤四:由 DHT11 的 DATA 引脚输出 40 位数据,微处理器根据 I/O 电平的变化接收 40 位数据,位数据“0”的格式为(图2-6): 50 微秒的低电平和 26-28 微秒的高电平,位数据“1”的格式为: 50 微秒的低电平加 70微秒的高电平。位数据“0”、“1”格式信号如图所示:
数据0
数据1
步骤五:结束信号:DHT11 的 DATA 引脚输出 40 位数据后,继续输出低电平 50 微秒后转为输入状态,由于上拉电阻随之变为高电平。但 DHT11 内部重测环境温湿度数据,并记录数据,等待外部信号的到来。
三:编程
1、程序功能:检测温湿度在LCD1602显示或者串口输出检测结果,DHT11检测函数需要返回多个参数所以用了指针传址的操作,模板简单利用;
2、 程序效果:
在这里插入图片描述
3、 DHT11.c文件
#include “DHT11.h”
#include “delay.h”
#include “reg52.h”

void Dht11_Start(void)
{
DHT11 = 0;
Delay10ms();
Delay10ms();
Delay10ms();
DHT11 = 1;
Delay10us();
while(DHT11 == 0);
Delay10us();
while(DHT11 != 0);
}

void Rd_DHT11(char *p)
{
int i,j;
char temp;
for(i=0 ; i<5 ; i++)
{
for( j=0 ; j<8 ; j++ )
{
while(DHT11 == 0);
Delay10us();
Delay10us();
Delay10us();
if(DHT11 == 0)
{
temp = temp << 1;
}
else
{
temp = temp | 0x01;
temp = temp << 1;
}
while(DHT11 != 0);
}
*p++ = temp;
}
DHT11=1;
}

源代码下载:
链接:https://pan.baidu.com/s/1uwDn0i9UEdQa0BT2bPOgdA
提取码:4nfw

2018-08-06 00:42:34 zxylv 阅读数 808
  • micropython基础入门(esp32/esp8266单片机开发)

    micropython语法和python3一样,编写起来非常方便。如果你快速入门单片机玩物联网而且像轻松实现各种功能,那绝力推荐使用micropython。方便易懂易学。 同时如果你懂C语音,也可以用C写好函数并编译进micropython固件里然后进入micropython调用(非必须)。 能通过WIFI联网(2.1章),也能通过sim卡使用2G/3G/4G/5G联网(4.5章)。 为实现语音控制,本教程会教大家使用tensorflow利用神经网络训练自己的语音模型并应用。 为实现通过网页控制,本教程会教大家linux(debian10 nginx->uwsgi->python3->postgresql)网站前后台入门。 为记录单片机传输过来的数据, 本教程会教大家入门数据库。 本教程会通过通俗易懂的比喻来讲解各种原理与思路,并手把手编写程序来实现各项功能。 micropython版本是 2019年6月发布的1.11; 更多内容请看视频列表。 学习这门课程之前你需要至少掌握: 1: python3基础(变量, 循环, 函数, 常用库, 常用方法)。 本视频使用到的零件与淘宝上大致价格:     1: 超声波传感器(3)     2: MAX9814麦克风放大模块(8)     3: DHT22(15)     4: LED(0.1)     5: 8路5V低电平触发继电器(12)     6: HX1838红外接收模块(2)     7:红外发射管(0.1),HX1838红外接收板(1)     other: 电表, 排线, 面包板(2)*2,ESP32(28)

    332 人正在学习 去看看 陈恩棋

前几天发了arduino读取dht11的文章【arduino读取DHT11温度、湿度数据并串口显示 】,里面DHT11的通信协议已经说明了,这里略过,贴个程序吧。测试过可用的。

晶振11.0592Mhz。

   

#include "reg52.h"
unsigned char num[10]={0xde,0x82,0xec,0xe6,0xb2,0x76,0x7e,0xc2,0xfe,0xf6};//数码管段码
unsigned char a[5]={0,0,0,0,0};//存放温度、湿度数据的数组,初始为0
unsigned char i,j,t;//for循环的变量
sbit out=P0^4;//DHT11的数据io接口
void delay(unsigned char x)// 1 ms 延时函数
{
    unsigned char i,j;
    for(i=0;i
        for(j=0;j< 110;j++);
}


void display(unsigned char a,unsigned char c) //数码管显示函数
{
    unsigned char i,b,d;
    b=a%10;//求出温度个位
    a=a/10;//温度十分位
    d=c%10;//湿度个位
    c=c/10;//湿度十分位
    for(i=0;i< 200;i++)
            {
            P2=num[a];//写入段码
            P0=0xfe;//打开第一个数码管
            delay(3);//延时
            P2=num[b];//写入段码
            P0=0xfd;//打开第二个数码管
            delay(3);//延时
            P2=num[c];//。。。。依此类推
            P0=0xfb;
            delay(3);
            P2=num[d];
            P0=0xf7;
            delay(3);
            }
}

void begin()//DHT11初始函数
{
  out=1;
  out=0;//数据线拉低
  delay(32);  //延时至少28ms
    out=1;//拉高
}

void read1()//读取温、湿度数据函数
{
    for(t=0;t< 3;t++);//延时大约30us
    if(out==0)//判断DHT11是否响应
    {
        while(out==0);//等待80us的低电平结束
        for(t=0;t< 2;t++);//延时若干us
        while(out==1);//等待80us的高电平结束
        for(i=0;i< 5;i++)//温度、湿度整数、小数部分以及校验值五个数据
        {
            for(j=0;j< 8;j++)//8位二进制数
            {  
                                while(out==0);//等待50us的低电平结束
                                a[i]=a[i]<<1;//数据左移1位
                                for(t=0;t< 4;t++);//等待大于30us小于70us的时间,这个指令具体延时多少不太确定
                                if(out==1)//如果数据线依然为高电平
                {
                    a[i]=a[i]|0x01;//说明此位是1
                                        while(out==1);//等待高电平结束进入下一位
                                }
                        }
                }
    }
    else    //如果DHT11无响应,则数据全为0
    {
        for(i=0;i< 5;i++)  
        {
         a[i]=0; 
        }
     }
        if(a[0]+a[2]!=a[4])//如果校验不通过,则数码管显示8888(因为读取到的小数位为0,这里就直接只取了整数位)
        {
            for(i=0;i< 5;i++)  
        {
         a[i]=88; 
        }
        }
}

void main()//主函数
{
    while(1)
    {
        begin();
        read1();
        out=1;
        display(a[2],a[0]);//因为读取到的小数位为0,这里就直接只取了整数值
    }
}

 

2019-12-07 00:26:57 Star19180325 阅读数 97
  • micropython基础入门(esp32/esp8266单片机开发)

    micropython语法和python3一样,编写起来非常方便。如果你快速入门单片机玩物联网而且像轻松实现各种功能,那绝力推荐使用micropython。方便易懂易学。 同时如果你懂C语音,也可以用C写好函数并编译进micropython固件里然后进入micropython调用(非必须)。 能通过WIFI联网(2.1章),也能通过sim卡使用2G/3G/4G/5G联网(4.5章)。 为实现语音控制,本教程会教大家使用tensorflow利用神经网络训练自己的语音模型并应用。 为实现通过网页控制,本教程会教大家linux(debian10 nginx->uwsgi->python3->postgresql)网站前后台入门。 为记录单片机传输过来的数据, 本教程会教大家入门数据库。 本教程会通过通俗易懂的比喻来讲解各种原理与思路,并手把手编写程序来实现各项功能。 micropython版本是 2019年6月发布的1.11; 更多内容请看视频列表。 学习这门课程之前你需要至少掌握: 1: python3基础(变量, 循环, 函数, 常用库, 常用方法)。 本视频使用到的零件与淘宝上大致价格:     1: 超声波传感器(3)     2: MAX9814麦克风放大模块(8)     3: DHT22(15)     4: LED(0.1)     5: 8路5V低电平触发继电器(12)     6: HX1838红外接收模块(2)     7:红外发射管(0.1),HX1838红外接收板(1)     other: 电表, 排线, 面包板(2)*2,ESP32(28)

    332 人正在学习 去看看 陈恩棋

STC15F2K60S2单片机…DHT11…OLED12864…串口通信

本节教程我们来重点讲一讲DHT11温湿度传感器的用法以及实现程序

一、先斩后奏,上程序!

1、dh11.c
/*****************************************DHT11温湿度传感器+OLED12864显示程序**********************************/
/*************************************************吉大电协2019.12.6*******************************************/
#include "stc15f2k60s2.h"
#include "intrins.h"
#include "uart.h"
#include "stdio.h"
#include "string.h"
#include "codetab.h"
#include "LQ12864.h"
#define uint unsigned int
#define uchar unsigned char
//sbit DATA=P3^4;
#define DATA P34
//#define DATA P3^4//这样宏定义在编译的时候会报错,具体的看我写的一篇文章,在问题解决分类里面,有详细的解释
int RLL,RHH,CLL,CHH; //用于储存温湿度的数据定义
char DAMPH[8],TEMPH[8],DAMPL[8],TEMPL[8];//用于储存温湿度的字符型数组定义
char dot[1]=".";//小数点

void delayus(uchar n)  //定义延时为us级的延时函数                       
{
  while(n--); 
}

void delay_ms(uint z)//定义延时为ms级的延时函数
{
  uint x,y;
  for(x=z;x>0;x--)
  for(y=614;y>0;y--);
}

void Delay1000ms()//定义延时为1s的延时函数		
{
	unsigned char i, j, k;
	_nop_();
	_nop_();
	i = 43;
	j = 6;
	k = 203;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void Start()
{
	DATA=0;//将总线拉低
	delay_ms(20);//延时20ms,确保延时大于18ms,这样DHT11可以检测到起始信号,然后就可以开始发出响应信号
	DATA=1;//将总线拉高
	delayus(30);
	DATA=1;
}

int readdht11_byte() //定义一个以字节为单位的函数,分别读取dht11发送的40bits的数据
{   
  int i,dht;  
  for(i=8;i>0;i--)//下面的这个循环实现读取八个bit的数据
  {      
    dht=dht<<1;//每次读取前,将数据的高位移位向左移位
    while(!DATA);//等待DHT11的50us低电平数据分隔信号过去
	delayus(35);//数据低电平分隔信号过去后,等待35us,然后再判断,具体为什么要等待,待下文分晓
    if(DATA==1) //如果延时35us后,信号还是高电平的话,那么就执行if里面的程序
  	{
      dht=dht|0x01;//dht的最低位置1,其他的位不改变
      delayus(55);//再延时55us,等待高电平信号过去
    }   
    else;//如果延时35us后,是低电平的话,那么就什么都不执行,在下一次if循化,dht数据移位的时候,会自动把最低位置为0,然后向左移位             
  } 
  return(dht);//将这个dht返回   
}

void read_dht11() //定义一个读取DHT11返回的40bits的数据的函数
{
  Start();//先让DHT11开始工作
  if(!DATA)//如果DHT11发出低电平信号响应的话,就执行下面的这段程序
  {   
    while(!DATA);//等待低电平响应信号过去
    while(DATA);//再等待DHT11低电平响应信号之后的一段80us的高电平确认信号过去
    RHH=readdht11_byte();//读取湿度的整数位
    RLL=readdht11_byte();//读取湿度的小数位
    CHH=readdht11_byte();//读取温度的整数位
    CLL=readdht11_byte();//读取温度的小数位
   }  
}

void Trans()//将读取的温湿度转换成字符型
{
	sprintf(TEMPH,"%d",CHH);//将温度整数位转换成字符
	sprintf(TEMPL,"%d",CLL/1000);//将温度的小数位转换成字符
	sprintf(DAMPH,"%d",RHH);
	sprintf(DAMPL,"%d",RLL/10000);
	strcat(TEMPH,dot);//将小数点和温度的整数位合成一串字符
	strcat(TEMPH,TEMPL);//将合成后的温度整数位+小数点与温度的小数位合成一串字符
	strcat(DAMPH,dot);
	strcat(DAMPH,DAMPL);
}

void main()
{	
    OLED_Init();//初始化OLED
    OLED_CLS(); //OLED清屏		
	OLED_P8x16Str(0,2,"TEMP:");//在OLED上面显示TEMP:字符串
	OLED_P8x16Str(64,2,"DAMP:");         
	OLED_P8x16Str(100,6,"RAA");
	Uart_Init();//串口程序初始化
	while(1)//循环执行下面的这段代码
	{
		read_dht11();//读取DHT11的数值
		Delay1000ms();//延时1s,因为DHT11的刷新频率在1s 左右
		Trans();//将读取的数据转换成一串字符
		Send_String("TEMP NOW: ");//在串口上显示这段内容
		Send_String(TEMPH);//将温度值发送到串口上
		Send_String("\r\n");//另取一行
		Send_String("DAMP NOW: ");
		Send_String(DAMPH);
		Send_String("\r\n");
		OLED_P8x16Str(0,4,TEMPH);//在OLED上显示出当前温度值
		OLED_P8x16Str(64,4,DAMPH);	
	}
}
2、uart.h

这是串口通信相关的程序,如果对串口通信不太清楚的话,可以看我另一篇博客,链接如下
STC15F2K60S2串口通信/波特率设置/通信初始化/发送(接收)一个数据教程

//串口初始化程序;115200bps;晶振11.0592MHz;串口方式1;T1 8为自动重装载模式
#include "stc15f2k60s2.h"
                       
void Uart_Init(void)//串口初始化程序;115200bps;晶振11.0592MHz;串口方式1
{
  SCON = 0x50;//设置为八位可变波特率
  AUXR = 0x40;//定时器1设置为1T模式
  TMOD = 0x20;//定时器1为模式2(八位自动重载)
  TL1 = 0xFD;//设置波特率重装值
  TH1 = 0xFD;		
  TR1 = 1;//开启定时器1
  ES = 1;//打开串口中断
  EA = 1;//打开总中断
}

void Send_Byte(unsigned char dat)//发送一个字节数据的函数
{
	SBUF = dat;//将dat的值传给SBUF寄存器,然后寄存器发送数据到串口上
	while (TI == 0);//等待数据发送完毕(数据发送完毕后,TI会自己置1)
  TI=0;//手动清零
}

void Send_String(char *buf)//定义一个发送字符串的函数
{
	while(*buf != '\0')//检测这个字符串是否到结尾
	{
		Send_Byte(*buf++);//发送字符串中的每一位
	}
}
3、codetab.h
/************************************6*8的点阵************************************/
const unsigned char code F6x8[][6] =
{
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp
	0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// !
	0x00, 0x00, 0x07, 0x00, 0x07, 0x00,// "
	0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,// #
	0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,// $
	0x00, 0x62, 0x64, 0x08, 0x13, 0x23,// %
	0x00, 0x36, 0x49, 0x55, 0x22, 0x50,// &
	0x00, 0x00, 0x05, 0x03, 0x00, 0x00,// '
	0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,// (
	0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,// )
	0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,// *
	0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,// +
	0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,// ,
	0x00, 0x08, 0x08, 0x08, 0x08, 0x08,// -
	0x00, 0x00, 0x60, 0x60, 0x00, 0x00,// .
	0x00, 0x20, 0x10, 0x08, 0x04, 0x02,// /
	0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0
	0x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 1
	0x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 2
	0x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 3
	0x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 4
	0x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 5
	0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6
	0x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 7
	0x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 8
	0x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 9
	0x00, 0x00, 0x36, 0x36, 0x00, 0x00,// :
	0x00, 0x00, 0x56, 0x36, 0x00, 0x00,// ;
	0x00, 0x08, 0x14, 0x22, 0x41, 0x00,// <
	0x00, 0x14, 0x14, 0x14, 0x14, 0x14,// =
	0x00, 0x00, 0x41, 0x22, 0x14, 0x08,// >
	0x00, 0x02, 0x01, 0x51, 0x09, 0x06,// ?
	0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,// @
	0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,// A
	0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B
	0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C
	0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D
	0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E
	0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F
	0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G
	0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H
	0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I
	0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J
	0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K
	0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L
	0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M
	0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N
	0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O
	0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P
	0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q
	0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R
	0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S
	0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T
	0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U
	0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V
	0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W
	0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X
	0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y
	0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z
	0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// [
	0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,// 55
	0x00, 0x00, 0x41, 0x41, 0x7F, 0x00,// ]
	0x00, 0x04, 0x02, 0x01, 0x02, 0x04,// ^
	0x00, 0x40, 0x40, 0x40, 0x40, 0x40,// _
	0x00, 0x00, 0x01, 0x02, 0x04, 0x00,// '
	0x00, 0x20, 0x54, 0x54, 0x54, 0x78,// a
	0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,// b
	0x00, 0x38, 0x44, 0x44, 0x44, 0x20,// c
	0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,// d
	0x00, 0x38, 0x54, 0x54, 0x54, 0x18,// e
	0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,// f
	0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g
	0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,// h
	0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,// i
	0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,// j
	0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,// k
	0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,// l
	0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,// m
	0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,// n
	0x00, 0x38, 0x44, 0x44, 0x44, 0x38,// o
	0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,// p
	0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,// q
	0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,// r
	0x00, 0x48, 0x54, 0x54, 0x54, 0x20,// s
	0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,// t
	0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,// u
	0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,// v
	0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,// w
	0x00, 0x44, 0x28, 0x10, 0x28, 0x44,// x
	0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y
	0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z
	0x14, 0x14, 0x14, 0x14, 0x14, 0x14,// horiz lines
};
/****************************************8*16的点阵************************************/
const unsigned char code F8X16[]=	  
{
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 0
  0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 1
  0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" 2
  0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 3
  0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 4
  0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 5
  0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,//& 6
  0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//' 7
  0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 8
  0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 9
  0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//* 10
  0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+ 11
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 12
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 13
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 14
  0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/// 15
  0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0 16
  0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1 17
  0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2 18
  0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3 19
  0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 20
  0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 21
  0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 22
  0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 23
  0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 24
  0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 25
  0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 26
  0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 27
  0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//< 28
  0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//= 29
  0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,//> 30
  0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 31
  0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,//@ 32
  0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 33
  0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 34
  0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 35
  0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 36
  0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 37
  0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 38
  0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 39
  0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 40
  0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 41
  0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 42
  0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 43
  0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 44
  0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 45
  0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 46
  0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 47
  0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 48
  0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 49
  0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 50
  0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 51
  0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 52
  0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 53
  0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 54
  0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 55
  0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 56
  0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 57
  0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 58
  0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 59
  0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 60
  0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 61
  0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 62
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//_ 63
  0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//` 64
  0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 65
  0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 66
  0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 67
  0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 68
  0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 69
  0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 70
  0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 71
  0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 72
  0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 73
  0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 74
  0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 75
  0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 76
  0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 77
  0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 78
  0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 79
  0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 80
  0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 81
  0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 82
  0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 83
  0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 84
  0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 85
  0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 86
  0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 87
  0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 88
  0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 89
  0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 90
  0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 91
  0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 92
  0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 93
  0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94
};
4、LQ12864.h

本期我们不讲OLED12864的使用,以后会专门有一节去讲

#include "stc15f2k60s2.h"

sbit SCL=P2^3; //串行时钟
sbit SDA=P2^2; //串行数据

#define high 1
#define low 0

#define	Brightness	0xCF 
#define X_WIDTH 	128
#define Y_WIDTH 	64
/*********************OLED驱动程序用的延时程序************************************/
void delay(unsigned int z)
{
	unsigned int x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}

/**********************************************
//IIC Start
**********************************************/
void IIC_Start()
{
   SCL = high;		
   SDA = high;
   SDA = low;
   SCL = low;
}

/**********************************************
//IIC Stop
**********************************************/
void IIC_Stop()
{
   SCL = low;
   SDA = low;
   SCL = high;
   SDA = high;
}

/**********************************************
// 通过I2C总线写一个字节
**********************************************/
void Write_IIC_Byte(unsigned char IIC_Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		if(IIC_Byte & 0x80)
			SDA=high;
		else
			SDA=low;
		SCL=high;
		SCL=low;
		IIC_Byte<<=1;
	}
	SDA=1;
	SCL=1;
	SCL=0;
}

/*********************OLED写数据************************************/ 
void OLED_WrDat(unsigned char IIC_Data)
{
	IIC_Start();
	Write_IIC_Byte(0x78);
	Write_IIC_Byte(0x40);			//write data
	Write_IIC_Byte(IIC_Data);
	IIC_Stop();
}
/*********************OLED写命令************************************/
void OLED_WrCmd(unsigned char IIC_Command)
{
	IIC_Start();
	Write_IIC_Byte(0x78);            //Slave address,SA0=0
	Write_IIC_Byte(0x00);			//write command
	Write_IIC_Byte(IIC_Command);
	IIC_Stop();
}
/*********************OLED 设置坐标************************************/
void OLED_Set_Pos(unsigned char x, unsigned char y) 
{ 
	OLED_WrCmd(0xb0+y);
	OLED_WrCmd(((x&0xf0)>>4)|0x10);
	OLED_WrCmd((x&0x0f)|0x01);
} 

/*********************OLED复位************************************/
void OLED_CLS(void)
{
	unsigned char y,x;
	for(y=0;y<8;y++)
	{
		OLED_WrCmd(0xb0+y);
		OLED_WrCmd(0x01);
		OLED_WrCmd(0x10);
		for(x=0;x<X_WIDTH;x++)
		OLED_WrDat(0);
	}
}
/*********************OLED初始化************************************/
void OLED_Init(void)
{
	delay(500);//初始化之前的延时很重要!
	OLED_WrCmd(0xae);//--turn off oled panel
	OLED_WrCmd(0x00);//---set low column address
	OLED_WrCmd(0x10);//---set high column address
	OLED_WrCmd(0x40);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
	OLED_WrCmd(0x81);//--set contrast control register
	OLED_WrCmd(Brightness); // Set SEG Output Current Brightness
	OLED_WrCmd(0xa1);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
	OLED_WrCmd(0xc8);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
	OLED_WrCmd(0xa6);//--set normal display
	OLED_WrCmd(0xa8);//--set multiplex ratio(1 to 64)
	OLED_WrCmd(0x3f);//--1/64 duty
	OLED_WrCmd(0xd3);//-set display offset	Shift Mapping RAM Counter (0x00~0x3F)
	OLED_WrCmd(0x00);//-not offset
	OLED_WrCmd(0xd5);//--set display clock divide ratio/oscillator frequency
	OLED_WrCmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
	OLED_WrCmd(0xd9);//--set pre-charge period
	OLED_WrCmd(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
	OLED_WrCmd(0xda);//--set com pins hardware configuration
	OLED_WrCmd(0x12);
	OLED_WrCmd(0xdb);//--set vcomh
	OLED_WrCmd(0x40);//Set VCOM Deselect Level
	OLED_WrCmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)
	OLED_WrCmd(0x02);//
	OLED_WrCmd(0x8d);//--set Charge Pump enable/disable
	OLED_WrCmd(0x14);//--set(0x10) disable
	OLED_WrCmd(0xa4);// Disable Entire Display On (0xa4/0xa5)
	OLED_WrCmd(0xa6);// Disable Inverse Display On (0xa6/a7) 
	OLED_WrCmd(0xaf);//--turn on oled panel
	OLED_Set_Pos(0,0);
} 

/*******************功能描述:显示8*16一组标准ASCII字符串	 显示的坐标(x,y),y为页范围0~7****************/
void OLED_P8x16Str(unsigned char x, y,unsigned char ch[])
{
	unsigned char c=0,i=0,j=0;
	while (ch[j]!='\0')
	{
		c =ch[j]-32;
		if(x>120){x=0;y++;}
		OLED_Set_Pos(x,y);
		for(i=0;i<8;i++)
		OLED_WrDat(F8X16[c*16+i]);
		OLED_Set_Pos(x,y+1);
		for(i=0;i<8;i++)
		OLED_WrDat(F8X16[c*16+i+8]);
		x+=8;
		j++;
	}
}

以上就是具体的几个主要程序。大多数解释已经在程序中的备注中解释了

二、有关DHT11用法的说明

下面这个技术文档,我在这里大致总结一下要点
DHT11是这样工作的:
1、单片机先在DHT11 DATA引脚相连的那个总线上拉低电平(20MS左右,一定要大于18ms)
2、DHT11做出回应,DATA先会将总线拉低80us,然后再拉高80us
3、DHT11开始发送数据,每个数据之间用50us的低电平间隔;0用26—28us的高电平表示,1用70us的高电平表示

是不是很简单?

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2014-03-31 15:20:13 yagnruinihao 阅读数 6356
  • micropython基础入门(esp32/esp8266单片机开发)

    micropython语法和python3一样,编写起来非常方便。如果你快速入门单片机玩物联网而且像轻松实现各种功能,那绝力推荐使用micropython。方便易懂易学。 同时如果你懂C语音,也可以用C写好函数并编译进micropython固件里然后进入micropython调用(非必须)。 能通过WIFI联网(2.1章),也能通过sim卡使用2G/3G/4G/5G联网(4.5章)。 为实现语音控制,本教程会教大家使用tensorflow利用神经网络训练自己的语音模型并应用。 为实现通过网页控制,本教程会教大家linux(debian10 nginx->uwsgi->python3->postgresql)网站前后台入门。 为记录单片机传输过来的数据, 本教程会教大家入门数据库。 本教程会通过通俗易懂的比喻来讲解各种原理与思路,并手把手编写程序来实现各项功能。 micropython版本是 2019年6月发布的1.11; 更多内容请看视频列表。 学习这门课程之前你需要至少掌握: 1: python3基础(变量, 循环, 函数, 常用库, 常用方法)。 本视频使用到的零件与淘宝上大致价格:     1: 超声波传感器(3)     2: MAX9814麦克风放大模块(8)     3: DHT22(15)     4: LED(0.1)     5: 8路5V低电平触发继电器(12)     6: HX1838红外接收模块(2)     7:红外发射管(0.1),HX1838红外接收板(1)     other: 电表, 排线, 面包板(2)*2,ESP32(28)

    332 人正在学习 去看看 陈恩棋

这里将我写的STC12C5A60S2单片机控制湿度温度传感DHT11的程序共享一下,是为了让前辈给予斧正。

更新: 

2014/06/29 09:01 在结构体DHT11_info中定义了DHT11_CRC,实际上此校验不属于CRC校验,定义名称不合适,

需要修改,这里只做声明,请自行修改

2014/05/31 提供修改方法,适用于不同型号的51单片机(文章最后)

2014/05/27 10:07(DHT11ReadByte(void)函数修改,修改内容已在DHT11.C中Modification部分讲述,为了便于理解修改细节,不涉及功能调试)

2014/04/26 18:04 (重新调试完成)

2014/04/26 17:50 (发现程序有问题,湿度整数部分超过100,重新调试)

2014/04/03 11:25

2014/03/31 15:17

(补充:以下代码只需要修改.h文件中含有 “选择” 字样的部分,就可以达到复用的效果)

对于串口调试部分,请参考《单片机程序协助调试方法(一)串口调试点击进入

实验对象:

实验现象:


 



测试程序:

#include <reg52.h>
#include "common.h"
#include "uart.h"
#include "DHT11.h"


void main(void)
{ 
	UB8 i=0;	
	DHT11_info  dataCode ;

	UartInit() ;

#if 0 //临时测试DHT11的存在与否
	P1=0x00 ;//led
	if(DHT11Init() <0)	 //未检测到DHT11
		P1=0x01 ;
	else				 //检测到DHT11
		P1=0x02 ;

	while(1);
#endif

	while(1)
	{

		if(DHT11Init()==DHT11_EXISTENCT) 
		{
	
			i=0; /*错误记录:忘记了给i清零,导致前几次测量数据正确,后面的数据都错误(一定要注意)*/
	
			while((DHT11_DATA_BIT )&& (i < 250))
			{
				i++; //临时,具体见调试
				     /*经过试验,这里250足够大了*/
			}
			
			/*临时试验,真正试验时必须屏蔽,否则影响后面数据的读取*/
			//UartSendString("ready to send data.\r\n") ;
		
	
			DHT11ReadInfo(&dataCode) ;
	
			UartSendValue("Humidity_H : ",dataCode.Humidity_H);
			UartSendValue("Humidity_L : ",dataCode.Humidity_L);
			UartSendValue("Temperature_H : ",dataCode.Temperature_H);
			UartSendValue("Temperature_L : ",dataCode.Temperature_L);
			UartSendValue("DHT11_CRC : " ,dataCode.DHT11_CRC);
			UartSendString("\r\n\r\n") ;
		}
		else
		{
			UartSendString("No DHT11 existence.\r\n");
		}
	}
}


/*################DHT11.h start################*/

#ifndef __DHT11_H__
#define __DHT11_H__

#include "common.h"
#include "reg52.h"

sbit DHT11_DATA_BIT	 = P2^0 ;/*根据具体硬件选择*/

typedef struct {
	UB8 Humidity_H ;
	UB8 Humidity_L ;
	UB8 Temperature_H ;
	UB8 Temperature_L ;
	UB8 DHT11_CRC;
}DHT11_info ;

#define DHT11_EXISTENCT		0 	/*DHT11存在*/
#define DHT11_NOT_EXISTENCT -1	/*DHT11不存在*/


/*****************外部接口函数******************/
extern SB8  DHT11Init(void) ;
extern void DHT11ReadInfo(DHT11_info *temp) ;
/**********************************************/


#endif  /*__DHT11_H__*/

/*################DHT11.h end################*/

 

/*################DHT11.C start################*/

/***************************************************************************
Module	:DHT11.c

Purpose	:Implementation of DHT11 module.

Version	:0.01							2014/02/03 12:00(OK)

Complier:Keil 8051 C complier V9.01

MCU		:STC12C5A60S2

Author	:yangrui

QQ		:279729201

Email	:yangrui90s@163.com


Modification:

=================
	2014/05/17 10:04
	Reason:
		1.将函数static UB8  DHT11ReadByte(void)内部的
			if (DHT11_DATA_BIT)	
			{	
				datCode |= 0x01;
			}
			j=0 ;
			while((DHT11_DATA_BIT) &&(j<250)) ;
			{
				j++ ; 		 
			}
			修改为
			if (DHT11_DATA_BIT)	
			{	
				datCode |= 0x01;

				j=0 ;
				while((DHT11_DATA_BIT) &&(j<250)) ;
				{
					j++ ; 		 
				}
			}
			因为只有当某一bit数据位高电平时,才需要等待电平拉低
			(每一bit数据发送之前都是以低电平开始,所以这等待是必须的),
			虽然第一种算法没有错误,但是方法二更好理解。	
=================

=================
	2014/04/03 11:01
	Reason:
		1.修改void DHT11ReadInfo(UB8 table[])的入参"UB8 table[]"形式
		为DHT11_info *temp,这样的结构更加紧凑。
=================

=================
	2014/03/31 10:48
	Reason:
		1.在DHT11ReadInfo(UB8 table[])中增加了延时部分,在没有延时的情况下。
		发现main函数中有时竟然不发送数据,或者复位后发送一次数据,这是因为
		DHT11在采集完数据之后会恢复到空闲状态,如果需要继续采集,需要一个启
		动过程。在main函数中添加延时,正常。
		但为了安全和方便,直接将延时加载采集数据的函数内部较好。
		

=================
***************************************************************************/


#include "DHT11.H"
#include <intrins.h>

/*外部接口函数在DHT11.H中声明*/

/*****************内部函数******************/
static void delay20msForDHT11(void) ;
static void delay10usForDHT11(void) ;
static UB8  DHT11ReadByte(void) ;		//读取DHT11字节数据
/**********************************************/

/******************************************************
Function	:delay20msForDHT11
Input		:N/A
Output		:N/A
Return		:N/A
Description	:N/A
Note		:由STC-ISP V6.67软件针对相应MCU生成,若MCU不同
			最好也要修改此函数。
******************************************************/
static void delay20msForDHT11(void)	//@11.0592MHZ
{
	unsigned char i, j, k;

	i = 1;
	j = 216;
	k = 35;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

/******************************************************
Function	:delay10usForDHT11
Input		:N/A
Output		:N/A
Return		:N/A
Description	:N/A
Note		:由STC-ISP V6.67软件针对相应MCU生成,若MCU不同
			最好也要修改此函数。
******************************************************/
static void delay10usForDHT11(void)
{
	unsigned char i;

	_nop_();
	i = 25;
	while (--i);
}

/******************************************************
Function	:DHT11Init
Input		:N/A
Output		:N/A
Return		: 0(DHT1 existence) 
			 -1(DHT11 not existenct)
Description	:检测DHT11的存在与否
Note		:1.本函数中,等待DHT11的低电平回应结束后才会跳出。

			 2.为了防止DHT11的未安装或接触不良导致的程序"卡死"
			 情况的发生,在等待电平转换的同时增加了时间限制,
			 并且这个时间设置的是较长的,经过试验,在正常连接
			 DHT11的情况下,还未等到"最后时间的到来",就已经
			 发生了电平转换,这在大工程中是非常必要的。
******************************************************/
SB8  DHT11Init(void)
{
	SB8 existenceFlag ; 
	UB8 i=0 ;
	
	DHT11_DATA_BIT = HIGH_LEVEL ;
	_nop_() ;
	_nop_() ;
	
	DHT11_DATA_BIT = LOW_LEVEL ;
	delay20msForDHT11() ;
	
	DHT11_DATA_BIT = HIGH_LEVEL ;
	delay10usForDHT11() ;
	delay10usForDHT11() ;
	delay10usForDHT11() ;
	delay10usForDHT11() ;
	delay10usForDHT11() ;

	if( !DHT11_DATA_BIT)
	{
		existenceFlag = DHT11_EXISTENCT ;
	}
	else
	{
		existenceFlag = DHT11_NOT_EXISTENCT ;
	}

	while((!DHT11_DATA_BIT) && (i<250)) 
	{
		i++ ; //暂时,具体见调试
			  /*经过调试,这里250足够大了*/
	}

	return existenceFlag ;
}

/******************************************************
Function	:DHT11ReadByte
Input		:N/A
Output		:N/A
Return		:byte-data which is read from DHT11
Description	:N/A
Note		:为了防止DHT11的未安装或接触不良导致的程序"卡死"
			 情况的发生,在等待电平转换的同时增加了时间限制,
			 并且这个时间设置的是较长的,经过试验,在正常连接
			 DHT11的情况下,还未等到"最后时间的到来",就已经
			 发生了电平转换,这在大工程中是非常必要的。
修改:把if之后的j=0 ,while(){}部分修改到if内部			 
******************************************************/
static UB8  DHT11ReadByte(void)
{
	UB8 j=0 ;
	UB8 i, datCode;

	for(i=0;i<8;i++)	 	
	{	
	    datCode <<= 1;
	    /*每一bit数据都以50us低电平时隙开始,这里直接等待DHT11把数据线拉到高电平*/
		j=0 ;
  		while( (! DHT11_DATA_BIT) && (j<250))			
  		{
			j++ ; //暂时,具体见调试
			 		 /*经过调试,这里250足够大了*/ 
  		}
		delay10usForDHT11() ;
		delay10usForDHT11() ;
		delay10usForDHT11() ;
		delay10usForDHT11() ;
		if (DHT11_DATA_BIT)	
		{	
			datCode |= 0x01;

			j=0 ;
			while((DHT11_DATA_BIT) &&(j<250)) ;
			{
				j++ ; //暂时,具体见调试
		 	 		 /*经过调试,这里250足够大了*/ 
			}
		}
		
	}
	return datCode;	

}

/******************************************************
Function	:DHT11ReadInfo
Input		:N/A
Output		:DHT11_infor struct 
Return		:N/A
Description	:读取DHT11采集到的数据
Note		:注意增加延时的意义。见"Modification"的
			"2014/03/31 10:48"部分。
******************************************************/
void DHT11ReadInfo(DHT11_info *temp)
{
	temp->Humidity_H 	= DHT11ReadByte() ; //Humidity_H
	temp->Humidity_L 	= DHT11ReadByte() ; //Humidity_L
	temp->Temperature_H = DHT11ReadByte() ; //Temperature_H
	temp->Temperature_L = DHT11ReadByte() ; //Temperature_L
	temp->DHT11_CRC 	= DHT11ReadByte() ; //DHT11_CRC

	delay20msForDHT11() ;
	delay20msForDHT11() ;
	delay20msForDHT11() ;
	delay20msForDHT11() ;
	delay20msForDHT11() ;
	delay20msForDHT11() ;
	delay20msForDHT11() ;
	delay20msForDHT11() ;
	delay20msForDHT11() ;
	delay20msForDHT11() ;
}


/*################DHT11.C end################*/


补充:common.h

#ifndef __COMMON_H__
#define __COMMON_H__

typedef unsigned char UB8 ;
typedef unsigned short int UW16 ;
typedef unsigned long UL32 ;

typedef char SB8;
typedef short int SW16 ;
typedef long SL32 ;
	
#define HIGH_LEVEL 1	
#define LOW_LEVEL  0


#endif	/*__COMMON_H__*/



后期:

1.针对不同的IO:

修改DHT11.h的

sbit DHT11_DATA_BIT	 = P2^0 ;/*根据具体硬件选择*/

即可!!


2.针对不同MCU修改:

修改DHT11.c中的static void delay20msForDHT11(void)和static void delay10usForDHT11(void),因为这里的延时函是利用STC-ISP软件自带的工具生成的,是针对STC12C5A60S2的,所以,若用于不同的51单片机,需要修改延时函数,过程截图:



3.对于串口打印:参考http://blog.csdn.net/yagnruinihao/article/details/22662145,这里需要使用11.0592MHZ晶振,直接拷贝uart.h和uart.c,加入工程直接编译即可,如果不同,只需稍作修改。


3.程序的拷贝:


没有更多推荐了,返回首页