历史上的今天
返回首页

历史上的今天

今天是:2024年10月30日(星期三)

正在发生

2020年10月30日 | 51单片机BMP280气压和温度值测试程序

2020-10-30 来源:51hei

单片机源程序如下:

#include"bmp280.h"

unsigned short xdata dig_t1,dig_p1;                                                                                                                         //注意数据类型

signed short xdata dig_t2,dig_t3,dig_p2,dig_p3,dig_p4,dig_p5,dig_p6,dig_p7,dig_p8,dig_p9;

long signed int xdata bmp280_ut,bmp280_up;

long signed int xdata t_fine;

void bmpreaddata()           //原始压力温度数据突发读取

{

   uchar xdata n,temp=0x09,address=0xf7;

   long unsigned int xdata readdata0[6];                //注意数据类型

   i2cstart();

   i2csendbyte(0xec,1);

   i2csendbyte(0xf4,1);

   i2csendbyte(0x55,1);

   i2cstop();

   delay10ms(10);

   while(temp!=0)

   {

      temp=0x09;

      i2cstart();

          i2csendbyte(0xec,1);

          i2csendbyte(0xf3,1);

          i2cstop();

          i2cstart();

          i2csendbyte(0xed,1);

          temp&=i2creadbyte(1);

          i2cstop();

   }

   i2cstart();

   i2csendbyte(0xec,1);

   i2csendbyte(address,1);

   i2cstop();

   i2cstart();

   i2csendbyte(0xed,1);

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

   {     

      if(n<5)

          {

             readdata0[n]=i2creadbyte(0);

          }

          else

          {

             readdata0[n]=i2creadbyte(1);

          }

   }

   i2cstop();

   bmp280_up=(readdata0[0]<<12)|(readdata0[1]<<4)|(readdata0[2]>>4);

   bmp280_ut=(readdata0[3]<<12)|(readdata0[4]<<4)|(readdata0[5]>>4);        

}

void bmpreset()

{

   i2cstart();

   i2csendbyte(0xec,1);

   i2csendbyte(0xe0,1);

   i2csendbyte(0xb6,1);                   //软复位

   i2cstop();

}

void bmpconfig()

{

   i2cstart();

   i2csendbyte(0xec,1);

   i2csendbyte(0xf5,1);

   i2csendbyte(0x00,1);                  //强制模式无待机时间,关滤波,禁用3线模式

   i2cstop();

   i2cstart();

   i2csendbyte(0xec,1);

   i2csendbyte(0xf4,1);

   i2csendbyte(0x55,1);                  //压力16倍,温度2倍过采样,转换时间最大43MS,强制模式

   i2cstop();

}

void readtrimming()                      //补偿参数单字节读取

{

   uchar xdata n,address=0x88;

   uchar xdata readdata[24];

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

   {

          i2cstart();

      i2csendbyte(0xec,1);

      i2csendbyte(address,1);

      i2cstop();

      i2cstart();

      i2csendbyte(0xed,1);

          if(n<23)

          {

             readdata[n]=i2creadbyte(0);

          }

          else

          {

             readdata[n]=i2creadbyte(1);

          }

          i2cstop();

          address++;

   }

   dig_t1=(readdata[1]<<8)|(readdata[0]);

   dig_t2=(readdata[3]<<8)|(readdata[2]);

   dig_t3=(readdata[5]<<8)|(readdata[4]);

   dig_p1=(readdata[7]<<8)|(readdata[6]);

   dig_p2=(readdata[9]<<8)|(readdata[8]);

   dig_p3=(readdata[11]<<8)|(readdata[10]);

   dig_p4=(readdata[13]<<8)|(readdata[12]);

   dig_p5=(readdata[15]<<8)|(readdata[14]);

   dig_p6=(readdata[17]<<8)|(readdata[16]);

   dig_p7=(readdata[19]<<8)|(readdata[18]);

   dig_p8=(readdata[21]<<8)|(readdata[20]);

   dig_p9=(readdata[23]<<8)|(readdata[22]);

}

