AD7705与C51程序Word下载.docx
《AD7705与C51程序Word下载.docx》由会员分享,可在线阅读,更多相关《AD7705与C51程序Word下载.docx(13页珍藏版)》请在冰点文库上搜索。
![AD7705与C51程序Word下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/2/0ae512fd-db1f-4cb7-88d5-0bb95f7c78aa/0ae512fd-db1f-4cb7-88d5-0bb95f7c78aa1.gif)
voidAD7705_Start();
voidAD7705_Read();
voidAD7705_Write_Reg(unsignedcharData_byte);
unsignedcharAD7705_Read_Reg();
main()
{
TMOD=0x11;
IT0=1;
PCON=0X00;
ET0=1;
TH1=0xFC;
TL1=0x17;
TR0=1;
EA=1;
P0=0xff;
P1=0xff;
P2=0xf7;
P3=0xff;
dis_digit=0x77;
dis_index=0;
Counter=0;
AD7705_Start();
while
(1)
while(AD7705_DRDY);
AD7705_Read();
Delayms(50);
}
voidDelayms(unsignedcharms)
//relayms
{unsignedchari;
while(ms--)
for(i=0;
i<
120;
i++);
voidAD7705_Start()
AD7705_Write_Reg(0x20);
AD7705_Write_Reg(0x0c);
AD7705_Write_Reg(0x10);
AD7705_Write_Reg(0x44);
/*****************************************/
voidAD7705_Read()
AD7705_Write_Reg(0x38);
MSB_Data=AD7705_Read_Reg();
LSB_Data=AD7705_Read_Reg();
T_Voltage=(unsingedint)MSB_Data;
T_Voltage=T_Voltage<
<
8;
T_Voltage=T_Voltage|(unsignedint)LSB_Data;
temp0=T_Voltage/100000;
temp1=((T_Voltage-temp0*100000)/10000);
temp2=((T_Voltage-temp0*100000-temp1*10000)/1000);
temp3=((T_Voltage-temp0*100000-temp1*10000-temp2*1000)/100);
temp4=(T_Voltage-temp0*100000-temp1*10000-temp2*1000-temp3*100)/10;
temp5=(T_Voltage-temp0*100000-temp1*10000-temp2*1000-temp3*100-temp4*10);
/*******************************************/
voidAD7705_Write_Reg(unsignedcharData_byte)
{
unsignedchari;
AD7705_CS=0;
AD7705_CLK=1;
_nop_();
for(i=0;
8;
i++)
AD7705_DATA=(bit)(Data_byte&
0x80);
AD7705_CLK=0;
AD7705_CLK=1;
Data_byte<
=1;
AD7705_CS=1;
unsignedcharAD7705_Read_Reg()
unsignedchari,Data_read;
Data_read<
Data_read|=(unsignedchar)AD7705_DATA;
_nop_();
AD7705_DRDY=1;
return(Data_read);
voidtime0(void)interrupt1
TR0=0;
P2=dis_digit;
//P2.7--DS8
P0=Display_code[dis_index];
TH0=0xFC;
TL0=0x17;
Counter++;
if(Counter==1)
dis_index=temp5;
}elseif(Counter==2)
dis_digit=0xb7;
dis_index=temp4;
}elseif(Counter==3)
dis_digit=0xd7;
dis_index=temp3;
}elseif(Counter==4)
dis_digit=0xe7;
dis_index=temp2;
、*********************************************************************************************************************************************************************************************************************************************
void
reset_AD7705(void)
unsigned
char
i;
AD_DIN1;
for(
i=0;
i<
36;
i++
)
AD_CLK0;
asm("
nop"
);
AD_CLK1;
}
_delay_ms
(2);
//通讯寄存器地址定义
#define
WR_SETUP_REG
0x10
//选中写设置寄存器
RD_SETUP_REG
0x18
WR_CLOCK_REG
0x20
//选中写时钟寄存器
#defineRD_DATA_REG
0x38
//选中数据寄存器读
WR_OFFSET_REG
0x60
//选中写offset寄存器
RD_OFFSET_REG
0x68
//选中读offset寄存器
WR_FULL_REG
0x70
//选中写fullscale寄存器
RD_FULL_REG
0x78
//选中读fullscale寄存器
SYS_ZERO_CALI
0x80
//系统零校准模式
SYS_FULL_CALI
0xC0
//系统满量程校准模式
#defineZERO_CALIBRATION
0x00//系统零校准
#defineFULL_CALIBRATION
0x01//系统满量程校准
//CLOCK寄存器设置,无分频,50HZ输出更新速率
/88888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
ad7705.c//主程序
#include"
lcd1602.h"
#defineucharunsignedchar
#defineuintunsignedint
sbitAD7705_DRDY=P3^2;
sbitAD7705_CS
=P1^5;
//AD7705CS
uintCounter="
0"
Counter1=0;
longintT_VoltageTotal=0;
uintT_Voltage=0,T_VoltageDel=0,T_VoltageQP=0,T_VoltageMax=0;
//现在值、中间处理值、去皮值,与最大值
unsignedcharMSB_Data,LSB_Data;
uchara[5]={0,0,0,0,0};
ucharb[5]={1,0,0,0,5};
//分别对应
ucharcoderow1[]={"
NOW:
*****g
"
};
ucharcoderow2[]={"
MAX:
ucharrow1adr[16]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F};
//LCD地址
ucharrow2adr[16]={0x80+0x40,0x81+0x40,0x82+0x40,0x83+0x40,0x84+0x40,0x85+0x40,0x86+0x40,0x87+0x40,0x88+0x40,0x89+0x40,0x8A+0x40,0x8B+0x40,0x8C+0x40,0x8D+0x40,0x8E+0x40,0x8F+0x40};
uchari;
//定义变量
voidlcdscan();
//更新显示的数据
voidlcdscan1();
//初始化二行数据
//通道的初始化
//对转换数据进行处理
//对芯片写数据
//读取AD转换的数据
lcdrw=0;
//lcd写数据
lcdon();
//初始化LCD
lcdscan1();
IT1=0;
EX1=1;
P1=0xff;
P2=0xff;
P3=0xff;
Counter
=0;
delay(200);
for(i=0;
10;
i++)
//启动去皮
AD7705_Read();
T_VoltageTotal+=T_VoltageDel;
T_VoltageQP=(uint)(T_VoltageTotal/10);
//****************
T_VoltageTotal=0;
Counter1++;
if(Counter==8)
T_Voltage=(uint)(T_VoltageTotal/8);
T_Voltage-=T_VoltageQP;
if(T_Voltage>
63000)
T_Voltage=0;
T_VoltageMax)
T_VoltageMax=T_Voltage;
if(Counter1==160)
a[0]=(uchar)(T_Voltage/10000);
a[1]=(uchar)((T_Voltage-a[0]*10000)/1000);
a[2]=(uchar)((T_Voltage-a[0]*10000-a[1]*1000)/100);
a[3]=(uchar)((T_Voltage-a[0]*10000-a[1]*1000-a[2]*100)/10);
a[4]=(uchar)(T_Voltage-a[0]*10000-a[1]*1000-a[2]*100-a[3]*10);
b[0]=(uchar)(T_VoltageMax/10000);
b[1]=(uchar)((T_VoltageMax-b[0]*10000)/1000);
b[2]=(uchar)((T_VoltageMax-b[0]*10000-b[1]*1000)/100);
b[3]=(uchar)((T_VoltageMax-b[0]*10000-b[1]*1000-b[2]*100)/10);
b[4]=(uchar)(T_VoltageMax-b[0]*10000-b[1]*1000-b[2]*100-b[3]*10);
lcdscan();
Counter1=0;
Counter=0;
//******初始化LCD二行******//
voidlcdscan1()
//第一行
16;
i++)
lcdwrite(row1adr[i]);
lcdshuju(row1[i]);
delay(10);
//第二行
lcdwrite(row2adr[i]);
lcdshuju(row2[i]);
//***更新显示的数据***//
voidlcdscan()
{
//lcd写数据
for(i=6;
11;
lcdshuju(a[i-6]+0x30);
delay
(1);
lcdshuju(b[i-6]+0x30);
AD7705_Write_Reg(0x7E);
/************对转换数据进行处理**********************/
T_VoltageDel=(uint)MSB_Data;
T_VoltageDel=T_VoltageDel<
T_VoltageDel=T_VoltageDel|LSB_Data;
voidEX0IN(void)interrupt2
//去皮
T_VoltageMax=0;
voidtime0(void)interrupt3
TR0=1;
lcd1602//子程序
lcd_data
P0
sbitlcdrs="
P2"
^5;
sbitlcdrw="
^6;
sbitlcden="
^7;
voiddelay(uintz)
uintx,y;
for(x=z;
x>
0;
x--)
for(y=255;
y>
y--);
}//1毫秒左右延时
//lcdwrite()
LCD写指令
voidlcdwrite(ucharwrite)
lcdrs=0;
lcd_data=write;
lcden=1;
lcden=0;
//lcdshuju()
LCD写数据
voidlc