//---A/D转换---
//-----头文件引用------
#include <Reg51.h>
#include <absacc.h>
#include <intrins.h>
typedef unsigned char BYTE/*自定义字节类型*/
#define Set_Bit(BIT) (BIT = 1) /*定义置1函数*/
#define Clear_Bit(BIT) (BIT = 0) /*定义清0函数*/
/************************************************************************************/
void Write_Hd7279(BYTE,BYTE)/*定义HD7279写函数*/
BYTE Read_Hd7279(BYTE)/*定义HD7279读函数*/
void Send_Byte(BYTE)/*定义HD7279发送字节函数*/
BYTE Receive_Byte(void)/*定义HD7279接收字节函数*/
void Short_Delay(void)/*定义短延时函数*/
void Long_Delay(void)/*定义长延时函数*/
void Mcu_Init(void)/*定义MCU初始化函数*/
void Delay_200_mS(void)/*定义200ms延时函数*/
sbit Hd7279_Clk=P1^6/*定义HD7279时钟硬件连接*/
sbit Hd7279_Data=P1^5/*定义HD7279数据硬件连接*/
sbit cs=P1^7
void Short_Delay(void) /*短延时函数*/
{
BYTE i
for(i=0i<0x08i++)
}
/************************************************************************************/
void Long_Delay(void) /*长延时函数*/
{
BYTE i
for(i=0i<0x30i++)
}
/************************************************************************************/
void Write_Hd7279(BYTE Command,BYTE Data) /*HD7279写函数*/
{
Send_Byte(Command)
Send_Byte(Data)
}
/************************************************************************************/
void Send_Byte(BYTE Data_Out) /*HD7279发送字节函数*/
{
BYTE i
cs=0
Long_Delay()
for(i=0i<8i++)
{
if(Data_Out&0x80) Set_Bit(Hd7279_Data)
else Clear_Bit(Hd7279_Data)
Set_Bit(Hd7279_Clk)
Short_Delay()
Clear_Bit(Hd7279_Clk)
Short_Delay()
Data_Out=Data_Out<<1
}
Clear_Bit(Hd7279_Data)
}
//-----宏声明-----
#define A_DPORT XBYTE[0xFef3]//0809通道0地址
#define uchar unsigned char
//-----变量定义-----
bit bdata bz=0//定义标志
uchar val
//-----初始化-----
void first(void)
{
P1=0xff
P2=0xff
P3=0xff
P0=0xff
Send_Byte(0xa4)
IT1=1
EX1=1
EA=1//INT0 允许
}
//-----中断-----
void int_0(void) interrupt 2
{
val=A_DPORT//读 A_D 数据
bz=1//置读数标志
}
//-----主程序-----
main()
{
first()//初始化
while(1)
{
A_DPORT=val//启动 A_D
while(bz==0)//等待 A_D 转换结束
// val=~A_DPORT
//P1=val//数据输出
Write_Hd7279(0xc8,val&0x0f)
Write_Hd7279(0xc9,val>>4)
Write_Hd7279(0x92,0x00)
Write_Hd7279(0x93,0x00)
Write_Hd7279(0x94,0x00)
Write_Hd7279(0x95,0x00)
Write_Hd7279(0xce,0x0d)
Write_Hd7279(0xcf,0x0a)
bz=0//清读数标志
}
}
这就是C的程序
http://hi.baidu.com/dzkfw/blog/item/4a188216fd986b12c83d6d05.html
不平凡的单片机学习资料,很好的单片机教程,超好用,一个不占内存的教程,有案例。
1、最新版单片机编程宝典下载地址,学习单片机编程必备手册
2、单片机c语言运用例子
3、十天学会单片机c语言和单片机制作,最好的单片机资料
台湾华邦这颗数字电位器WMS7202010S停产了,应该有升级芯片吧,去它的网站找一下。继续使用之前的单片机程序的情况下替代这颗数字电器,这可比较难,要找一下与WMS7202010S 完全兼容的芯片才能用原来 的程序,不但引脚完全 相同,就其内容结构,控制代码也要完全相同才行,这只有找华邦的升级产品。
你说的程序,只是编译好的HEX代码文件吗?看来,最坏的结果,就是做重新设计了。
PH计之斜率补偿 出自:
https://blog.csdn.net/k331922164/article/details/90076721?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
PH计一般不带温度补偿,而温度对强酸、强碱的pH值影响比较大,对偏中性的溶液影响不大。
这里的温度补偿有两种含义:补偿溶液、补偿斜率。
一、补偿溶液。
由于水的电离受温度影响,所以不同的溶液的pH值受温度影响的程度不同,需要查表才能补偿。
二、补偿斜率。
1、理论斜率。
这里的斜率是由能斯特方程得到的(方程的具体推导过程请参考《电化学》)。
上式中,t为摄氏度。
R是理想气体常数,等于8.314570J.K-1.mol-1。
T是温度,单位开,T=273.15+t。
F是法拉第常数,1F等于96485C.mol-1。
n是半反应式的电子转移数,单位mol,对于氢离子,n=1。
E为被测溶液的电压,E0为等电势点,单位均为伏,V。
但是,利用上式做斜率补偿时,发现温度对PH值影响很大,跟理论值相差甚远。
后来发现以下公式是正确的。
原因是:由lgx变成lnx,在lgx的基础上乘以ln10,约为2.30259。
也就是说需要把K的lg换成ln,就在K的基础上乘以2.30259。
2、实际斜率与等电势点。
温度一定时,测量标准缓冲溶液pH1=6.86,记录电压E1,再测量pH2=4.00,记录电压E2,利用下式计算实际斜率。
利用下式计算等电势点。
计算斜率误差
Kdelta = K实际 - K理论。
把Kdelta和E0保存在单片机中,测量时再取出来使用。
三、计算实际PH值。
上式中的K是K实际 = K理论 + Kdelta。K理论=-(2.30259*R*T)/F,此处的T可由防水型的DS18B20测得。
E为被测溶液的电压值。
这就完成了斜率补偿。
四、注意事项。
1、每次测量前都先校正一次。也就是先用两种标准缓冲溶液(一般使用6.86和4.00的溶液)得到Kdelta和E0,再利用这两个值来计算实测的PH值。
2、复合电极有两个地方有溶液。拧开盖子,盖子上的溶液为保护溶液,是pH=7.00的KCL溶液;电极杆内部也装有溶液,这个溶液叫外参比溶液,一般是KCL,买电极时,有一小白瓶里面装有白色粉末的就是KCL粉末,加上20mL水就可以使用了。保护溶液和外参比溶液都是必须要有,不能干掉,否则电极测量出的值不准。
3、一般购买的标准缓冲溶液只是一包粉末,可以买一些250mL的小瓶子来兑出标准缓冲溶液。
4、25摄氏度折算。将当前温度下的pH值换算到25摄氏度下的pH值,而其它条件不变。制定一个统计的参照标准,便于验证。
5、在单片机计算时,需要把浮点数扩大10000倍,再保存于EEPROM中,取出时,再除以10000倍即可。
五、参考资料。
标准缓冲液pH值与温度对照表。
https://wenku.baidu.com/view/3d002c507275a417866fb84ae45c3b3567ecdde5.html?rec_flag=default
基于单片机ADuC845的pH计的设计。
https://wenku.baidu.com/view/60e1e90f7cd184254b3535f2.html?from=search
六、本文使用的电极。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)