历史上的今天
返回首页

历史上的今天

今天是:2025年01月08日(星期三)

正在发生

2018年01月08日 | 10位温度传感器AD7416驱动程序

2018-01-08 来源:eefocus

#include "reg51.h" 
#include "intrins.h"  


sbit AD7416_SCL= P1^6; 
sbit AD7416_SDA= P1^7; 

unsigned char AD7416_SystemError; 
unsigned int Temperature; //温度 

unsigned char ZorF; //正还是负 

//#define SomeNOP(); { _nop_(); _nop_(); _nop_();_nop_();_nop_();_nop_(); 
_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_(); _nop_();_nop_();_nop_(); 
_nop_(); _nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_(); _nop_();_nop_(); 
_nop_();_nop_(); _nop_(); _nop_();_nop_();} 


//延时函数 
AD7416_delay() 

unsigned int i=60; 
while(i--); 

/*-------------------------------------------------------------------------------- 
调用方式:void AD7416_I2CStart(void) ﹫2001/07/0 4 
函数说明:私有函数,I2C专用 
---------------------------------------------------------------------------------*/ 
void AD7416_I2CStart(void) 

EA=0; 
AD7416_SDA=1; AD7416_SCL=1; AD7416_delay();//INI 
AD7416_SDA=0; AD7416_delay();//START 
AD7416_SCL=0; AD7416_delay(); 


/*-------------------------------------------------------------------------------- 
调用方式:void AD7416_I2CStop(void) ﹫2001/07/0 4 
函数说明:私有函数,I2C专用 
---------------------------------------------------------------------------------*/ 
void AD7416_I2CStop(void) 

AD7416_SCL=0; AD7416_SDA=0; AD7416_delay();//INI 
AD7416_SCL=1; AD7416_delay();//STOP 
EA=1; 


/*-------------------------------------------------------------------------------- 
调用方式:I2CAck(void) ﹫2001/07/0 4 
函数说明:私有函数,I2C专用,等待从器件接收方的应答 
ACK BY AD7416 
---------------------------------------------------------------------------------*/ 
AD7416_WaitAck(void) 