uchar bmpid()

{

   uchar xdata id;

   i2cstart();

   i2csendbyte(0xec,1);

   i2csendbyte(0xd0,1);

   i2cstop();

   i2cstart();

   i2csendbyte(0xed,1);

   id=i2creadbyte(1);

   i2cstop();

   return id;

}

long signed int tempcal(long signed int adc_t)                  //c51单片机不支持64位整数,使用简化计算

{

   long signed int var1,var2,t;

   var1=((((adc_t>>3)-((long signed int)dig_t1<<1)))*((long signed int)dig_t2))>>11;

   var2=(((((adc_t>>4)-((long signed int)dig_t1))*((adc_t>>4)-((long signed int)dig_t1)))>>12)*((long signed int)dig_t3))>>14;

   t_fine=var1+var2;

   t=(t_fine*5+128)>>8;

   return t;

}

long unsigned int presscal(long signed int adc_p)

{

   long signed int var1,var2;

   long unsigned int p;

   var1=(((long signed int)t_fine)>>1)-(long signed int)64000;

   var2=(((var1>>2)*(var1>>2))>>11)*((long signed int)dig_p6);

   var2=var2+((var1*((long signed int)dig_p5))<<1);

   var2=(var2>>2)+(((long signed int)dig_p4)<<16);

   var1=(((dig_p3*(((var1>>2)*(var1>>2))>>13))>>3)+((((long signed int)dig_p2)*var1)>>1))>>18;

   var1=((((32768+var1))*((long signed int)dig_p1))>>15);

   if(var1==0)

   {

      return 0;

   }

   p=(((long unsigned int)(((long signed int)1048576)-adc_p)-(var2>>12)))*3125;

   if(p<0x80000000)

……………………


推荐阅读

史海拾趣

CHONGQING PINGYANG ELECTRONICS CO.,LTD.公司的发展小趣事

重庆平洋电子有限公司,自其1998年3月创立之初,便扎根于重庆这片热土,开始了其在电子行业的探索之旅。当时,电子行业正处于快速发展的阶段,市场竞争激烈。然而,公司凭借对市场的敏锐洞察和对技术的执着追求,成功研发出多款电子元器件,逐渐在市场中站稳脚跟。

HDK(北陆电气)公司的发展小趣事

随着公司的发展,技术创新成为推动重庆平洋电子有限公司不断前进的重要动力。公司不断加大对研发的投入,引进高端人才,积极研发新技术、新产品。经过多年的努力,公司在电子元器件领域取得了重大突破,产品性能和质量得到了显著提升,赢得了市场的广泛认可。

Essentra Components公司的发展小趣事

面对日益激烈的市场竞争,Essentra Components公司决定实施全球化战略,以拓展更广阔的市场。公司先后在亚洲、欧洲、美洲等多个地区设立了生产基地和销售服务点,实现了产品的全球覆盖。同时,公司还积极与当地企业合作,共同开发适合当地市场需求的产品,进一步巩固了其在全球市场的地位。

ECLIPSE公司的发展小趣事

随着Eclipse项目的不断发展,越来越多的知名公司加入到这一开源社区中,如Oracle、Red Hat等。这些公司不仅为Eclipse贡献了代码,还提供了资金支持。Eclipse的功能日益完善,逐渐成为了Java开发领域的佼佼者。同时,Eclipse也支持其他编程语言,如C/C++、Python等,进一步扩大了其用户群体。

BAHCO公司的发展小趣事

随着全球化趋势的加速推进,BAHCO也在积极拓展全球市场。目前,公司已在多个国家和地区设立了分支机构或销售网络,实现了全球范围内的业务覆盖。未来,BAHCO将继续加大在研发、生产、销售等方面的投入力度,不断提升产品质量和服务水平。同时,公司还将积极探索新的商业模式和合作方式,以适应不断变化的市场环境并实现可持续发展。

这些故事虽然不直接涉及BAHCO在电子行业的发展,但它们展示了BAHCO在工具制造领域的辉煌历程和不断进取的精神。作为一家拥有百年历史的知名企业,BAHCO凭借其卓越的品质、创新精神和全球市场布局,成功地在工具制造业中占据了重要地位。未来,随着技术的不断进步和市场需求的不断变化,相信BAHCO将继续保持其领先地位并迎来更加美好的发展前景。

DuPont公司的发展小趣事

为了进一步拓展电子市场,DuPont公司积极寻求与全球知名电子企业的合作。通过与国际知名品牌的战略合作,DuPont成功进入了多个重要的电子市场领域,如智能手机、平板电脑、汽车电子等。这些合作不仅为DuPont公司带来了广阔的市场空间,也促进了公司在电子领域的技术创新和产品升级。

问答坊 | AI 解惑

一个DSP高手成长之路

我是已经从事DSP开发有几年了,看到许多朋友对DSP的开发非常感兴取,我结合这几年对DSP的开发写一写自己的感受,一家之言,欢迎指教。我上研究生的第一天起根据老板的安排就开始接触DSP,那时DSP开发在国内高校刚刚开始,一台DSP开发器接近一万还是 ...…

查看全部问答>

跪求大学生电子创新设计 简单点就行大侠帮忙

刚做完电工实习 要修做一个电子创新设计 我实在是弄不出来了 向高手求助 在线等 希望会的大侠速度 谢谢谢谢…

查看全部问答>

嵌入式linux启动信息完全注释

摘要 我们在这里讨论的是对嵌入式linux系统的启动过程的输出信息的注释,通过我们的讨论,大家会对嵌入式linux启动过程中出现的、以前感觉熟悉的、但却又似是而非的东西有一个确切的了解,并且能了解到这些输出信息的来龙去脉。 嵌入式linux的启 ...…

查看全部问答>

电子钟程序问题

#include #define uchar unsigned char #define ON 0 #define OFF 1 sbit buzz=P2^1; sbit key_1=P1^0; sbit key_2=P1^1; sbit key_3=P1^2; sbit key_4=P1^3; uchar display_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}, ...…

查看全部问答>

兩小段code

關於TI所提供的例程內,有這兩段CODE 但卻不是很能理解 第一段 ------------------------------------------------------------------------------------------------------------------- extern Uint16 *RamfuncsLoadStart, *RamfuncsLoadEnd, ...…

查看全部问答>

VHDL编程问题,请高手指点一二

我就想做一个16位的自动清零计数器,有一个门阈值信号作为使能和清零,我是想先让这个使能信号的上升沿完成对计数器清零的工作,然后在这个使能信号的高电平时计数器开始工作计数;每次使能信号过来先对计数器自动清零,然后计数     ...…

查看全部问答>

那位懂LIERDA 的 S2E21 板子啊,程序没有了,怎么也搞不好

那位懂LIERDA 的 S2E21 板子啊,程序没有了,怎么也搞不好,网上查了,BOOT 和程序要分开,BOOT 在0到3FF,程序在0X1000后面,但用LM 的烧写软件,怎么烧写都没有用,软件用的是 KEIL ARM ,不知道还有什么地方要注意的,谢谢,…

查看全部问答>

设计一个输入AC220V,输出DC24V,20W的开关电源

各位大侠请帮忙,开关电源要过认证的,帮忙推荐下!谢谢! …

查看全部问答>

关于IAR单步调试出错问题

最近用IAR调试MSP430,在单步调试的时候经常会出现下面的情况,具体为:在修改后重新编译下载,IAR仿真的仍为未修改前的情况 IAR仿真的时候,跳转到已经被注释掉了的代码 请问如何解决这个情况,实在是困惑。谢谢大家 …

查看全部问答>

AVR MCU可否自己重新定义一个I/O口的名称啊

AVR MCU可否自己重新定义一个I/O口的名称啊,用汇编要如何操作。 …

查看全部问答>