基于bmp085气压传感器制作的大气压强、温度、海拔高度测量仪(含详细源代码)_第1页
基于bmp085气压传感器制作的大气压强、温度、海拔高度测量仪(含详细源代码)_第2页
基于bmp085气压传感器制作的大气压强、温度、海拔高度测量仪(含详细源代码)_第3页
基于bmp085气压传感器制作的大气压强、温度、海拔高度测量仪(含详细源代码)_第4页
基于bmp085气压传感器制作的大气压强、温度、海拔高度测量仪(含详细源代码)_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

前一段时间看到一网店尽然有大气压强传感器销售,抓紧搞了一块回来试试,花了两天的时间最终把它搞定了,其中部分代码借鉴与一网友的的代码。废话不多说先上传测量效果照另外本项目的源代码是模块编程,源代码便于阅读,便于移植,也是一个不错的模块化编程例程,假如对这些代码有任何看法或者建议的都可以提出来,感谢源代码:/******************************************************** 项目名称:BMP085模块硬件功能测试 目地:BMP085模块硬件功能测试 模块:基本组件,12864驱动,显示驱动,iic驱动,bmp085驱动 功能: v0.0 读取eeprom里面11个数据,并且读取大气压的值以2进制形式显示出来 v0.1 读取出当前气压值、气温、海拔高度,并且显示出来 硬件要求: 主控芯片:STC89c52 测试电路板————普中科技51开发板 晶振:12.000mhz 作者 日期 备注 熊梦杰 2012/08/31 新增 熊孟杰 2012/09/01 修改 *********************************************************/#include"config.h"voidmain(){ LCD_Init(); DisplayLoading(); Init_BMP085(); for(;;) { Show_BMP085_Result(); }}/********************************************** 此头文件干脆包含全部基本组件,便于管理、调用**********************************************/#ifndef__CONFIG_H#define__CONFIG_H#include<stc12c5a60s2.h>#include<intrins.h>#include<math.h> #include"LCD12864drive.h"#include"displaydrive.h"#include"components.h"#include"i2cdrive.h"#include"bmp085drive.h"//typedefunsignedcharuchar;//typedefunsignedintuint;#endif/************************************************************************ 文件名:BMP085driver.c 函数功能:BMP085的基本操作函数 备注: 限制流程: 初始化(干脆读取内部11位eeprom数据) (1) 获得大气压强未补偿数据(发送限制指令-读取数据) (2) 获得当前气温值(发送限制指令-读取数据) (3) 获得海拔高度值(依据(2)(3)两步得到的数据计算出结果) (4) 获得海拔高度平均值(将(4)得到的数据分别放到10位数组中计算出平均值, 由于采纳了1进1出的计算方式,因此该数据具有较好的实时性及线性效果(5) 显示结果(通过lcd12864显示测量结果) (6) 重复执行步骤(2)(3)(4)(5)(6) ************************************************************************/#include"config.h" //定义传感器内部EEPROM存储单元里面11个值intidataAC1,AC2,AC3,B1,B2,MC,MD;unsignedintidataAC4,AC5,AC6;unsignedcharidataAltitudeTempFlag; //计算海拔高度运用到的数据标记intidataAltitudeTemp[10]={0,0,0,0,0,0,0,0,0,0}; //海拔高度的10个临时值,取平均值unsignedcharcodePressureTitle[16]={"气压温度测量"};unsignedcharidataShowPressure[16]={"气压:pa"};unsignedcharidataShowTemperature[16]={"温度:.℃"};unsignedcharidataShowAltitude[16]={"海拔:.米"};/****************************************************************函数名称:BMP085_Read_2Byte函数功能:从BMP085读出2字节数据入口参数:add //寄存器地址出口参数:读取的数据备注:*****************************************************************/ intBMP085_Read_2Byte(ucharadd){ ucharmsb,lsb; intdat;Start_I2c(); //起始信号Send_Byte(BMP085_ADDWR); //发送设备地址+写信号 if(ack==0)return(0);Send_Byte(add); //发送存储单元地址 if(ack==0)return(0); Start_I2c(); //重复起始信号Send_Byte(BMP085_ADDWR+1); //发送设备地址+读信号 if(ack==0)return(0);msb=RcvByte();Ack_I2c(0); //主机发送应答信号lsb=RcvByte(); Ack_I2c(1); //主机收到最终一张字节数据后发送非应答信号Stop_I2c(); //停止信号DelayMs(5);dat=msb<<8; dat|=lsb; returndat; //返回接受到的两字节数据}/****************************************************************函数名称:BMP085_Get_UT函数功能:读出未补偿的温度值入口参数:无出口参数:未补偿的温度值备注:*****************************************************************/longBMP085_Get_UT(void){Start_I2c(); //起始信号Send_Byte(BMP085_ADDWR); //发送设备地址+写信号Send_Byte(CTRL_REG_ADD); //writeregisteraddressSend_Byte(0X2E); //writeregisterdatafortempStop_I2c(); //发送停止信号 DelayMs(CONVERSION_TIME); //AD转换时间,温度最大转换时间为4.5ms return(long)BMP085_Read_2Byte(0xF6);}/****************************************************************函数名称:BMP085_Get_UP函数功能:读出未补偿的气压值入口参数:无出口参数:未补偿的气压值备注:*****************************************************************/longBMP085_Get_UP(void){ longpressure=0;Start_I2c(); //起始信号Send_Byte(BMP085_ADDWR); //发送设备地址+写信号Send_Byte(CTRL_REG_ADD); //writeregisteraddressSend_Byte(0X34); //低功耗模式指令Stop_I2c(); //发送停止信号 DelayMs(CONVERSION_TIME); //低功耗模式下气压最大转换时间为4.5ms pressure=BMP085_Read_2Byte(0xF6); pressure&=0x00FFFF; returnpressure; }/****************************************************************函数名称:Init_BMP085函数功能:初始化BMP085,读出内部标定参数入口参数:无出口参数:无备注: *****************************************************************/voidInit_BMP085(){ AC1=BMP085_Read_2Byte(0xAA); AC2=BMP085_Read_2Byte(0xAC); AC3=BMP085_Read_2Byte(0xAE); AC4=BMP085_Read_2Byte(0xB0); AC5=BMP085_Read_2Byte(0xB2); AC6=BMP085_Read_2Byte(0xB4); B1=BMP085_Read_2Byte(0xB6); B2=BMP085_Read_2Byte(0xB8);// MB=BMP085_Read_2Byte(0xBA); MC=BMP085_Read_2Byte(0xBC); MD=BMP085_Read_2Byte(0xBE);}/****************************************************************函数名称:BMP085_Get_Param函数功能:从BMP085读出转换后的温度或气压值入口参数:choice//bit选择读取温度或气压,当choice=0时,返回温度 当choice=1时,返回气压出口参数:temperature或pressure//long类型4字节备注:返回的温度值为0.1℃,调用时转换成1℃。气压值为Pa,调用时转换为hPa*****************************************************************/longBMP085_Get_Param(bitchoice){ longUT; longUP; longX1,X2,B5,B6,X3,B3,p; unsignedlongB4,B7; longtemperature; longpressure; UT=BMP085_Get_UT(); //读取未补偿的温度 UP=BMP085_Get_UP(); //读取未补偿的压强 X1=((long)UT-AC6)*AC5>>15; //依据芯片手册供应的公式计算补偿后的温度值 X2=((long)MC<<11)/(X1+MD); B5=X1+X2; temperature=(B5+8)>>4; if(choice==0) return(long)temperature; //返回温度值,0.1℃ B6=B5-4000; //依据芯片手册供应的公式计算补偿后的气压值 X1=(B2*(B6*B6>>12))>>11; X2=AC2*B6>>11; X3=X1+X2; B3=(((long)AC1*4+X3)+2)/4; X1=AC3*B6>>13; X2=(B1*(B6*B6>>12))>>16; X3=((X1+X2)+2)>>2; B4=(AC4*(unsignedlong)(X3+32768))>>15; B7=((unsignedlong)UP-B3)*(50000); if(B7<0x80000000) p=(B7*2)/B4; else p=(B7/B4)*2; X1=(p>>8)*(p>>8); X1=(X1*3038)>>16; X2=(-7357*p)>>16; pressure=p+((X1+X2+3791)>>4); return(long)pressure; //返回气压值,Pa}/****************************************************************函数名称:BMP085_Get_Altitude 函数功能:获得海拔高度值入口参数:无出口参数:altitude//int型2字节,当前海拔高度值备注: 返回的高度值单位为厘米,调用时再换算成带小数的以米为单位的高度值*****************************************************************/intBMP085_Get_Altitude(){ floatpressure; floataltitude; pressure=(float)BMP085_Get_Param(1); //获得气压值 altitude=44330*(1-pow(pressure/101325,1/5.255)); //依据芯片手册供应的公式计算海拔高度 altitude*=100; //转换成厘米单位的高度值,调用时再换算成带小数的高度值,提高精度 return(int)altitude;}/****************************************************************函数名称:ConvPressure() 函数功能:转换气压入口参数:无出口参数:无备注:将得到数据转化成lcd的数据,便于显示 *****************************************************************/voidConvPressure(){ longPressure; Pressure=BMP085_Get_Param(1); if(Pressure>=0)ShowPressure[5]='+'; else //假如海拔高度是一个负数,要先取反 { ShowPressure[5]='-'; Pressure=~Pressure; } ShowPressure[6]=Pressure/1000000+0x30; ShowPressure[7]=Pressure%1000000/100000+0x30; ShowPressure[8]=Pressure%100000/10000+0x30; ShowPressure[9]=Pressure%10000/1000+0x30; ShowPressure[11]=Pressure%1000/100+0x30; ShowPressure[12]=Pressure%100/10+0x30; ShowPressure[13]=Pressure%10+0x30;}/****************************************************************函数名称:ConvTemperature() 函数功能:转换气温入口参数:无出口参数:无备注:将得到数据转化成lcd的数据,便于显示 *****************************************************************/voidConvTemperature(){ intTemperature; Temperature=(int)BMP085_Get_Param(0); if(Temperature>=0)ShowTemperature[6]='+'; else //假如海拔高度是一个负数,要先取反 { ShowTemperature[6]='-'; Temperature=~Temperature; } ShowTemperature[8]=Temperature/10000+0x30; ShowTemperature[9]=Temperature%10000/1000+0x30; ShowTemperature[10]=Temperature%1000/100+0x30; ShowTemperature[11]=Temperature%100/10+0x30; ShowTemperature[13]=Temperature%10+0x30;}/****************************************************************函数名称:ConvAltitude() 函数功能:转换海拔高度入口参数:无出口参数:无备注:将得到数据转化成lcd的数据,便于显示 *****************************************************************/voidConvAltitude(){ longAltitude; //海拔高度 unsignedcharTempnum; //临时值 Altitude=BMP085_Get_Altitude(); if(Altitude>=0)ShowAltitude[6]='+'; else //假如海拔高度是一个负数,要先取反 { ShowAltitude[6]='-'; Altitude=~Altitude; }/**************取10次测量值的平均值作为测量结果,此算法存在记忆效果*************/ AltitudeTempFlag++; //标记自加 if(AltitudeTempFlag>=10)AltitudeTempFlag=0; AltitudeTemp[AltitudeTempFlag]=Altitude; //依据标记保存数据到数组 for(Tempnum=0;Tempnum<10;Tempnum++)Altitude+=AltitudeTemp[Tempnum]; //由于Altitude的值还保留着, //所以相加10个数之后应当除以11 Altitude/=11; //计算出平均值/*********************************************************************/ ShowAltitude[8]=Altitude/10000+0x30; ShowAltitude[9]=Altitude%10000/1000+0x30; ShowAltitude[10]=Altitude%1000/100+0x30; ShowAltitude[12]=Altitude%100/10+0x30; ShowAltitude[13]=Altitude%10+0x30;}/****************************************************************函数名称:Show_BMP085_Result() 函数功能:显示测量结果入口参数:无出口参数:备注: *****************************************************************/voidShow_BMP085_Result(){ ConvPressure(); //气压转换 ConvTemperature(); //气温转换 ConvAltitude(); //海拔转换 WordDisplay(1,0,PressureTitle,12); //气压温度测量 WordDisplay(0,1,ShowPressure,16); //气压 pa WordDisplay(0,2,ShowTemperature,16); //温度 C WordDisplay(0,3,ShowAltitude,16); //海拔 米}/******************************************************** 文件名:BMP085driver.h 函数功能:BMP085的基本操作函数 入口参数:iicdriver全部外部接口函数 (由于将显示结果函数也放在了该文件里面,所以还调用了WordDisplay(X,X,X,X)函数) 出口参数: Init_BMP085(); 传感器初始化 Show_BMP085_Result();显示测量结果 备注:*****************************************************************/#ifndef__BMP085_H__#define__BMP085_H__#defineucharunsignedchar#defineuintunsignedint#defineCONVERSION_TIME5 //定义最大转换时间为5ms#define BMP085_ADDWR0xee //定义传感器硬件写地址#defineCTRL_REG_ADD0xf4 //定义内部限制寄存器地址externvoidInit_BMP085(); //BMP085的初始化函数作为外部函数运用externvoidShow_BMP085_Result();#endif/**************************************** 本文件包含基本组件函数******************/#include"config.h"unsignedcharTaskFlag;/**************************************************** 功能:毫秒级别的延时函数 输入:延时毫秒的数值 输出:无*****************************************************///voidDelayMs(unsignedintms) //stc12c5a60s222.1184mhz//{ // unsignedinta,b,c;//for(c=ms;c>0;c--)//for(b=170;b>0;b--)//for(a=31;a>0;a--);//}voidDelayMs(unsignedintms)//stc89c5212.000mhz误差-0.651041666667us{unsignedinta,b; for(b=4*ms;b>0;b--) for(a=113;a>0;a--);}/**************************************************** 功能:多个任务之间相互交换 输入:微秒延时的数值 输出:无*****************************************************///voidDelay2Us(unsignedintus) //stc12c5a60s222.1184mhz//{//unsignedinta;//for(a=8*us;a>0;a--); //}voidDelay8Us(unsignedintus) //stc89c5212.000mhz{unsignedchara;for(a=us;a>0;a--);_nop_();//ifKeil,requireuseintrins.h }/********************************************************** 文件名:components.h 系统组件程序 功能说明:包含了常用的基本函数以及基本的输入输出接口 应用层次:底层系统组件**********************************************************//*****************编译预处理******************************/#ifndef__COMPONENTS_H#define__COMPONENTS_H/******************基本输入输出接口***********************/sbitKEY0=P1^5;/******************全局变量声明**********************//******************外部函数声明**********************/externvoidDelayMs(unsignedintms); //仅仅适用于stc12c5a60s222.1184mhz晶振externvoidDelay8Us(unsignedintus); //仅仅适用于stc12c5a60s222.1184mhz晶振#endif/*********************************************** 显示驱动文件************************************************/#include"config.h"unsignedcharcodeOnePiece[]={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,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,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,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,0x12,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDC,0x7F,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xFE,0x48,0x71,0xF1,0x1F,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x05,0xFF,0xFF,0xFE,0xFF,0xFE,0x18,0x50,0x03,0x3F,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x09,0x00,0x00,0x04,0x60,0x00,0x73,0xDE,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x00,0x02,0x20,0x00,0x42,0x0E,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x21,0x83,0xFF,0x04,0xFF,0xFF,0xF1,0xFC,0x0C,0x7F,0xE1,0xC0,0x03,0xC0,0x00,0x00,0x14,0xCF,0xFF,0xC9,0xFF,0xFF,0xF8,0xFE,0x1E,0x3F,0xE7,0xF0,0x0F,0x80,0x00,0x00,0x02,0x3F,0xFF,0xF2,0x7F,0xDF,0xF0,0xFF,0x3F,0xBF,0xE7,0xF8,0x3D,0x00,0x00,0x00,0x01,0x7F,0xFF,0xF4,0x7F,0xDF,0x38,0xFF,0x9F,0x3E,0x6F,0xF8,0x78,0x00,0x00,0x00,0x00,0xFF,0xFF,0xF8,0x7F,0xDE,0x08,0xE7,0x8E,0x3C,0x3F,0xFC,0xF0,0x00,0x00,0x00,0x00,0xFE,0x03,0xFC,0x7F,0xDE,0x00,0xE7,0x9F,0x38,0x1F,0x7C,0xE0,0x00,0x00,0x00,0x01,0xFC,0x00,0xFC,0x7F,0xDE,0x00,0xE7,0xBF,0xB8,0x1E,0x3D,0xE0,0x00,0x00,0x00,0x01,0xF0,0x00,0x7E,0x7F,0xDE,0x00,0xE7,0xFF,0xB8,0x1F,0x39,0xC0,0x00,0x00,0x00,0x03,0xF7,0xFF,0x7E,0x7F,0xDE,0x00,0xF7,0xFF,0xF8,0x1F,0x3F,0xC0,0x00,0x00,0x00,0x03,0xFF,0xFF,0xFF,0x7F,0xDE,0x00,0xE7,0xFF,0xF8,0x1F,0x7F,0x89,0x00,0x00,0x00,0x03,0xFC,0x01,0xFF,0x7F,0xDE,0x60,0xE7,0xFF,0xF8,0x9F,0x03,0x9B,0x80,0x00,0x00,0x07,0x1F,0xFF,0xE7,0x7F,0xDE,0xE0,0xE7,0xFF,0xBB,0x9F,0x03,0xFF,0xC0,0x00,0x00,0x04,0x20,0x00,0x11,0xFF,0xDF,0xC0,0xE7,0xBF,0xBF,0x9F,0x03,0xFF,0xC0,0x00,0x00,0x07,0xC7,0x07,0x1F,0xFF,0xDE,0xE0,0xE7,0xBF,0xB9,0x9F,0x03,0x9F,0xC0,0x00,0x00,0x03,0xCF,0x8F,0x9F,0x7F,0xDE,0x60,0xE7,0xBF,0xB8,0x8F,0x07,0x9F,0x80,0x00,0x00,0x03,0xEF,0xCF,0x9F,0x7F,0xDE,0x00,0xFF,0xBF,0xB8,0x1F,0x7F,0x87,0x80,0x00,0x00,0x03,0xEF,0xCF,0x9F,0x7F,0xDE,0x00,0xFF,0x1F,0x38,0x0F,0x3F,0xC7,0xC0,0x00,0x00,0x03,0xFF,0x8F,0xBE,0x7F,0xDE,0x00,0xFE,0x3F,0x38,0x0F,0x3F,0xC7,0xC0,0x00,0x00,0x03,0xF3,0x27,0x7E,0x7F,0xDE,0x00,0xF0,0x3F,0x38,0x0F,0x3D,0xE3,0xE0,0x00,0x00,0x01,0xF8,0x70,0xFE,0xFF,0xDE,0x00,0xE0,0x1E,0x38,0x0F,0x3C,0xE3,0xE0,0x00,0x00,0x00,0xFE,0x21,0xFC,0xFF,0xDE,0x08,0xF0,0x1E,0x3C,0x1F,0xFC,0xF7,0x00,0x00,0x00,0x00,0xFF,0x8F,0xF8,0xFF,0xDF,0x98,0xE0,0x0E,0x3E,0x2F,0xFC,0x7F,0x00,0x00,0x00,0x01,0x7F,0xFB,0xFC,0xFF,0xDF,0xF0,0xE0,0x0E,0x3F,0xEF,0xF8,0x3F,0x00,0x00,0x00,0x02,0x3F,0xFF,0xF2,0xFB,0xDF,0xF8,0xF0,0x1E,0x3F,0xE7,0xF0,0x0F,0x80,0x00,0x00,0x1C,0xDF,0xDF,0xC9,0xFB,0xFF,0xF9,0xF3,0x73,0xFF,0xE3,0xE0,0x1F,0xC0,0x00,0x00,0x20,0x9E,0x7B,0xE4,0x20,0x3F,0x00,0x0F,0x80,0x03,0xE0,0x00,0x1D,0x00,0x00,0x00,0x11,0xFF,0x07,0xFE,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x09,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x05,0xE0,0x00,0x1F,0xF8,0x00,0xFE,0x00,0x7F,0x00,0x3E,0x01,0xF0,0x00,0x00,0x00,0x07,0xE0,0x00,0x03,0xF0,0x00,0x7C,0x00,0x3F,0x00,0x0F,0x87,0xC0,0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x18,0x00,0x0C,0x00,0x07,0xFF,0x80,0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFE,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,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,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,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,/*D:\Documents\MyPictures\logoico\monochrome\onepiece12864.bmp*/};/********************************************************************************************************/unsignedcharcodeHaiZeiWang0[10]={"我是要成为"};unsignedcharcodeHaiZeiWang1[12]={"海贼王的男人"};unsignedcharcodeBlank[16]={""};/******************************************************************************************************/voidPictureDisplay(unsignedchar*Bmp){ unsignedchari,j; LCD_WCMD(Expand); //选择限制指令集为扩展指令 LCD_WCMD(0x34); //扩展指令集关闭显示 for(i=0;i<32;i++) { LCD_WCMD(0x80+i); LCD_WCMD(0x80); for(j=0;j<16;j++) LCD_WData(*Bmp++); } for(i=0;i<32;i++) { LCD_WCMD(0x80+i); LCD_WCMD(0x88); for(j=0;j<16;j++) LCD_WData(*Bmp++); } LCD_WCMD(0x36); //扩展指令集打开显示}/*********************************************** 功能:文字显示函数 形式参数格式规定: x轴位置,从左到右,以两个字符或一个汉字作为一格取值范围(0~7) y轴位置,从上倒下,以一个汉字作为一格,取值范围(0~3) 数组名称,将数组的值以指针形式访问 显示数量,将数组里面的指定数量的内容显示出来,取值范围(0~15)(事实上在程序内部已经防止了数据溢出,此处可以不上限)************************************************/voidWordDisplay(unsignedcharX,unsignedcharY,unsignedchar*Word,unsignedcharQuantity){ unsignedcharPos,i; LCD_WCMD(Normal); //选择限制指令为基本指令集 if(Quantity+2*X>=16)Quantity=16-2*X; if(Y==0)Y=0x80; elseif(Y==1)Y=0x90; elseif(Y==2)Y=0x88; elseif(Y==3)Y=0x98; Pos=X+Y; LCD_WCMD(Pos); for(i=0;i<Quantity;i++) { LCD_WData(*Word++); Delay8Us(50); }}voidDisplayLoading() //开机时候加载的一些小广告{ PictureDisplay(OnePiece); DelayMs(400); LCD_ClrPicture(); WordDisplay(1,1,HaiZeiWang0,10); WordDisplay(1,2,HaiZeiWang1,12); DelayMs(400); LCD_ClrWords();}#ifndef__DISPLAYDRIVE_H#define__DISPLAYDRIVE_H#ifdef__cplusplusextern"C"{#endifvoidPictureDisplay(unsignedchar*Bmp);externunsignedcharcodeOnePiece[];externunsignedcharcodeHaiZeiWang0[10];externunsignedcharcodeHaiZeiWang1[12];externunsignedcharcodeBlank[16];voidWordDisplay(unsignedcharX,unsignedcharY,unsignedchar*Word,unsignedcharQuantity);voidDisplayLoading();//voidGeneralMode();#ifdef__cplusplus}#endif#endif#include"config.h"bitack;/****************************************************************函数名称:Start_I2c函数功能:向I2c总线发出起始信号入口参数:无出口参数:备注:*****************************************************************/voidStart_I2c(){ SDA=1; _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SDA=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; _nop_(); _nop_();}/****************************************************************函数名称:Stop_I2c函数功能:向I2c总线发出终止信号入口参数:无出口参数:备注:*****************************************************************/voidStop_I2c(){ SDA=0;/*发送结束条件的数据信号*/ _nop_();/*发送结束条件的时钟信号*/ SCL=1;/*结束条件建立时间大于4μs*/ _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SDA=1;/*发送I2C总线结束信号*/ _nop_(); _nop_(); _nop_(); _nop_(); SCL=0;}/****************************************************************函数名称:Ack_I2c函数功能:向I2c总线发出应答信号入口参数:无出口参数:备注: 输入0则表示应答,输入1则表示非应答*****************************************************************/voidAck_I2c(bita){ if(a==0)SDA=0;/*在此发出应答或非应答信号*/ elseSDA=1; _nop_(); _nop_(); _nop_(); SCL=1; _nop_(); _nop_();/*时钟低电平周期大于4μs*/ _nop_(); _nop_(); _nop_(); SCL=0;/*清时钟线,钳住I2C总线以便接着接收*/ _nop_(); _nop_(); if(a==0)SDA=1;/*在此发出应答或非应答信号*/ elseSDA=0;}/****************************************************************函数名称:Send_Byte函数功能:发送一字节数据入口参数:dat//要发送的8位数据出口参数:ack//应答信号备注:*****************************************************************/unsignedcharSend_Byte(unsignedcharData){ unsignedcharBitLong; for(BitLong=0;BitLong<8;BitLong++)/*要传送的数据长度为8位*/{ SDA=(bit)(Data&0x80); _nop_(); SCL=1;/*置时钟线为高,通知被控器起先接收数据位*/ _nop_(); _nop_();/*保证时钟高电平周期大于4μs*/ _nop_(); _nop_(); _nop_(); SCL=0; Data<<=1; } _nop_();_nop_();SDA=1;/*8位发送完后释放数据线,打算接收应答位*/_nop_();_nop_();SCL=1;_nop_();_nop_();_nop_();if(SDA==1)ack=0; elseack=1;/*推断是否接收到应答信号*/SCL=0;_nop_();_nop_(); returnack;}/****************************************************************函数名称:Rcv_Byte函数功能:接收一字节数据入口参数:无出口参数:dat//将接收到出来的一字节数据赋给dat变量,并返回dat备注:*****************************************************************/unsignedcharRcvByte(){ unsignedcharData; unsignedcharBitLong; Data=0; SDA=1;/*置数据线为输入方式*/ for(BitLong=0;BitLong<8;BitLong++) {SCL=1;/*置时钟线为高使数据线上数据有效*/_nop_();_nop_();Data<<=1; Data|=SDA;//if(SDA==1)Data=Data+1;/*读数据位,接收的数据位放入Data中*/_nop_(); _nop_(); SCL=0; _nop_(); _nop_(); } SCL=0; _nop_(); _nop_(); return(Data);}#ifndef__I2CDRIVE_H__#define__I2CDRIVE_H__sbitSCL=P1^0;sbitSDA=P1^1;externbitack;voidStart_I2c();voidStop_I2c();voidAck_I2c(bita); //输入0则表示应答,输入1则表示非应答voidNoAck_I2c();unsignedcharSend_Byte(unsignedchardat);unsignedcharRcvByte();#endif#include"config.h"/******************************************** 功能:液晶的繁忙状态监测,假如液晶处于繁忙,则无法操作 输入:无 输出:位型的繁忙标记信息********************************************/bitLCD_BusyTest(){ bitResult; LCD_RS=Choose_CMD; LCD_RW=Read; LCD_EN=Active; Delay8Us(1); Result=(bit)(LCD_DataPort&0x80); LCD_EN=Inactive; return(Result);}/********************************************** 功能:液晶的写指令操作函数 输入:液晶的限制指令 输出:无*********************************

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论