⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcf_7705.c

📁 通过对AD7705芯片的编写
💻 C
字号:
#include"reg52.h"
#include "intrins.h"
#include "stdio.h"
#include "ctype.h"
#include "string.h"

#define RESET_ADD      0x02
#define RESET_CODE     0x01
#define LEFTMOV_ADD    0x03
#define LEFTMOV_CODE   0
#define LEFTCYC_ADD    0x03
#define LEFTCYC_CODE   0x01
#define RIGHTMOV_ADD   0x03
#define RIGHTMOV_CODE  0x02
#define RIGHTCYC       0x03
#define RIGHTCYC       0x03
#define SYSOFF_ADD     0x04
#define  SYSOFF_CODE   0x00
#define SYSON1_ADD     0x04
#define SYSON1_CODE    0x01
#define SYSON2_ADD     0x04
#define SYSON2_CODE    0x03
#define SYSON3_ADD     0x04
#define SYSON3_CODE    0x07
#define DSP_ADD        0x05
#define DSP_CODE       0x0a
#define BCD_ADD        0x05
#define BCD_CODE       0x80
#define TWINKLE_ADD    0x06
#define TWINKLE_CODE   0x00
#define DIG0           0x08
#define DIG1           0x09
#define DIG2           0x0a
#define DIG3           0x0b
#define DIG4           0x0c
#define DIG5           0x0d
#define DIG6           0x0e
#define DIG7           0x0f	
#define NO_KEY         0
#define MENU           0x7b
#define CLEAR          0x7f
#define OK             0x7c
#define UP             0x7f
#define DOWN           0x7e	
#define CODE0          0x7e
#define CODE1          0x28
#define CODE2          0x5b
#define CODE3          0x6b
#define CODE4          0x2d
#define CODE5          0x67
#define CODE6          0x77
#define CODE7          0x2e
#define CODE8          0x7f
#define CODE9          0x6f
#define CODEF          0xe8
#define CODEU          0x7c
#define POINT          0x01
#define year       0x10
#define month      0x11
#define date       0x12
#define hours      0x13
#define minutes    0x14
#define seconds    0x15
#define weekday    0x16

sbit B0=B^0;
sbit B1=B^1;
sbit B2=B^2;
sbit B3=B^3;
sbit B4=B^4;
sbit B5=B^5;
sbit B6=B^6;
sbit B7=B^7;

sbit CH451_DCLK=P0^0;
sbit CH451_DIN=P0^1;
sbit CH451_LOAD=P0^2;
sbit CH451_DOUT=P0^3;
sbit SC=P0^5;
sbit SD=P0^4;
sbit VF_INT1=P3^3;
sbit VF_T1=P3^5;
sbit AD7705_DIN=P2^1;
sbit AD7705_DOUT=P2^1;
sbit AD7705_CLK=P2^0;
sbit AD7705_DRDY=P2^2;

union int_char
{
signed int signed_int;
unsigned int unsigned_int;
unsigned char c[2];
};

union long_int
{
signed long signed_long;
unsigned long unsigned_long;
unsigned int unsigned_int[2];
unsigned char c[4];
};


