能给我个51单片机控制ADS1255的程序吗 谢谢

能给我个51单片机控制ADS1255的程序吗 谢谢,第1张

#include "reg52.h"

#define uchar unsigned char

#define uint unsigned int

sbit DIO=P3^0

sbit SCLK=P3^1

/*从SPI总线上读入一个字节*/

uchar read(void)

{

uchar data i,inData

for(i=0i<8i++) // 移告蔽8次

{

SCLK = 0 // 拉低时钟线

inData <<= 1// Most Significant Bit First

inData |= DIO // 从SPI总线的数据输出线SO上读入一位

SCLK = 1 //腔友猜 拉高时钟线

}

return(inData)

}

/*输出一个字节到SPI总线伍型上*/

void write(uchar outData)

{

uchar data i

for(i=0i<8i++) // 移8次

{

SCLK = 0

outData <<= 1

DIO = CY // 移出一位,送出至SPI总线的数据输入线SI上

SCLK = 1

}

}

void do_n_byte(uint length,uint* pSend)

{

while(length--)

{

write(*pSend)

pSend++

}

// PORTB |= (1<<ADS1255_CS)

}

long int read_data(void)

{

uchar i,send[]={0x01,0xff,0xff,0xff}

long int date

do_n_byte(sizeof(send),send)

// strncpy((uchar*)&data,send+1,3)

for(i=0i<24i++)

{

SCLK = 0 // 拉低时钟线

date <<= 1 // Most Significant Bit First

date |= DIO // 从SPI总线的数据输出线SO上读入一位

SCLK = 1 // 拉高时钟线

}

// _NOP()

//send[1]=read()

//send[2]=read()

//send[3]=read()

//date = send[1]*65536 + send[2]*256 +send[1]

return date

}

/*

long int read_data_c(uchar num)

{

uchar send[]={0x03,0xff,0xff,0xff}

long int date[]

long int j=0

do_n_byte(sizeof(send),send)

date[0] = send[1]*65536 + send[2]*256 +send[1]

for(j<numj++)

{

uchar send[]={0xff,0xff,0xff}

do_n_byte(sizeof(send),send)

date[j+1] = send[1]*65536 + send[2]*256 +send[1]

}

return date

}

*/

long int read_standby(void)

{

uchar send[]={0x01,0xff,0xff,0xff,0xfd}

long int date

do_n_byte(sizeof(send),send)

strncpy((uchar*)&date,send+1,3)

return date

}

void set_selfcal(void)

{

//PORTB &= ~(1<<ADS1255_CS)

write(0xf0)// lfcal command byte(in order to get the best performance)

// PORTB |= (1<<ADS1255_CS)

}

void set_wakeup(void)

{

//PORTB &= ~(1<<ADS1255_CS)

write(0x00)//wakeup command byte(0xff can too)

//PORTB |= (1<<ADS1255_CS)

}

void set_standby(void)

{

//PORTB &= ~(1<<ADS1255_CS)

write(0xfd)//standby command byte

//PORTB |= (1<<ADS1255_CS)

}

void set_sync(void)

{

//PORTB &= ~(1<<ADS1255_CS)

write(0xfc)//sync command byte

//PORTB |= (1<<ADS1255_CS)

}

void write_register(uchar addr,uchar date)

{

uchar send[] = {0x50,0x00,0x00}//write 1 register(as used 0x00)

send[0] |= addr//starting from register addr(as used 0101 "addr"b)

send[2] |= date//data writed

do_n_byte(sizeof(send),send)

}

uchar read_register(uchar addr)

{

uchar send[] = {0x10,0x00,0xff}//read 1 register(as used 0x00)

send[0] |= addr//starting from register addr(as used 0001 "addr"b)

do_n_byte(sizeof(send),send)

send[2]=read()

return send[2]//content saved in the send[2]

}

void init_spi(void)

{

}

void main()

{

while(1)

}

我不是神人,但我希望可以帮你解决问题,呵呵……

首先,我有个小问题,你要求算的是2+4+8+……+100,是不是2的1次方,2次方,3次方?如果是,那应该是2+4+8+16+32+64,怎么有还加100呢?或者你笔误,应该是2—100之间的偶数相加呢?

好,下面来解决你的问题:

1.用ADS1.2运行你的加法程序,要注意一点就是ADS不能直链接运行C遍出来的程序,要用汇编代码启动。下面是启动代码startup.s文件(我空间有关于这个代码的分析,你可以去看看):

IMPORT |Image$$RO$$Limit|

IMPORT |Image$$RW$$Base|

IMPORT |Image$$ZI$$Base|

IMPORT |Image$$ZI$$Limit|

IMPORT Main 声明C程序中的Main()函数

AREA Start,CODE,READONLY 声明代码段Start

ENTRY标识程序入口

CODE32声明32位ARM指令

Reset LDR SP,=0x40003F00

初始化C程序的运行环境

LDR R0,=|Image$$RO$$Limit|

LDR R1,=|Image$$RW$$Base|

LDR R3,=|Image$$ZI$$Base|

CMP R0,R1

BEQ LOOP1

LOOP0 CMP R1,R3

LDRCC R2,[R0],#4

STRCC R2,[R1],#4

BCC LOOP0

LOOP1 LDR R1,=|Image$$ZI$$Limit|

MOV R2,#0

LOOP2 CMP R3,R1

STRCC R2,[R3],#4

BCC LOOP2

B Main 跳转到C程序代判差码Main()函数

END

2. 启动代码写好后,再编写C代码,运行你的程序(按你的意思算)

#define uint8 unsigned char //这两个宏定义是ADS里面防止数据溢迹冲好出带的

#define uint32 unsigned int

#define N 100

uint32 sum

// 使用加法运算来计算2+4+8+……+N的值。

void Main(void)

{ uint32 i

sum = 0

for(i=0i<=Ni=i*2)

{ sum += i

}

while(1)

}

3. 这两个程序合在一起才是是完整的ADS实现程序,希望可以解决你的困惑。姿铅

祝你进步!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12387600.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存