- #include <c8051f120.h>
- #include <ADS1255.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit SCLK=P0^2;
- sbit MISO=P0^3;
- sbit MOSI=P0^4;
- sbit INT0=P1^2;
- float snow,snow1;
- unsigned long snow2,snow3,snow4,snow5,snow6;
- uchar date1,date2,date3;
- uchar date4,date5,date6,date7,date8,date9;
- void PORT_Init (void);
- /****************************************
- 功能描述:微秒可控延时
- 设计人:孙占山
- 说明:进行微秒延时,注意while(--i),不能为while(i--)
- *****************************************/
- void delayus(uchar i)
- {
- while(--i);
- }
- /****************************************
- 功能描述:毫可控秒延时
- 设计人:孙占山
- 说明:进行毫秒延时,可以改变时间
- *****************************************/
- /*
- void delayms(void)
- {
- uchar i,j,k;
- for(i=0;i<20;i++)
- for(j=0;j<248;j++)
- for(k=0;k<248;k++);
- }
- */
- void delayms(uchar k)
- {
- uchar i,j;
- for(i=0;i<k;i++)
- for(j=0;j<248;j++);
-
- }
- /****************************************
- 功能描述:ADS1255单字节写入
- 设计人:孙占山
- 说明:在下降沿写入数据,就是在SCLK=1的时候写1,这样ADS1255在SCLK由1变为0时就能取到数据
- *****************************************/
- void ADS1255_write_bit(uchar temp)
- {
- uchar i;
- SCLK=0;
- for(i=0;i<8;i++)
- {
- temp=temp<<1;
- SCLK=0;
- delayus(2);
- SCLK=1;
- delayus(1);
- MOSI=CY; //在下降沿的时候写入数据
- delayus(1);
- SCLK=0;
- delayus(1);
- }
- }
- /****************************************
- 功能描述:ADS1255单字节读出
- 设计人:孙占山
- 说明:上升沿读出数据,在SCLK由0变为1时数据输出,并且保持到下一个上升沿,等到SCLK=1以后,数据稳定了
- 再读出数据,因为在下一个上升沿时数据才会变化,所以可以等到SCLK=0时读出数据(因为这是的数值比较稳定)
- *****************************************/
- uchar ADS1255_read_bit(void)
- {
- uchar i;
- uchar date;
- SCLK=0;
- MISO=1;
- for(i=0;i<8;i++)
- {
- date=date<<1;
- SCLK=0;
- delayus(2);
- SCLK=1;
- delayus(2);
- date=date|MISO;//数据在上升沿输出,但是读的时候在SCLK=1后面到下个SCLK=1之前读出便可
- SCLK=0;
- }
- return date;
- }
- /****************************************
- 功能描述:ADS1255的24位数据分三次读出
- 设计人:孙占山
- 说明:1:ADS1255是24位的AD转换器,24位数据可以分三个八位读出,然后再经过公式算出结果
- 2:公式有两种,一种是左移右移,一种是date1*65536+snow2*256+snow3
- 3:注意公式左移时不好,因为左移有进位,这样可能数据会变化,一般尽量采取右移
- *****************************************/
- float ADS1255_read(void)
- {
- date1=ADS1255_read_bit();
- date2=ADS1255_read_bit();
- date3=ADS1255_read_bit();
- //snow=((((snow|date1)<<8)|date2)<<8)|date3;
- //snow=snow<<8;
- snow=date1*65536+date2*256+date3;
- return snow;
- }
- /****************************************
- 功能描述:ADS1255 24位一起读出读出
- 设计人:孙占山
- 说明:上升沿读出数据,在SCLK由0变为1时数据输出,并且保持到下一个上升沿,等到SCLK=1以后,数据稳定了
- 再读出数据,因为在下一个上升沿时数据才会变化,所以可以等到SCLK=0时读出数据(因为这是的数值比较稳定)
- *****************************************/
- unsigned long ADS1255_24read(void)
- {
- uchar i;
- unsigned long date;
- SCLK=0;
- MISO=1;
- for(i=0;i<24;i++)
- {
- date=date<<1;
- SCLK=0;
- delayus(2);
- SCLK=1;
- delayus(2);
- SCLK=0;
- date=date|MISO;//数据在上升沿输出,但是读的时候在SCLK=1后面到下个SCLK=1之前读出便可
- }
- date=date<<8;
- return date;
- }
- /****************************************
- 功能描述:ADS1255写寄存器
- 设计人:孙占山
- 说明:根据要求写入寄存器和命令字
- *****************************************/
- void ADS1255_write_reg(uchar ADS1255_command,uchar ADS1255_data)
- {
- ADS1255_write_bit(ADS1255_command);
- ADS1255_write_bit(0x00);
- ADS1255_write_bit(ADS1255_data);
- delayms(248);
- }
- /****************************************
- 功能描述:ADS1255读寄存器
- 设计人:孙占山
- 说明:根据要求写入寄存器和命令字
- *****************************************/
- uchar ADS1255_read_reg(uchar ADS1255_command)
- {
- uchar reg_date;
- ADS1255_write_bit(ADS1255_command);
- ADS1255_write_bit(0x00);
- delayus(50);
- reg_date=ADS1255_read_bit();
- return reg_date;
- }
- /****************************************
- 功能描述:ADS1255唤醒
- 设计人:孙占山
- 说明:唤醒待机和同步
- *****************************************/
- void ADS1255_WAKEUP(void)
- {
- ADS1255_write_bit(0x00);
- }
- /****************************************
- 功能描述:ADS1255读一次数据命令
- 设计人:孙占山
- 说明:在DRDY为低时读出一个数据
- *****************************************/
- void ADS1255_RDATA(void)
- {
- ADS1255_write_bit(0x01);
- }
- /****************************************
- 功能描述:ADS1255连续数据命令
- 设计人:孙占山
- 说明:在DRDY为低时连续读出数据
- *****************************************/
- void ADS1255_RDATAC(void)
- {
- ADS1255_write_bit(0x03);
- }
- /****************************************
- 功能描述:ADS1255停止连续数据命令
- 设计人:孙占山
- 说明:在ADS1255连续输出24位当中的任何八位时写入,停止连续读数据
- *****************************************/
- void ADS1255_SDATAC(void)
- {
- ADS1255_write_bit(0x0F);
- }
- /****************************************
- 功能描述:偏移和增益自校准
- 设计人:孙占山
- 说明:偏移和增益自校准,也可以用STATUS寄存器中的ACAL来自校准
- *****************************************/
- void ADS1255_SELFCAL(void)
- {
- ADS1255_write_bit(0xf0);
- }
- /****************************************
- 功能描述:同步
- 设计人:孙占山
- 说明:同步用在命令的开始快速执行,紧接着用WAKE UP命令进行同步
- *****************************************/
- void ADS1255_SYNC(void)
- {
- ADS1255_write_bit(0xfc);
- }
- /****************************************
- 功能描述:复位
- 设计人:孙占山
- 说明:复位后不管ACAL位如何,都执行一个自校准
- *****************************************/
- void ADS1255_RESET(void)
- {
- ADS1255_write_bit(0xfe);
- }
- /****************************************
- 功能描述:ADS1255寄存器设置初始化
- 设计人:孙占山
- 说明:1:自校准可以通过写STATUS寄存器的ACAL位,还可以通过写SELFCAL命令来自校准
- 2:使能自校准,在写寄存器ADCON(PGA),DRATE(DR),STATUS(BUFEN)自动校准
- 3:在STATUS(BUFEN)与ACAL(自校准)位一起使能时,读出校准寄存器有错
- *****************************************/
- void ADS1255_init(void)
- {
- while(INT0==1);
- ADS1255_write_reg(0x50,0x04);
- delayus(1);
- //while(INT0==1);
- //ADS1255_write_reg(0x50,0x02); //写在STATUS(BUFEN)寄存器使能在BUFEN
- //delayus(1);
- while(INT0==1);
- ADS1255_write_reg(0x51,0x01);
- delayus(1);
- while(INT0==1);
- ADS1255_write_reg(0x52,0x01);
- delayus(1);
- while(INT0==1);
- ADS1255_write_reg(0x53,0x92);
- delayus(1);
- while(INT0==1);
- ADS1255_write_reg(0x54,0x00);
- }
- void ADS1255_out_reg(void)
- {
- while(INT0==1);
- date4=ADS1255_read_reg(0x15);
- while(INT0==1);
- date5=ADS1255_read_reg(0x16);
- while(INT0==1);
- date6=ADS1255_read_reg(0x17);
- while(INT0==1);
- date7=ADS1255_read_reg(0x18);
- while(INT0==1);
- date8=ADS1255_read_reg(0x19);
- while(INT0==1);
- date9=ADS1255_read_reg(0x1a);
- }
- void main (void)
- {
- unsigned char i,j;
- WDTCN = 0xde;
- WDTCN = 0xad;
- SFRPAGE = CONFIG_PAGE;
- PORT_Init ();
- delayms(248);
- ADS1255_RESET(); //复位
- delayus(5);
- ADS1255_init();
- delayus(5);
- //ADS1255_SELFCAL(); //通过写SELFCAL命令来自校准,可以与初始化中的STATUS(ACAL)互换
- ADS1255_out_reg();
- ADS1255_SYNC();
- delayms(248);
- ADS1255_WAKEUP();
- delayus(5);
- while(1) //一次性读数据
- {
- for(j=0;j<50;j++)
- {
- while(INT0==1);
- ADS1255_write_bit(0x01);
- delayus(50);
- snow4=ADS1255_read();
- //delayms(248);
- //snow5+=(snow4>>8);
- snow5+=snow4;
- }
-
- snow6=snow5/50;
- snow5=0x00000000;
- }
- /*
- while(1) //写寄存器,接着读寄存器
- {
- //while(INT0==1);
- //ADS1255_write_bit(0x52);
- //ADS1255_write_bit(0x01);
- //ADS1255_write_bit(0x26);
- //ADS1255_write_bit(0x03);
- //delayms(248);
- //delayms(248);
-
- while(INT0==1);
- ADS1255_write_bit(0x12);
- ADS1255_write_bit(0x01);
- delayus(50);
- snow2=ADS1255_read_bit();
- snow3=ADS1255_read_bit();
- delayms(248);
- }
- */
- /* //待机模式
- while(1)
- {
- while(INT0==1);
- ADS1255_write_bit(0xfd);
- delayms(248);
- delayms(248);
- ADS1255_write_bit(0xff);
- while(INT0==1);
- ADS1255_write_bit(0x01);
- delayus(50);
- snow2=ADS1255_read();
- }
- */
- /*
- while(1)
- {
- while(INT0==1); //建立输入复用器时间
- ADS1255_write_bit(0x52);
- ADS1255_write_bit(0x00);
- ADS1255_write_bit(0x01);
- delayus(10);
- ADS1255_write_bit(0xfc);
- delayus(10);
- ADS1255_write_bit(0xff);
- delayus(10);
- ADS1255_write_bit(0x01);
- delayus(10);
- //snow1=ADS1255_read();
- snow2=ADS1255_24read();
- delayms(248);
- while(INT0==1); //建立输入复用器时间
- ADS1255_write_bit(0x52);
- ADS1255_write_bit(0x00);
- ADS1255_write_bit(0x01);
- delayus(10);
- ADS1255_write_bit(0xfc);
- delayus(10);
- ADS1255_write_bit(0xff);
- delayus(10);
- ADS1255_write_bit(0x01);
- delayus(10);
- snow1=ADS1255_read();
- //snow2=ADS1255_24read();
- delayms(248);
- }
-
- */
-
- }
- void PORT_Init (void)
- {
- XBR2 = 0x40;
- }
-