|
发表于 2010-11-28 11:44:13
|
显示全部楼层
这是连接电路,#include<avr/io.h>
#include<util/delay.h>
#define uint unsigned int
#define uchar unsigned char
#define BIT(X) (1<<X)
//#define RDY (PINB&0x40)
uchar RDY;
uchar Buf[3]={0,0,0};
#include"SPI.c"
#include"AD7190.c"
#include"1602.c"
#define AD7190_ENH PORTB|=BIT(4)
#define AD7190_ENL PORTB&=~BIT(4)
void Init_Prot();
int main()
{
uchar status=0,i,n,t;
Init_Prot();
t=PINB;
RDY=t&0x40;
unsigned long int ad_z=0;
uchar display[]={"Electron Scales"};
Init_1602();
Write_1602(com_1602,0X80);
zfc(display);
Init_SPI();
PORTB|=BIT(3);
PORTB&=~BIT(4);
AD7190_RW(0xff);//芯片复位
AD7190_RW(0xff);
AD7190_RW(0xff);
AD7190_RW(0xff);
AD7190_RW(0xff);
_delay_ms(200);
while(1)
{
while((PINB&0x40)==0x40);
Init_AD7190();
/*while(RDY==0x40)
{ AD7190_RW(0x00);
AD7190_RW(0X10);//选择Configuration regisster(24 bit,with 3 turns)
AD7190_RW(0x80);//chop enabled
AD7190_RW(0x02);//选择AIN3 to AIN4 channel
AD7190_RW(0x0f);//unbuffer model,current关闭,gain =128 ,单极性
}
while(RDY==0x40)
{
AD7190_RW(0x08);//选择模式寄存器,内部零点校准(24 bit,with 3 turns)
AD7190_RW(0x88);//Internal zero-scale calibration Model
AD7190_RW(0x00);
AD7190_RW(0x01);
}
while(RDY==0x40)
{
AD7190_RW(0x08);//选择模式寄存器,内部满量程校准(24 bit,with 3 turns)
AD7190_RW(0xa8);//Internal full-scale calibration Model
AD7190_RW(0x00);
AD7190_RW(0x01);
}
while(RDY==0x40)
{
AD7190_RW(0x08);//选择模式寄存器(24 bit,with 3 turns)
AD7190_RW(0x08);//连续转换模式
AD7190_RW(0x00);
AD7190_RW(0x18);//Filter output data rate select
}*/
_delay_ms(1250);
while((PINB&0x40)!=0x40);
/* AD7190_RW(0X40);
status=AD7190_RW(0X40);
Write_1602(com_1602,0XCA);
Write_1602(data_1602,(status/100)+0x30);
Write_1602(com_1602,0XCB);
Write_1602(data_1602,(status/10%10)+0x30);
Write_1602(com_1602,0XCC);
Write_1602(data_1602,(status%10)+0x30);*/
/* AD7190_RW(0X10);//写入下次寄存器操作为配置寄存器
//配置寄存器写入数据
AD7190_RW(0X80);
AD7190_RW(0X02);
AD7190_RW(0X18);*/
_delay_ms(200);
AD7190_RW(0X58);
// if((PINB&PB6))
Buf[0]=0xff;
Buf[1]=0xff;
Buf[2]=0;
for(i=0;i<3;i++)
{
Buf=AD7190_RW(0);
}
ad_z=Buf[0];
ad_z=(ad_z<<8)+Buf[1];
ad_z=(ad_z<<8)+Buf[2];
for(i=8;i>0;i--)
{
n=ad_z%10;
Write_1602(com_1602,0XC0+i-1);
Write_1602(data_1602,n+0x30);
ad_z=ad_z/10;
}
_delay_ms(200);
_delay_ms(200);
_delay_ms(200);
AD7190_RW(0X58);
for(i=0;i<3;i++)
{
Buf=AD7190_RW(0X00);
}
_delay_ms(10);
for(i=0;i<3;i++)
{
Write_1602(com_1602,0XCd+i);
Write_1602(data_1602,Buf+0x30);
}
}
//}
//else
}
void Init_Prot()
{
DDRA=0XFF;
DDRB=0Xbf;
PORTB=0xf7;
DDRC=0XFF;
DDRD=0XFF;
}//这是主函数
#define communications_Register 0//通讯寄存器
#define mode_Register 1//模式寄存器
#define deploy_Register 2//配置寄存器
#define data_Register 3//数据寄存器
#define GPOCON_Register 5
#define imbalance_Register 6//失调寄存器
#define full_range_Register 7//满量程寄存器
/*void Write_AD7190(uchar data)
{
AD7190_RW(data);
}
uchar Read_AD7190()
{
uchar ad_val;
ad_val=SPI_Receive();
return ad_val;
}
*/
void Init_AD7190()
{
AD7190_RW(0xff);//芯片复位
AD7190_RW(0xff);
AD7190_RW(0xff);
AD7190_RW(0xff);
AD7190_RW(0xff);
_delay_us(200);
_delay_us(200);
_delay_us(200);
/* AD7190_RW(0X08);//写入下次寄存器操作为模式寄存器
//模式寄存器写入数据(内部零电平校准)
AD7190_RW(0X88);
AD7190_RW(0X88);
AD7190_RW(0X60);
_delay_us(20);
AD7190_RW(0X08);//写入下次寄存器操作为模式寄存器
//模式寄存器写入数据(内部满量程校准)
AD7190_RW(0XA8);
AD7190_RW(0X88);
AD7190_RW(0X60);*/
AD7190_RW(0x00);
AD7190_RW(0X28);//写入下次寄存器操作为G存器
//模式寄存入数据(连续装换模式)
//AD7190_RW(0X28);
AD7190_RW(0X40);
//AD7190_RW(0X05)
_delay_us(20);
AD7190_RW(0X08);//写入下次寄存器操作为模式寄存器
//模式寄存器写入数据(系统零电平校准)
AD7190_RW(0XCc);
AD7190_RW(0X8f);
AD7190_RW(0Xff);
_delay_us(20);
AD7190_RW(0X08);//写入下次寄存器操作为模式寄存器
//模式寄存器写入数据(系统满量程校准)
AD7190_RW(0XEc);
AD7190_RW(0X8f);
AD7190_RW(0Xff);
_delay_us(20);
AD7190_RW(0X08);//写入下次寄存器操作为模式寄存器
//模式寄存器写入数据(内部零电平校准)
AD7190_RW(0X8c);
AD7190_RW(0X8f);
AD7190_RW(0Xff);
_delay_us(20);
AD7190_RW(0x00);
AD7190_RW(0X08);//写入下次寄存器操作为模式寄存器
//模式寄存器写入数据(内部零电平校准)
AD7190_RW(0X0c);
AD7190_RW(0X8f);
AD7190_RW(0Xff);
_delay_us(20);
AD7190_RW(0x00);
AD7190_RW(0X10);//写入下次寄存器操作为配置寄存器
//配置寄存器写入数据
AD7190_RW(0X80);
AD7190_RW(0X01);
AD7190_RW(0X0f);
_delay_us(20);
;
}
//spi标志
#define DDR_SPI DDRB
#define DD_MOSI 5
#define DD_SCK 7
#define DD_SS 4
//===============SPI 初始化===============
void Init_SPI()
{
DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);//设置MOSI,SCK,SS.CE 为OUTPUT,其它为INPUT
SPCR |=(1<<SPE)|(1<<MSTR)|(1<<SPR0);//使能SPI接口,主机模式,MSB低位在前,模式0,16分频,SPI时钟1MHZ
SPSR=0;
}
//====================发送数据================//
void SPI_Send(uchar message)
{
SPDR=message;
while(!(SPSR&BIT(SPIF)));
}
//================接收数据=====================//
uchar SPI_Receive()
{
while(!(SPSR&BIT(SPIF)));
return SPDR;
}
uchar AD7190_RW(uchar data)
{
SPDR=data;
while(!(SPSR&(1<<SPIF)));
return SPDR;
} |
|