unsigned char errtime=255;//因故障接收方无ACK,超时值为255。 
AD7416_SDA=1;AD7416_delay(); 
AD7416_SCL=1;AD7416_delay(); 
AD7416_SystemError=0x10; 
while(AD7416_SDA) 
{ errtime--; 
if(!errtime) 
{ AD7416_I2CStop(); 
AD7416_SystemError=0x11; 
return; 


AD7416_SCL=0; AD7416_delay(); 

/*-------------------------------------------------------------------------------- 
调用方式:void SenDACk(void) ﹫2001/07/0 4 
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。 
---------------------------------------------------------------------------------*/ 
void AD7416_SendNotAck(void) 

AD7416_SDA=1; AD7416_delay(); 
AD7416_SCL=1; AD7416_delay(); 
AD7416_SCL=0; AD7416_delay(); 

/*-------------------------------------------------------------------------------- 
调用方式:void I2CSend(unsigned char ch) ﹫2001/07/0 5 
函数说明:私有函数,I2C专用 
---------------------------------------------------------------------------------*/ 
void AD7416_I2CSendByte(unsigned char ch) 

unsigned char i=8; 
while(i--) 

AD7416_SCL=0;_nop_(); AD7416_delay(); 
AD7416_SDA=(bit)(ch&0x80); ch<<=1; AD7416_delay(); 
AD7416_SCL=1; AD7416_delay(); 

AD7416_SCL=0; AD7416_delay(); 

/*-------------------------------------------------------------------------------- 
调用方式:unsigned char I2CReceive(void) ﹫2001/07/0 5 
函数说明:私有函数,I2C专用 
---------------------------------------------------------------------------------*/ 
unsigned char AD7416_I2CReceiveByte(void) 

unsigned char i=8; 
unsigned char dat=0; 
AD7416_SDA=1; 
while(i--) 

dat<<=1; 
AD7416_SCL=0;AD7416_delay(); 
AD7416_SCL=1;AD7416_delay(); 
dat|=AD7416_SDA; 

AD7416_SCL=0; AD7416_delay(); 
return(dat); 

//////////////////////////////////////////////////////////////////////////////////////////// 
/*-------------------------------------------------------------------------- 
ACK BY MASTER 有CPU给传感器一个低,所以这个ACK是来自CPU的。 
---------------------------------------------------------------------------*/ 
AD7416_bitout() 

AD7416_SDA=0; AD7416_delay(); 
AD7416_SCL=0; AD7416_delay(); 
AD7416_SDA=0; AD7416_delay(); 
AD7416_SCL=1; AD7416_delay(); 
AD7416_SCL=0; AD7416_delay(); 



//读温度传感器 
/*---------------------------------------------------------------------------------------------------- 
温度值寄存器是一个16位只读寄存器,它的高10位以2的补码格式储存由AD转换器送来的10位温度读 
数。位5至0未用 
-128℃ 10 0000 0000 
-125℃ 10 0000 1100 
-100℃ 10 0111 0000 
-75℃ 10 1101 0100 
-50℃ 11 0011 1000 
-25℃ 11 1001 1100 
-0.25℃ 11 1111 1111 
0℃ 00 0000 0000 
+0.25℃ 00 0000 0001 
+10℃ 0 0001 01000 
+25℃ 0 0011 00100 
+50℃ 0 0110 01000 
+75℃ 0 1001 01100 
+100℃ 0 1100 10000 
+125℃ 0 1111 10100 
+127℃ 0 1111 11100 
-----------------------------------------------------------------------------------------------------*/ 
Read7416(unsigned char address) 

unsigned char h,l,temp,c; 
unsigned int wendu; 

AD7416_I2CStart(); 
AD7416_I2CSendByte(address); //写 
AD7416_WaitAck(); 
AD7416_I2CSendByte(0x00); //指向温度寄存器 
AD7416_SendNotAck(); 
AD7416_I2CStop(); 

AD7416_I2CStart(); 
AD7416_I2CSendByte(address+1); //读 
AD7416_WaitAck(); 
h=AD7416_I2CReceiveByte(); //读高8位 
AD7416_bitout(); //CUP送低 
l=AD7416_I2CReceiveByte(); //读低8位 
AD7416_SendNotAck(); 
AD7416_I2CStop(); 

c=2; //循环两次 
wendu=h;temp=l; 
//将高8位和低8位的前2位连接 
while(c--) 

if(temp&0x80) 

wendu<<=1; 
wendu|=0x0001; 

else 

wendu<<=1; 


//判断温度正负 
if(h&0x80) //负 

wendu=wendu-0x01; 
wendu=~wendu; //变回原码 
wendu=wendu&0x03FF; 
wendu=wendu*0.25; 
Temperature=wendu; 
ZorF=0; 

else //正 

wendu=wendu*0.25; 
Temperature=wendu; 
ZorF=1; 





//设定7416的OTI和HYST 
/*---------------------------------------------------------------------------- 
OTI为上限 HYST为下限 
7416做为恒温器使用 OTI必须低有效。当温度高于OTI值时由OTI脚发出低,直到温度低于 
HYST值OTI脚才发出高。 
-----------------------------------------------------------------------------*/ 
Setup7416OTI(unsigned char OTI,unsigned char HYST,unsigned char address) 


unsigned char a,b; 

a=OTI; //温度转换 
a=a*4; 
a>>=2; 

b=HYST; //温度转换 
b=b*4; 
b>>=2; 

AD7416_I2CStart(); 
AD7416_I2CSendByte(address); //写 
AD7416_WaitAck(); 
AD7416_I2CSendByte(0x01); //指向状态寄存器 
AD7416_WaitAck(); 
AD7416_I2CSendByte(0x18); 
AD7416_SendNotAck(); 
AD7416_I2CStop(); 

AD7416_I2CStart(); 
AD7416_I2CSendByte(address); //写 
AD7416_WaitAck(); 
AD7416_I2CSendByte(0x03); //指向OTI存器 
AD7416_WaitAck(); 
AD7416_I2CSendByte(a); //送温度高8位 
AD7416_WaitAck(); 
AD7416_I2CSendByte(0x00); //送温度低8位 
AD7416_SendNotAck(); 
AD7416_I2CStop(); 


AD7416_I2CStart(); 
AD7416_I2CSendByte(address); //写 
AD7416_WaitAck(); 
AD7416_I2CSendByte(0x02); //指向HYST寄存器 
AD7416_WaitAck(); 
AD7416_I2CSendByte(b); //送温度高8位 
AD7416_WaitAck(); 
AD7416_I2CSendByte(0x00); //送温度低8位 
AD7416_SendNotAck(); 
AD7416_I2CStop(); 


推荐阅读

史海拾趣

Ho Chien Electronics Group Inc公司的发展小趣事

Ho Chien Electronics Group Inc公司发展故事

故事一:创立与全球化布局

Ho Chien Electronics Group Inc.(以下简称“Ho Chien”)创立于1974年,其全球总部位于美国波士顿。自成立以来,Ho Chien迅速在全球范围内扩展其业务,先后在中国、新加坡、德国、巴西、加拿大和墨西哥等地设立了超过40个分部。这一布局不仅加强了公司的市场渗透力,还为其提供了丰富的资源支持,助力其在电子行业细分市场中稳步前行。Ho Chien特别专注于互连与机电产品领域,通过为原始设备制造商和合约制造商提供高质量的产品和服务,逐步在行业内建立了良好的声誉。

故事二:亚太市场的拓展

2012年12月,Ho Chien正式启动其亚太业务,并将亚太区总部设在香港。为了更好地服务亚太地区的客户,Ho Chien不仅设立了销售部,还构建了区域配送中心和增值服务中心。经过数年的努力,Ho Chien亚太区已开设24个分部和3处仓库,极大地提升了其在该地区的运营效率和服务质量。这一举措不仅加深了Ho Chien在亚太市场的影响力,还为其未来的全球扩张奠定了坚实的基础。

故事三:产品线的丰富与拓展

Ho Chien致力于为电子行业各细分市场的客户提供全面支持,其产品线涵盖了25个不同元器件类别。主要分销产品包括互连器件、继电器、风扇、开关、散热解决方案、套管和线束产品、晶体与振荡器、紧固件与五金件以及传感器等。随着市场的不断变化和技术的飞速发展,Ho Chien不断调整和优化其产品线,以满足客户日益增长的需求。这一策略不仅帮助Ho Chien保持了其在行业内的竞争力,还为其带来了稳定的收入来源。

故事四:创新与研发

作为电子行业的领军企业之一,Ho Chien深知创新对于公司发展的重要性。因此,公司不断加大在研发方面的投入,致力于新技术、新产品的开发和应用。通过引进先进的研发设备和优秀人才,Ho Chien在多个领域取得了重大突破,并成功推出了一系列具有自主知识产权的产品。这些创新成果不仅提升了Ho Chien的品牌价值,还为其在全球市场上的拓展提供了有力支持。

故事五:人才培养与企业文化

在快速发展的过程中,Ho Chien深刻认识到人才对于公司持续发展的关键作用。因此,公司始终坚持“以员工为中心”的管理思想,努力为员工创造宽松的工作氛围和良好的发展机会。Ho Chien不仅提供优厚的福利待遇和丰富的培训资源,还鼓励员工积极发挥自己的才华和潜能。在这种企业文化的影响下,Ho Chien汇聚了一大批优秀的专业人才和管理精英,为公司的快速发展提供了强有力的智力支持。同时,这种积极向上的企业文化也进一步提升了Ho Chien的品牌形象和社会影响力。

Adafruit公司的发展小趣事

Adafruit Industries是一家总部位于美国纽约的开源硬件公司,致力于设计和制造创意电子产品。以下是该公司发展的五个相关故事:

  1. 公司创立与初期阶段: Adafruit Industries由Limor Fried于2005年创立,起初是一个个人项目。Limor Fried(也被称为Ladyada)是一位热衷于开源硬件和电子制作的工程师,她在创办Adafruit之前就已经是开源硬件社区的活跃成员。最初,Adafruit专注于销售自制的电子配件和模块,并提供相关的教育资源和项目指南。

  2. 开源文化的推动者: Adafruit是开源硬件运动的积极推动者之一,致力于促进开源硬件的发展和普及。公司提倡知识共享和技术开放,通过在GitHub上发布开源硬件项目和提供详细的教程,鼓励更多人参与到电子制作和创客活动中来。

  3. 产品线的不断扩展: 随着市场需求的增长和公司规模的扩大,Adafruit逐渐扩展了产品线,涵盖了各种电子配件、传感器、开发板等。公司还推出了一系列DIY电子套件,旨在帮助用户学习电子制作和编程技能。Adafruit的产品以其高品质和易用性而著称,受到了全球创客和电子爱好者的青睐。

  4. 教育和社区建设: Adafruit积极参与教育和社区建设工作,通过在线教程、视频教程、工作坊等方式,向学生和爱好者传授电子知识和技能。公司还定期举办各种活动和比赛,鼓励创客社区的互动和交流,推动创新和创意的产生。

  5. 持续创新和发展: 作为一家持续创新的公司,Adafruit不断推出新产品和解决方案,不断满足客户不断增长的需求。公司还与各种组织和机构合作,推动开源硬件的发展和应用,努力成为开源硬件领域的领先者和推动者。随着时间的推移,Adafruit将继续秉承其开源和创新的精神,为全球创客社区带来更多的惊喜和机会。

Black Box Corporation公司的发展小趣事

为了进一步扩大市场份额,Black Box积极寻求与全球各地的企业合作。通过与跨国公司的战略合作,Black Box不仅获得了先进的技术和管理经验,还成功打开了多个国际市场。同时,公司也在全球范围内设立了多个分公司和办事处,以便更好地服务当地客户。这一系列的全球扩张行动使Black Box成为了真正意义上的国际企业。

Global Power Technology Co., Ltd公司的发展小趣事
首先拔掉电源插头,确保安全;然后取出冰箱内的食物和储物盒,用温水和中性洗涤剂清洗冰箱内部和外部;最后用干净的布擦干冰箱,确保没有残留水分。
长江微电(cjiang)公司的发展小趣事

为了进一步扩大市场份额和品牌影响力,长江微电积极寻求与业内知名分销商的合作。基于对世强先进O2O技术分销模式的信赖与认可,长江微电与世强先进(深圳)科技股份有限公司签署了授权代理协议。双方将携手合作,共同为用户提供车规级电感、车规级耦合电感等全线产品。这一合作不仅丰富了世强硬创平台电子元器件产品的品类及信息,也为长江微电的市场拓展提供了有力支持。

Danaher Corporation公司的发展小趣事

丹纳赫集团一直重视科技创新和产品研发。在电子行业,丹纳赫集团不断推出具有创新性和竞争力的产品,如高精度测量仪器、自动化测试设备和电子制造解决方案等。这些产品不仅满足了客户对高质量、高效率生产的需求,还帮助丹纳赫集团在电子行业中树立了良好的品牌形象。

问答坊 | AI 解惑

关于上传附件的建议

建议大家在附件后面多贴点信息,比如将文档的前言、目录贴上来。这样方便大家选择是否需要下载。…

查看全部问答>

ZigBee和Wi-Fi合作发展智能电网无线网络

ZigBee® Alliance和Wi-Fi Alliance®今天宣布双方达成一项协议,双方将在针对智能电网应用的无线家庭局域网络(HAN)领域开展合作。合作最初的重点将是ZigBee Smart Energy 2.0,即面向智能电网家庭的新一代能源管理协议,其基础则是当今颇为 ...…

查看全部问答>

请教工程师:集成24位ADC的CPU

现在想用一款集成24位AD的CPU,做一个高精度的电子秤,工业测量用的。准备做成亚当模块的样子。   我上ADI官方网站查过好像7060还可以,但是好像国内不好买不到片子,而且价钱很贵。51内核的倒是有24位的,只是好久不用51了,不知道开发起来 ...…

查看全部问答>

关于摄像头的两个缓冲区

在三星6410BSP中,有个OV9650的摄像头模组驱动代码,在s3c6410_camera.h中有对于两个缓冲区的定义:一个是用来捕捉静态及动态视频的,一个是用于预览的。 #define MAX_HW_FRAMES               &nbs ...…

查看全部问答>

关于wince5.0设备和wince5.0模拟器上网问题

我的wince设备通过同步软件与电脑同步,用usb连接,应该怎么设置可以让设备上网啊?很着急,现在做了个wince的模拟器在vs2005下,应该怎样设计让模拟器也能上网啊,希望大侠们帮助我这个新手啊 …

查看全部问答>

测量摆的倾斜角度

  希望大家多给建议:        我想测量一个垂直的摆的倾斜角度,倾斜到一定角度就报警。该怎么设计呢?…

查看全部问答>

初学的疑惑:windows xp embedded 开发

请问,通过VS2005怎样开发基于特定设备(windows xp embedded)的应用? 这两天刚开始了解嵌入式开发,初步印象是,windows embedded 包括windows ce和windows xp embedded两种操作系统;而VS2005中的Mobille和phone是基于windows ce系统的集成开发 ...…

查看全部问答>

为什么产生错误Fixing up unaligned userspace access

要把很多.ko文件加载到目标板上,用一个loadmod.sh文件来实现,里面包括了insmod、mknod等必要的命令等等,但每次source loadmod.sh之后,大多会出现如下错误提示 Fixing up unaligned userspace access in \"sh\" pid=25 pc=0x0042ee94 ins=0x624 ...…

查看全部问答>

新手请教一个驱动程序安装的问题

{4d36e97d-e325-11ce-bfc1-08002be10318}…

查看全部问答>

请教牛人:如何使用stm32的两路ADC

stm32中有3个ADC模块,我们使用ADC1的设置如下: ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;   ADC_InitStructure.ADC_ScanConvMode = ENABLE;   ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; &nbs ...…

查看全部问答>