📄 ad7705liping._c
字号:
/*
PB0--SCLK;输出
PB1--DIN; 输出
PB2--DOUT;输入
PB3--DRDY;输入
PB4--REST;此处未用
PA---输出指示
*/
#include <iom16v.h>
#include <macros.h>
#include <delay.h>
#include "LCD16021.h"
//#include <putt.h>
#define uchar unsigned char
#define uint unsigned int
//REST=PB4 此处我们不加
//#define AD7705_RET_SET (PORTB|= (1<<4 ))
//#define AD7705_RET_CLR (PORTB&= ~(1<<4 ))
//DRDY=PD7
#define AD7705_READY (PIND& (1<<7 ))
//sclk=PD3
#define AD7705_CLK_SET (PORTD |= (1<<3 ))
#define AD7705_CLK_CLR (PORTD &= ~(1<<3))
//DOUT=PD6
#define AD7705_DOUT (PIND& (1<<6 ))
//DIN=1/=0=PD5
#define AD7705_DIN_SET (PORTD|= (1<<5))
#define AD7705_DIN_CLR (PORTD&= ~(1<<5 ))
#define SETBIT(x,y) ( x |= ( 1 << y ) )
#define CLRBIT(x,y) ( x &= ( ~ ( 1 << y ) )
#define CHKBIT(x,y) ( x & ( 1 << y ) )
#define INVBIT(x,y) ( x ^= ( 1 << y ) )
#define CHKBIT(x,y) ( x & ( 1 << y ) )
uchar strin[]={"liping"};
/////////////////////////////////////////
unsigned char adc[5];
///////////////读读读读读读//////////////////
/*
unsigned int Read16()
{
uchar bData;
unsigned char cLoop;
unsigned int cData;
for(cLoop=0;cLoop<16;cLoop++)
{
AD7705_CLK_CLR; //上升沿
delay_nus(2);
AD7705_CLK_SET;
delay_nus(2);
bData=AD7705_DOUT;//有资料说高8位和低8位分别倒序,而不是对16位一起倒序噢
cData<<=1;
if(AD7705_DOUT)
{
cData|=0x01;
}
delay_nus(10);
}
return cData;
}
*/
unsigned int Read16()
{
uchar bData;
unsigned char cLoop;
unsigned int cData=0;
for(cLoop=0;cLoop<16;cLoop++)
{
AD7705_CLK_CLR; //上升沿
//delay_nus(2);
cData<<=1;
bData=AD7705_DOUT;//有资料说高8位和低8位分别倒序,而不是对16位一起倒序噢
if(bData)//AD7705_DOUT)
{
cData|=0x01; //cData的初始值=0;
}
AD7705_CLK_SET;
//delay_nus(5);
}
AD7705_CLK_SET;
//AD7705_DIN_SET;
return cData;
}
///////////////////写写写写写写//////////////////////
/*
void Write8(unsigned char cData)
{
unsigned char cLoop;
for(cLoop=0;cLoop<8;cLoop++)
{
AD7705_CLK_SET; //下降沿??
delay_nus(5);
AD7705_CLK_CLR;
delay_nus(5);
if((cData&0x80)==0)
{
AD7705_DIN_CLR;
}
else
{
AD7705_DIN_SET;
}
AD7705_CLK_SET;
delay_nus(5);
//clk=1;
cData<<=1;
}
}
*/
void Write8(unsigned char c)
{
unsigned char cLoop,cData;
cData=c;//chang(c);
for(cLoop=0;cLoop<8;cLoop++)
{
AD7705_CLK_CLR; //CLK=0
//delay_nus(2);
if((cData&0x80)==0)
{
AD7705_DIN_CLR;
}
else
{
AD7705_DIN_SET;
}
AD7705_CLK_SET;
//delay_nus(5);
cData<<=1;
}
}
//
/////////////////初始化初始化初始化////////////////////////
void AD7705_init(void)
{
uchar i;
//AD7705_RET_CLR;
//delay_nms(5);
//AD7705_RET_SET ;
AD7705_DIN_SET;
for(i=0;i<100;i++)//prevent interface from losting
{
AD7705_CLK_CLR;
AD7705_CLK_SET;
}
AD7705_DIN_SET;
//dout=1;
Write8(0x20);//写通 信寄存器选择通道0 AIN1,下一步操作的对象为写“时钟寄存器”(20H
Write8(0x06);//写 时钟寄存器,根据使用的主时钟频率选择时钟位为1.数据更新率为250 Hz(06
Write8(0x10);//写通信寄存器选择通道0 AIN1,下一步操作的对 象为写“设置寄存器"( lOH )
Write8(0x54);//写设置寄存器,使增益为1、自校准方式,单极性模拟信号(44H)
}
//////////////住函数主函数主函数////////////////////////
void main(void)
{
uint AD_data;
long num,out;
uchar tempH,tempL,i;
DDRD=0X3F;
DDRA=0XFF;
//PORTA=0X0F;
LCD_INI();
LCD_Clear();
LCD_Display_String (2,1,strin);
AD7705_init();
while(1)
{
//delay_nms(100);
while(AD7705_READY)//(PINB&0x08)==1)则一直等待,直到DRDY=0
;
Write8(0x38);//(PINB&0x08)==0)说明DRDY=0,则开始读数据
AD7705_CLK_SET;
AD_data=0;
// delay_nus(5);
AD_data=Read16();
//puts(AD_data);
/////////////////以下是数据处理///////////////////////////////
tempL=AD_data; //低位开赋值
tempH=AD_data>>8;
//tempH=chang(tempH);
//tempL=chang(tempL);
//num=((chang(tempH))*256+(chang(tempL)));
//num=(int)num;
num=tempH*256+tempL;
// num*=256; //乘以100,给2个小数
// num/=262;//65535; num*2.50*100/65535基准电压扩大100倍得到实际的电压值
for(i=0;i<5;i++)
{
adc[i]=num%10;
num/=10;
}
LCD_DisplayString (1,1,adc);// disp(adc);
//PORTA=AD_data;
delay_nms(1000);
}
}
/////////////////////////////////////////////
/**--------------------数码管显示 数码管显示----------------------------------*
void disp(uchar result[4])
{
unsigned char j;
unsigned char leddat[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0-9
unsigned char ledadd[]={0xf7,0xfb,0xfd,0xfe}; //共阴数码管
//unsigned char leddat[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//unsigned char ledadd[]={0x10,0x20,0x40,0x80};
DDRD=0XFF;
// PORTD=0XFF;
DDRA=0XFF;
//0xff; //指示输出
for(j=0;j<=3;j++)
{
//PORTD=0XFF; //数码管暂停显示,达到动态显示的目的
// delay_nms(5);
PORTD=ledadd[j]; //送地址
if(j==2) //显示小数点
PORTA=leddat[result[j]]-0x80; //送数据
else
PORTA=leddat[result[j]];
delay_nms(6);
PORTA=0XFF;
}
}
////////////////////////////单片机输入倒序/////////////////
uchar chang(uchar a)
{
uchar i,b;
b=a&0x01;
for(i=0;i<8;i++)
{
b=b<<1;
a>>=1;
b=b+(a&0x01);
}
return (b);
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -