本帖最后由 zyw4210 于 2011-1-7 12:41 编辑
:dizzy: 我用AD7705和STC89c52做一个称重实验,可是它就是读不出数据,每次都要复位一下单片机会出一个数字(按住称重传感器)力度大小都是出一个8,或者12,或者56。一松手数字就消失,调了还几天了,到现在还是没效果,急急呀快放假了,不想把问题拖到明年。下边是我的电路和程序。
file:///D:/Program%20Files/Tencent/QQ/Users/1090145618/Image/WMP7]]Z%}E}LLDQA~M)1DJY.jpg
#include<REG51.H>
#include<absacc.h>
#include<intrins.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
sbit yj_rst =P0^0; //液晶17脚
sbit yj_sclk=P0^1; //液晶6脚
sbit yj_sid =P0^2; //液晶5脚
sbit yj_cs =P0^3; //液晶4脚
sbit yj_bg =P0^4; //控制液晶背光
uchar code asc[]="0123456789ABCDEF";
void delay(uchar x) //延时
{
uchar y;
for(;x>0;x--)
for(y=124;y>0;y--);
}
void send_8bit(uchar d) //向液晶发送数据
{
uchar i;
for(i=0;i<8;i++)
{
yj_sclk=0;
if(d&0x80)
yj_sid=1;
else
yj_sid=0;
yj_sclk=1;
d<<=1;
}
}
void HT12864_drive(bit t,uchar d) //发送命令,地址 液晶驱动
{
uchar j;
if(t==1)
j=0xfa; //指令
else
j=0xf8; //否则数据
yj_sclk=0; //时钟
yj_cs=1; //片选高的时候放入
send_8bit(j); //发送第一个8位数据,
send_8bit(d&0xf0); //发送第二个8位数据的高8位
send_8bit(d<<=4); //发送第三个8位数据的低8位
yj_sclk=0;
yj_cs=0; //为下一次发送准备
}
void HT12864_show_string(uchar add, uchar*p) //指定一个地址 显示一个字符串
{
HT12864_drive(0,add);//0的时候是指令
while(*p)
{
HT12864_drive(1,*p);//1的时候指针指向的内容
p++;
}
}
void HT12864_show_data(uchar add,uchar d) //指定地址显示一个数
{
HT12864_drive(0,add); //add要显示的数
HT12864_drive(1,asc[d/10]);
HT12864_drive(1,asc[d%10]);
}
void HT12864_init() //液晶初始化
{
yj_rst=0;
delay(80);
yj_rst=1;
delay(80);
HT12864_drive(0,0x0c); //开显示关光标
HT12864_drive(0,0x01); //清屏;
delay(100);
}
///////////////////
sbit AD7705_addata = P3^0 ; //串行数据输出输入dout/din
sbit AD7705_sclk = P3^1 ; //时钟
sbit AD7705_drdy = P3^2 ; //逻辑输出
sbit AD7705_CS = P3^3; //片选
sbit AD7705_RESET = P3^4; //复位
#define uchar unsigned char
#define uint unsigned int
void wrbyt(uchar shu);
int rdbyt( );
void ad7705_init( void ) ;
void addelay(uchar t);
void wrbyt( uchar shu )//写一个字节//
{
uchar i ;
AD7705_CS=0; // CS ON
AD7705_sclk=1;
_nop_();
_nop_();
for(i=0;i<8;i ++)
{
AD7705_addata=(bit)(shu&0x80);
AD7705_sclk = 0 ;
_nop_();
_nop_();
_nop_();
AD7705_sclk = 1 ;
shu = shu<<1 ;
}
_nop_();
AD7705_CS=1; //CS OFF
}
int rdbyt( void )//读一个字
{
int temp ;
uchar j ;
AD7705_CS=0; // CS ON
AD7705_sclk=1;
_nop_();
for(j=0;j<8;j++)
{
AD7705_sclk = 0 ;
_nop_();
_nop_();
temp = temp<<1;
temp|=(uchar)AD7705_addata;
_nop_();
_nop_();
AD7705_sclk =1;
_nop_();
_nop_();
}
_nop_();
AD7705_CS=1; // CS OFF
AD7705_drdy=1;
return (temp ) ;
}
void ad7705_init( void )//初始化AD7705//
{
wrbyt( 0x20 ) ;
wrbyt( 0x0C ) ; //写时钟寄存器//
wrbyt( 0x10 ) ;
wrbyt( 0x44 ) ; //写设置寄存器//
}
/************************************************/
//延时函数//
/*void addelay(uchar t)
{
uchar i;
while(t--)
{
for(i=0;i<124;i++);
}
}*/
/************************************************/
//主函数//
void main()
{
uint v_temp ;
AD7705_RESET=1;
ad7705_init() ;
HT12864_init();
HT12864_show_string(0x82,"A/D:");
while( 1 )
{
while(AD7705_drdy);
wrbyt( 0x38 ) ;
//AD7705_addata=1; //每次写操作后保证DIN为高电平//
v_temp = rdbyt(); //读取数据
HT12864_show_data(0X84,v_temp);
delay(50);
AD7705_sclk=1;
AD7705_addata=1; //防止误读//
}
} |