📄 [技术问答 模拟技术] ad7705的源程序==www_ic37_com.htm
字号:
<P style="TEXT-INDENT: 2em">asm("nop");</P>
<P style="TEXT-INDENT: 2em">asm("nop");</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">return data;</P>
<P style="TEXT-INDENT: 2em">}</P>
<P
style="TEXT-INDENT: 2em">//------------------------------------------------------------------------------------------</P>
<P style="TEXT-INDENT: 2em">//函数:read_<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>_dword</P>
<P style="TEXT-INDENT: 2em">//功能:从<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>读一个24的数据</P>
<P style="TEXT-INDENT: 2em">//参数:无</P>
<P style="TEXT-INDENT: 2em">//返回:读到的一字节数据</P>
<P style="TEXT-INDENT: 2em">//变量:无</P>
<P style="TEXT-INDENT: 2em">//备注:<A title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>是一个16位AD</P>
<P
style="TEXT-INDENT: 2em">//------------------------------------------------------------------------------------------</P>
<P style="TEXT-INDENT: 2em">unsigned long int read_<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>_dword(void)</P>
<P style="TEXT-INDENT: 2em">{</P>
<P style="TEXT-INDENT: 2em">unsigned long data = 0;</P>
<P style="TEXT-INDENT: 2em">unsigned char i = 0;</P>
<P style="TEXT-INDENT: 2em">for( i=0; i<24; i++ )</P>
<P style="TEXT-INDENT: 2em">{</P>
<P style="TEXT-INDENT: 2em">data <<= 1;</P>
<P style="TEXT-INDENT: 2em">AD_CLK0;</P>
<P style="TEXT-INDENT: 2em">asm("nop");</P>
<P style="TEXT-INDENT: 2em">asm("nop");</P>
<P style="TEXT-INDENT: 2em">asm("nop");</P>
<P style="TEXT-INDENT: 2em">if(AD_DOUT)</P>
<P style="TEXT-INDENT: 2em">{</P>
<P style="TEXT-INDENT: 2em">data++;</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">AD_CLK1;</P>
<P style="TEXT-INDENT: 2em">asm("nop");</P>
<P style="TEXT-INDENT: 2em">asm("nop");</P>
<P style="TEXT-INDENT: 2em">asm("nop");</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">return data;</P>
<P style="TEXT-INDENT: 2em">}</P>
<P
style="TEXT-INDENT: 2em">//------------------------------------------------------------------------------------------</P>
<P style="TEXT-INDENT: 2em">//函数:write_<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>_byte</P>
<P style="TEXT-INDENT: 2em">//功能:往<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>写8位数据</P>
<P style="TEXT-INDENT: 2em">//参数:IN - uint8_tdata,要写入<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>的数据</P>
<P style="TEXT-INDENT: 2em">//返回:无</P>
<P style="TEXT-INDENT: 2em">//变量:无</P>
<P style="TEXT-INDENT: 2em">//备注:无</P>
<P
style="TEXT-INDENT: 2em">//------------------------------------------------------------------------------------------</P>
<P style="TEXT-INDENT: 2em">void write_<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>_byte(unsigned char data)</P>
<P style="TEXT-INDENT: 2em">{</P>
<P style="TEXT-INDENT: 2em">for(unsigned char i=0; i<8;
i++)</P>
<P style="TEXT-INDENT: 2em">{</P>
<P style="TEXT-INDENT: 2em">AD_CLK0;</P>
<P style="TEXT-INDENT: 2em">if(data&0x80)</P>
<P style="TEXT-INDENT: 2em">AD_DIN1;</P>
<P style="TEXT-INDENT: 2em">else</P>
<P style="TEXT-INDENT: 2em">AD_DIN0;</P>
<P style="TEXT-INDENT: 2em">asm("nop");</P>
<P style="TEXT-INDENT: 2em">asm("nop");</P>
<P style="TEXT-INDENT: 2em">asm("nop");</P>
<P style="TEXT-INDENT: 2em">AD_CLK1;</P>
<P style="TEXT-INDENT: 2em">asm("nop");</P>
<P style="TEXT-INDENT: 2em">asm("nop");</P>
<P style="TEXT-INDENT: 2em">asm("nop");</P>
<P style="TEXT-INDENT: 2em">data <<= 1;</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">AD_DIN1;</P>
<P style="TEXT-INDENT: 2em">}</P>
<P
style="TEXT-INDENT: 2em">//------------------------------------------------------------------------------------------</P>
<P style="TEXT-INDENT: 2em">//函数:write_<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>_dword</P>
<P style="TEXT-INDENT: 2em">//功能:往<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>写24位数据,因为<A title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>是24位的器件</P>
<P style="TEXT-INDENT: 2em">//参数:IN - int32_tdata,要写入<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>的数据</P>
<P style="TEXT-INDENT: 2em">//返回:无</P>
<P style="TEXT-INDENT: 2em">//变量:无</P>
<P style="TEXT-INDENT: 2em">//备注:无</P>
<P
style="TEXT-INDENT: 2em">//------------------------------------------------------------------------------------------</P>
<P style="TEXT-INDENT: 2em">void write_<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>_dword(unsigned long int data)</P>
<P style="TEXT-INDENT: 2em">{</P>
<P style="TEXT-INDENT: 2em">for(unsigned char i = 0; i<24;
i++)</P>
<P style="TEXT-INDENT: 2em">{</P>
<P style="TEXT-INDENT: 2em">AD_CLK0;</P>
<P style="TEXT-INDENT: 2em">if(data&0x800000)</P>
<P style="TEXT-INDENT: 2em">AD_DIN1;</P>
<P style="TEXT-INDENT: 2em">else</P>
<P style="TEXT-INDENT: 2em">AD_DIN0;</P>
<P style="TEXT-INDENT: 2em">asm("nop");</P>
<P style="TEXT-INDENT: 2em">asm("nop");</P>
<P style="TEXT-INDENT: 2em">asm("nop");</P>
<P style="TEXT-INDENT: 2em">AD_CLK1;</P>
<P style="TEXT-INDENT: 2em">asm("nop");</P>
<P style="TEXT-INDENT: 2em">asm("nop");</P>
<P style="TEXT-INDENT: 2em">asm("nop");</P>
<P style="TEXT-INDENT: 2em">data <<= 1;</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">AD_DIN1;</P>
<P style="TEXT-INDENT: 2em">}</P>
<P
style="TEXT-INDENT: 2em">//------------------------------------------------------------------------------------------</P>
<P style="TEXT-INDENT: 2em">//函数:<A title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>_calibration</P>
<P style="TEXT-INDENT: 2em">//功能:根据cali_type的值对<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>进行系统0校正或系统满量程校正,并将各校正值和校正标志存入</P>
<P style="TEXT-INDENT: 2em">//EEPROM,数据保存为双备份。数据块格式为:
内部0校正值(4byte), 内部满量程校正值(4byte), </P>
<P style="TEXT-INDENT: 2em">//系统0校正值(4byte), 系统满量程校正值(4byte),
系统0校正标志(1byte),系统满量程校正标志</P>
<P
style="TEXT-INDENT: 2em">//(1byte),CRC16校验值(2byte),共20byte。</P>
<P style="TEXT-INDENT: 2em">//参数:IN - uint8_t board, 0 -
对主板进行校正,1-对副板进行校正</P>
<P style="TEXT-INDENT: 2em">//IN - uint8_t range, 需要校正的量程</P>
<P style="TEXT-INDENT: 2em">//IN - uint8_t cali_type,
校正类型,ZERO_CALIBRATION- 0校正;</P>
<P style="TEXT-INDENT: 2em">//FULL_CALIBRATION - 满量程校正</P>
<P
style="TEXT-INDENT: 2em">//返回:返回-1表示校准失败,非0表示校正成功,并返回相应的索引值</P>
<P style="TEXT-INDENT: 2em">//变量:无</P>
<P style="TEXT-INDENT: 2em">//备注:做满量程校正前必须先做零校正</P>
<P
style="TEXT-INDENT: 2em">//------------------------------------------------------------------------------------------</P>
<P style="TEXT-INDENT: 2em">//校准命令格式</P>
<P style="TEXT-INDENT: 2em">//STXData LongCommand
CodeParameterCheckSumETX</P>
<P
style="TEXT-INDENT: 2em">//0x55数据长度(2)量程指示00H/01HCRC16(2)0x0D</P>
<P style="TEXT-INDENT: 2em">//</P>
<P
style="TEXT-INDENT: 2em">//校准过程中要用到Command[]的数据,所以校准之前要关掉串口接收中断</P>
<P style="TEXT-INDENT: 2em">void <A title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>_calibration(void)</P>
<P style="TEXT-INDENT: 2em">{</P>
<P style="TEXT-INDENT: 2em">//记录读取EEPROM的次数</P>
<P style="TEXT-INDENT: 2em">unsigned char readtimes =0;</P>
<P style="TEXT-INDENT: 2em">//记录上位机发送的校准量程类型</P>
<P style="TEXT-INDENT: 2em">unsigned char cali_scale =0;</P>
<P style="TEXT-INDENT: 2em">//读取24位校准系数的临时变量</P>
<P style="TEXT-INDENT: 2em">unsigned long int temp =0;</P>
<P
style="TEXT-INDENT: 2em">//临时的校准系数数组,存放格式ZSL、ZSM、ZSH;GSL、GSM、GSH;CRCL、CRCH</P>
<P
style="TEXT-INDENT: 2em">//并在校准结束时作为参数传递给TXOUT()函数,发送校准系数给上位机</P>
<P style="TEXT-INDENT: 2em">unsigned char coefficient[8] ={0};
//test[8]={0};</P>
<P style="TEXT-INDENT: 2em">//16位校验和的临时变量</P>
<P style="TEXT-INDENT: 2em">unsigned int crcvalue =0;</P>
<P style="TEXT-INDENT: 2em">AD_CS1;</P>
<P style="TEXT-INDENT: 2em">cali_scale = command[2];
//获取上位机发送的要校准的量程类型</P>
<P style="TEXT-INDENT: 2em">//读取EEPROM的第一份校准系数</P>
<P style="TEXT-INDENT: 2em">eeprom_busy_wait();</P>
<P style="TEXT-INDENT: 2em">eeprom_read_block(
&coefficient[0], (void*)(ADDR_EEPROM_1+(cali_scale-1)*10),
8 );</P>
<P style="TEXT-INDENT: 2em">crcvalue = <A
title="checksum PDF资料和全国供应商"
href="http://www.ic37.com/checksum-p.htm"
target=_blank>checksum</A>( &coefficient[0], 6 );
//将6个值调用CRC校验函数得到校验</P>
<P style="TEXT-INDENT: 2em">if(
(coefficient[7]*256+coefficient[6]) != crcvalue )</P>
<P style="TEXT-INDENT: 2em">{</P>
<P style="TEXT-INDENT: 2em">readtimes++;</P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -