3 二次仪表的软件程序设计
3.1 数据采集程序
进行AD采集时,可选择ADuC834的内部参考电压(注意此时内部参考电压是Vref=1.25V,所以ADC通道输入范围都缩小一半),并 通过写寄存器AD0CON的RN2、RN1和RN0来选择不同的输入范围道替换,以实现对两个通道输入电压的AD采样。其初始采集程序如下:
EADC=0; /*禁止ADC中断*/
ADCMODE=0x20; /*启动主ADC*/
tempfloat=flash_read(2); /*读取输入通道选择配置*/
temp=(uchar)(tempfloat-10001); /*采用24位的ADC,使用内部参考电压,选择AIN1、AIN2输入,选择双极性编码,
ANGE=+-TEMP*/
EADC=1; /*允许ADC采样中断*/
ADCMODE=0x23; /*进行连续采样*/
下面是ADC中断服务子程序,其中ADC的中断号为6
void adc_int(void) interrupt 6
{
EADC=0;
RDY0=0;
……
EADC=1;
}
3.2 用户闪速/电擦除数据寄存器的编程
ADuC834的用户闪速/电擦除数据存储器的容量为4kB,利用这些EEPROM可以进行系统配置信息的存储。具体程序如下:
sfr EDARL="0xe6";
# define F_READ 0x01 /*读取页*/
# define F_WRITE 0x02 /*写入页*/
# define F_VERIFY 0x04 /*检测页*/
# define F_ERASE 0x05 /*擦除页*/
# define_F_ERASEALL 0x06 /*全部擦除*/
float flash_read(unsigned char f_add) /*从地址f_add读取浮点数据*/
{
float idATA f_data=0;
float idata *ph;
uchar idata *puc;
pf=&f_data;
puc=(uchar idata *)pf;
EDARL=f_add;
ECON=0x01;
*puc=EDATA1;
++puc;
*puc=EDATA2;
++puc;
*puc=EDATA3;
++puc;
*puc=EDATA4;
return f_data;
}
unsigned char flash_write(unsigned char f_add,float f_data)
/*写浮点数据f_data到地址f_add*/
{
float idata *pf;
uchar idata *puc;
uchar idata temp;
pf=&f_data;
puc=(uchar idata *)pf;
EDARL=f-add;
ECON=0x05; /*首先擦除*/
EDARL=f_add;
EDATA1=*(puc++);
EDATA2=*(puc++);
EDATA3=*(puc++);
EDATA4=*(puc);
ECON=0x02; /*写数据*/
ECON=0x04; /*检测数据
temp=ECON;
if(temp= =0)return TRUE;
else return FLASE;
}
4 结论
本文所描述的二次仪表的软硬件设计具有采集速度快、精度高、系统体积小的特点,特别适用于需要进行复杂运算且要求采集精度较高、体积较小的系统 中。在实际的设计开发中,使用ADuC834可在很大程序上缩短开发时间并降低成本。另外,笔者设计的这款二次仪表在实际应用中也取得了很好的使用效果。
3 二次仪表的软件程序设计
3.1 数据采集程序
进行AD采集时,可选择ADuC834的内部参考电压(注意此时内部参考电压是Vref=1.25V,所以ADC通道输入范围都缩小一半),并 通过写寄存器AD0CON的RN2、RN1和RN0来选择不同的输入范围道替换,以实现对两个通道输入电压的AD采样。其初始采集程序如下:
EADC=0; /*禁止ADC中断*/
ADCMODE=0x20; /*启动主ADC*/
tempfloat=flash_read(2); /*读取输入通道选择配置*/
temp=(uchar)(tempfloat-10001); /*采用24位的ADC,使用内部参考电压,选择AIN1、AIN2输入,选择双极性编码,
ANGE=+-TEMP*/
EADC=1; /*允许ADC采样中断*/
ADCMODE=0x23; /*进行连续采样*/
下面是ADC中断服务子程序,其中ADC的中断号为6
void adc_int(void) interrupt 6
{
EADC=0;
RDY0=0;
……
EADC=1;
}
3.2 用户闪速/电擦除数据寄存器的编程
ADuC834的用户闪速/电擦除数据存储器的容量为4kB,利用这些EEPROM可以进行系统配置信息的存储。具体程序如下:
sfr EDARL="0xe6";
# define F_READ 0x01 /*读取页*/
# define F_WRITE 0x02 /*写入页*/
# define F_VERIFY 0x04 /*检测页*/
# define F_ERASE 0x05 /*擦除页*/
# define_F_ERASEALL 0x06 /*全部擦除*/
float flash_read(unsigned char f_add) /*从地址f_add读取浮点数据*/
{
float idATA f_data=0;
float idata *ph;
uchar idata *puc;
pf=&f_data;
puc=(uchar idata *)pf;
EDARL=f_add;
ECON=0x01;
*puc=EDATA1;
++puc;
*puc=EDATA2;
++puc;
*puc=EDATA3;
++puc;
*puc=EDATA4;
return f_data;
}
unsigned char flash_write(unsigned char f_add,float f_data)
/*写浮点数据f_data到地址f_add*/
{
float idata *pf;
uchar idata *puc;
uchar idata temp;
pf=&f_data;
puc=(uchar idata *)pf;
EDARL=f-add;
ECON=0x05; /*首先擦除*/
EDARL=f_add;
EDATA1=*(puc++);
EDATA2=*(puc++);
EDATA3=*(puc++);
EDATA4=*(puc);
ECON=0x02; /*写数据*/
ECON=0x04; /*检测数据
temp=ECON;
if(temp= =0)return TRUE;
else return FLASE;
}
4 结论
本文所描述的二次仪表的软硬件设计具有采集速度快、精度高、系统体积小的特点,特别适用于需要进行复杂运算且要求采集精度较高、体积较小的系统 中。在实际的设计开发中,使用ADuC834可在很大程序上缩短开发时间并降低成本。另外,笔者设计的这款二次仪表在实际应用中也取得了很好的使用效果。
举报