完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本人刚开始接触MSP430,用的是launchpad 也就是g2553。现在想用AD7416温度传感器做一个温度测量系统,用的是IAR编程。因为刚开始接触所以有的还是不懂,现在在网上找了个AD7416的C51的编程,希望大神帮我看看怎么改成430的编程啊??麻烦各位了
//注意要根据不同的情况来减少延时的个数 关于里面的内容我基本可以理解了,可是不知道怎么改谢谢大家了 #include reg51.h" #include "intrins.h" ***it AD7416_SCL= P1^6; ***it 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) 函数说明:私有函数,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) 函数说明:私有函数,I2C专用 ---------------------------------------------------------------------------------*/ void AD7416_I2CStop(void) { AD7416_SCL=0; AD7416_SDA=0; AD7416_delay();//INI AD7416_SCL=1; AD7416_delay();//STOP EA=1; } /*-------------------------------------------------------------------------------- 调用方式:I2CAck(void) 函数说明:私有函数,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) 函数说明:私有函数,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) 函数说明:私有函数,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) 函数说明:私有函数,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(); } |
|
相关推荐
4个回答
|
|
是只要改硬件的接口?还是里面那些指令啥的都用不了???
|
|
|
|
有没有大神指点一下的啊~!!!!!!!
|
|
|
|
代做 1002925094
|
|
|
|
我也不会 ,过来看看
|
|
|
|
只有小组成员才能发言,加入小组>>
3032个成员聚集在这个小组
加入小组2928 浏览 1 评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3600 浏览 2 评论
请问怎么把下面51单片机的代码改成msp430 g2 pocket的代码,还有改下时间变成30秒
2341 浏览 1 评论
4804 浏览 1 评论
2573 浏览 1 评论
1327浏览 3评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3600浏览 2评论
2928浏览 1评论
1510浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-28 23:47 , Processed in 1.225837 second(s), Total 88, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号