unsigned char key,time,n1,n2,timer,time1,time2,time3,fre,z,last_key,y,m1,m2,k,j,j1,j2,j3,j4,l,k,d,r0,r1,r2,r3,r4,r5,second;
unsigned char     keydata[8]={0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,0};
unsigned char     dig0[8]={0,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char     led[10]={CODE0,CODE1,CODE2,CODE3,CODE4,CODE5,CODE6,CODE7,CODE8,CODE9};
unsigned char     dled[8]={CODE0,CODE1,CODE2,CODE2,CODE2,CODEU,CODE2,CODE2};
unsigned char     dig[8]={DIG0,DIG1,DIG2,DIG3,DIG4,DIG5,DIG6,DIG7};
unsigned int  last_counter,delta_counter;
data union int_char	  r,e,x,counter;

/*-------------------------------------------------------*/
void timer0(void) interrupt 1              /*中断T0*/
{
TH0=0xd0;
second++;
if(second>49)
{
second=0;
counter.c[0]=TH1;counter.c[1]=TL1;
if(counter.c[0]!=TH1){counter.c[1]=TL1;counter.c[0]=TH1;}
delta_counter=counter.unsigned_int-last_counter;
last_counter=counter.unsigned_int;
}                          /*计8次返回*/
timer++;
if(timer<8)return;                          /*计8次返回*/
timer=0;
}
/*------------------------------------------------------------*/
void CH451_WRITE(unsigned char uadd,unsigned char ux)
{
CH451_DIN=0;CH451_DIN=1;

B=ux;
CH451_DIN=B0;CH451_DCLK=0;CH451_DCLK=1;
CH451_DIN=B1;CH451_DCLK=0;CH451_DCLK=1;
CH451_DIN=B2;CH451_DCLK=0;CH451_DCLK=1;
CH451_DIN=B3;CH451_DCLK=0;CH451_DCLK=1;
CH451_DIN=B4;CH451_DCLK=0;CH451_DCLK=1;
CH451_DIN=B5;CH451_DCLK=0;CH451_DCLK=1;
CH451_DIN=B6;CH451_DCLK=0;CH451_DCLK=1;
CH451_DIN=B7;CH451_DCLK=0;CH451_DCLK=1;
B=uadd;
CH451_DIN=B0;CH451_DCLK=0;CH451_DCLK=1;
CH451_DIN=B1;CH451_DCLK=0;CH451_DCLK=1;
CH451_DIN=B2;CH451_DCLK=0;CH451_DCLK=1;
CH451_DIN=B3;CH451_DCLK=0;CH451_DCLK=1;

CH451_LOAD=0;CH451_LOAD=1;
}
/*-----------------------------------*/
char CH451_READ()                      /*读CH451,当有键按下时,从DOUT口串行读出数据*/
{
CH451_DIN=0;CH451_DIN=1;

CH451_DIN=1;CH451_DCLK=0;CH451_DCLK=1; /*发送两个字节,将第二个CH451高四位送入7,通知其读键值*/
CH451_DIN=1;CH451_DCLK=0;CH451_DCLK=1;
CH451_DIN=1;CH451_DCLK=0;CH451_DCLK=1;
CH451_DIN=0;CH451_DCLK=0;CH451_DCLK=1;

CH451_LOAD=0;CH451_LOAD=1;               /*加载数据*/

B7=0;                                    /*读键值,并将其存入B寄存器中*/
B6=CH451_DOUT;CH451_DCLK=0;CH451_DCLK=1;
B5=CH451_DOUT;CH451_DCLK=0;CH451_DCLK=1;
B4=CH451_DOUT;CH451_DCLK=0;CH451_DCLK=1;
B3=CH451_DOUT;CH451_DCLK=0;CH451_DCLK=1;
B2=CH451_DOUT;CH451_DCLK=0;CH451_DCLK=1;
B1=CH451_DOUT;CH451_DCLK=0;CH451_DCLK=1;
B0=CH451_DOUT;CH451_DCLK=0;CH451_DCLK=1;
if(B6==0)B=0;                           /*如果键值为释放时的值,将B清零*/
return B;
}
/*-----------------------------------------------*/
display_led()                           
{
unsigned char i;
CH451_WRITE(SYSON2_ADD,SYSON2_CODE);
CH451_WRITE(DSP_ADD,DSP_CODE);
for(i=0;i<8;i++)
{
CH451_WRITE(dig[i],led[i]);
}
}
/*-----------------------------------------------------*/
void write_IIC(unsigned char x)
{
char i;

B=x;
i=8;
do
 {
 SD=B7;
 SC=1;_nop_();_nop_();B=B<<1;
 SC=0;_nop_();_nop_();
 i--;
 }
while(i!=0);
SD=1;
SC=1;
_nop_();_nop_();
_nop_();_nop_();
SC=0;
_nop_();_nop_();
}
/*--------------------------------------------------------*/
void write_8583_byte(unsigned char address,unsigned char x)
{
SD=1;
SC=1;
_nop_();_nop_();
_nop_();_nop_();
SD=0;
_nop_();_nop_();
_nop_();_nop_();
SC=0;                                                    /* start */
write_IIC(0xa0);                        
write_IIC(address);
write_IIC(x);
SD=0;
SC=1;
_nop_();_nop_();
_nop_();_nop_();
SD=1;                                                   /* stop */
}
/*-------------------------------------------------------------------------*/
unsigned char read_8583_byte(unsigned char address)
{
char i;

SD=1;
SC=1;
_nop_();_nop_();
_nop_();_nop_();
SD=0;
_nop_();_nop_();
_nop_();_nop_();
SC=0;                                                    /* start */
write_IIC(0xa0);                        
write_IIC(address);
SD=0;
SC=1;
_nop_();_nop_();
_nop_();_nop_();
SD=1;                                                   /* stop */

SD=1;
SC=1;
_nop_();_nop_();
_nop_();_nop_();
SD=0;
_nop_();_nop_();
_nop_();_nop_();
SC=0;                                                    /* start */
write_IIC(0xa1);                        
i=8;
do
 {
 B=B<<1;B0=SD;
 SC=1;
 _nop_();_nop_();
 _nop_();_nop_();
 SC=0;
 _nop_();_nop_();
 _nop_();_nop_();
 i--;
 }
while(i!=0);
SC=1;
_nop_();_nop_();
_nop_();_nop_();
SC=0;
_nop_();_nop_();
_nop_();_nop_();

SD=0;
SC=1;
_nop_();_nop_();
_nop_();_nop_();
SD=1;                                                   /* stop */

return(B);
}
/*-------------------------------------------------------------------------*/
void AD7705_WRITE(unsigned char x)
{
B=x;
AD7705_CLK=0;AD7705_DIN=B7;AD7705_CLK=1;
AD7705_CLK=0;AD7705_DIN=B6;AD7705_CLK=1;
AD7705_CLK=0;AD7705_DIN=B5;AD7705_CLK=1;
AD7705_CLK=0;AD7705_DIN=B4;AD7705_CLK=1;
AD7705_CLK=0;AD7705_DIN=B3;AD7705_CLK=1;
AD7705_CLK=0;AD7705_DIN=B2;AD7705_CLK=1;
AD7705_CLK=0;AD7705_DIN=B1;AD7705_CLK=1;
AD7705_CLK=0;AD7705_DIN=B0;AD7705_CLK=1;
AD7705_DIN=1;

}	
/*---------------------------------------------------------------------------*/
char AD7705_READ()
{
AD7705_DOUT=1;
AD7705_CLK=0;B7=AD7705_DOUT;AD7705_CLK=1;
AD7705_CLK=0;B6=AD7705_DOUT;AD7705_CLK=1;
AD7705_CLK=0;B5=AD7705_DOUT;AD7705_CLK=1;
AD7705_CLK=0;B4=AD7705_DOUT;AD7705_CLK=1;
AD7705_CLK=0;B3=AD7705_DOUT;AD7705_CLK=1;
AD7705_CLK=0;B2=AD7705_DOUT;AD7705_CLK=1;
AD7705_CLK=0;B1=AD7705_DOUT;AD7705_CLK=1;
AD7705_CLK=0;B0=AD7705_DOUT;AD7705_CLK=1;
return B;

}
/*-------------------------------------------------------------------------------*/
void scale_7705(void)
{
AD7705_WRITE(0xff);
AD7705_WRITE(0xff);
AD7705_WRITE(0xff);
AD7705_WRITE(0xff);
AD7705_WRITE(0x20);     /* 写通讯寄存器 0010 0000 时钟寄存器,写,运行,AIN1-,AIN1+ */
AD7705_WRITE(0x04);     /* 写时钟寄存器 0000 0100 时钟输出,不分频,`	``````````2.4576MHz晶振,输出率50Hz */
AD7705_WRITE(0x10);     /* 写通讯寄存器 0001 0000 设置寄存器,写,运行,AIN1-,AIN1+*/
AD7705_WRITE(0x48);     /* 写设置寄存器 0100 1000 自校准,增益2,双极性,不缓冲,同步*/
}
/*-------------------------------------------------------------------------*/
int ad_7705(void)
{
union int_char x;

AD7705_WRITE(0xff);
AD7705_WRITE(0xff);
AD7705_WRITE(0xff);
AD7705_WRITE(0xff);
AD7705_WRITE(0x38);     /* 写通讯寄存器 0011 1000 时钟寄存器,读,运行,AIN1-,AIN1+*/
x.c[0]=AD7705_READ();
x.c[1]=AD7705_READ();

return x.unsigned_int;
}
/*-------------------------------------------------------------------------*/

char dis_code(char x)
{switch(x)
 {
 case 0:return CODE0;
 case 1:return CODE1;
 case 2:return CODE2;
 case 3:return CODE3;
 case 4:return CODE4;
 case 5:return CODE5;
 case 6:return CODE6;
 case 7:return CODE7;
 case 8:return CODE8;
 case 9:return CODE9;
 default:return 0;
 }
}
/*-------------------------------------------------------------------------*/
void main(void)
{
union int_char n;
TMOD=0x51;                                    /*设置定时中断T0*/
EA=1;
ET0=1;
TR0=1;
TR1=1;
for(;;)
{
unsigned int x;
/*TR1=1;
e.unsigned_int=x.unsigned_int; */

while(timer!=0)PCON=0x01; 

/*TR1=0;
x.c[0]=TL1;
x.c[1]=TH1;
r.unsigned_int=x.unsigned_int-e.unsigned_int;*/

x=delta_counter;
led[7]=CODEF;
led[6]=led[5]=0;
led[4]=dis_code(x/10000);x%=10000;
led[3]=dis_code(x/1000);x%=1000;
led[2]=dis_code(x/100);x%=100;
led[1]=dis_code(x/10);x%=10;
led[0]=dis_code(x);

/*
r2=delta_counter/4096;
r3=delta_counter%4096/256;
r4=delta_counter%256/16;
r5=delta_counter%16;	 
CH451_WRITE(DIG3,dis_code(r5));
CH451_WRITE(DIG4,dis_code(r4));
CH451_WRITE(DIG5,dis_code(r3));
CH451_WRITE(DIG6,dis_code(r2));
CH451_WRITE(DIG7,dis_code(r1));	 	
*/

display_led(); 
PCON=0x01;													  
/*uled[7]=dis_code(fre/100);y=fre%100;          
uled[6]=dis_code(y/10)|POINT;y=y%10;
uled[5]=dis_code(y);                       
last_key=key;key=CH451_READ();
CH451_WRITE(DIG2,key);                                           
if((key==UP)&&(last_key==NO_KEY)) fre+=1;
if((key==DOWN)&&(last_key==NO_KEY)) fre-=1;
time=read_8583_byte(0x02);
time1=time/16;z=time%16;          
time2=z;
time1=time1-0x01;
time2=time2-0x01;	*/
/*CH451_WRITE(DIG0,dis_code(time2+1));
CH451_WRITE(DIG1,dis_code(time1+1));   */
/*n.unsigned_int=ad_7705();
uled[3]=n.c[0];
uled[4]=n.c[1];	*/ 

//CH451_WRITE(DIG3,n.c[0]);
//CH451_WRITE(DIG4,n.c[1]);




}
}
/*------------------------------------------------------------*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -