stc15F2K60S2 AD7705 调试问题求助!
时间:10-02
整理:3721RD
点击:
//芯片的工作频率为11.0592MHz
#include<STC15F2K60S2.h>
#include <intrins.h>
#define BYTE unsigned char
#define WORD unsigned int
#define SPI_S0 0x40 //P_SW P3.0 RXD P3.1 TXD
#define SPI_S1 0x80
#define SPIF 0x80 //SPSTAT.7 传输完成标志
#define WCOL 0x40 //SPSTAT.6 写冲突标志
#define SSIG 0x80 //SPCTL.7
#define SPEN 0x40 //SPCTL.6
#define DORD 0x20 //SPCTL.5
#define MASTER 0x10 //SPCTL.4
#define CPOL 0x08 //SPCTL.3
#define CPHA 0x04 //SPCTL.2
#define SPDHH 0x00 //CPU_CLK/4
#define SPDH 0x01 //CPU_CLK/16
#define SPDL 0x02 //CPU_CLK/64
#define SPDLL 0x03 //CPU_CLK/128
BYTE array[30]; //声明采样结果数组
BYTE *point_array;
sbit CS0=P1^1; //SPI从机选择口, 连接到其它MCU的SS口
sbit DRDY=P1^6;
void UartInit(); //MCU 串口1初始化
void InitSPI(); //MCU SPI初始化
void SendUart(WORD array_NUM,BYTE *point_array); //MCU 串口发送数据到PC
void Write_ADC(BYTE DATA);
void Read_ADC(WORD array_NUM,BYTE *point_array);
void delay50us(); //延时函数 50us
//////////////////////////////////////
main()
{
delay50us(); //延时等待外围器件稳定
UartInit(); //初始化串口
InitSPI(); //初始化SPI
Write_ADC(0x20); //访问时钟寄存器
Write_ADC(0x03); //2.4576M 100HZ
Write_ADC(0x10); //访问设置寄存器
Write_ADC(0x40); //自校准
while(DRDY); //等待自校准完成
Write_ADC(0x38); //访问数据寄存器
point_array=array;
Read_ADC(20,array);
SendUart(20,array);
return (0);
}
/////////////////////////////////////////
void Write_ADC(BYTE DATA)
{
CS0=0; //使能AD7705
SPDAT=DATA; //发送数据
while(!SPIF==0); //等待发送完毕
CS0=1;
}
void Read_ADC(WORD array_NUM,BYTE *point_array)
{
WORD i;
for(i=0;i<array_NUM;i++)
{
CS0=0; //使能AD7705
while(DRDY); //
SPDAT=0X66; //移位寄存器写入8位数据
while(!(SPSTAT&SPIF)); // 等待发送完
*(point_array+i)=SPDAT;
i++;
SPDAT=0X66;
while(!(SPSTAT&SPIF));
*(point_array+i)=SPDAT;
CS0=1; //禁止AD7705器件
}
}
void UartInit() //9600bps@11.0592MHz
{
ACC = P_SW1;
ACC &= ~(SPI_S0 | SPI_S1); //S1_S0=0 S1_S1=0
P_SW1 = ACC; //P3.0 RXD P3.1 TXD
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xDC; //设定定时初值
TH1 = 0xDC; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
void delay50us()
{
BYTE i, j;
_nop_();
i = 1;
j = 134;
do
{
while (--j);
} while (--i);
}
//*********SPI初始化********///
void InitSPI()
{
ACC = P_SW1; //切换到第一组SPI
ACC &= ~(SPI_S0 | SPI_S1); //SPI_S0=0 SPI_S1=0
P_SW1 = ACC; //(P1.2/SS, P1.3/MOSI, P1.4/MISO, P1.5/SCLK)
SPSTAT = SPIF | WCOL; //清除SPI状态
SPCTL = SSIG | SPEN |MASTER | CPOL; //设置SPI为主模式 空闲位高
}
//////////////////////////
void SendUart(WORD array_NUM,BYTE *point_array)
{
WORD i;
for(i=0;i<array_NUM;i++)
{
while (!TI); //等待上一个数据发送完成
TI = 0; //清除发送完成标志
SBUF = *(point_array+i); //触发本次的数据发送
}
}
#include<STC15F2K60S2.h>
#include <intrins.h>
#define BYTE unsigned char
#define WORD unsigned int
#define SPI_S0 0x40 //P_SW P3.0 RXD P3.1 TXD
#define SPI_S1 0x80
#define SPIF 0x80 //SPSTAT.7 传输完成标志
#define WCOL 0x40 //SPSTAT.6 写冲突标志
#define SSIG 0x80 //SPCTL.7
#define SPEN 0x40 //SPCTL.6
#define DORD 0x20 //SPCTL.5
#define MASTER 0x10 //SPCTL.4
#define CPOL 0x08 //SPCTL.3
#define CPHA 0x04 //SPCTL.2
#define SPDHH 0x00 //CPU_CLK/4
#define SPDH 0x01 //CPU_CLK/16
#define SPDL 0x02 //CPU_CLK/64
#define SPDLL 0x03 //CPU_CLK/128
BYTE array[30]; //声明采样结果数组
BYTE *point_array;
sbit CS0=P1^1; //SPI从机选择口, 连接到其它MCU的SS口
sbit DRDY=P1^6;
void UartInit(); //MCU 串口1初始化
void InitSPI(); //MCU SPI初始化
void SendUart(WORD array_NUM,BYTE *point_array); //MCU 串口发送数据到PC
void Write_ADC(BYTE DATA);
void Read_ADC(WORD array_NUM,BYTE *point_array);
void delay50us(); //延时函数 50us
//////////////////////////////////////
main()
{
delay50us(); //延时等待外围器件稳定
UartInit(); //初始化串口
InitSPI(); //初始化SPI
Write_ADC(0x20); //访问时钟寄存器
Write_ADC(0x03); //2.4576M 100HZ
Write_ADC(0x10); //访问设置寄存器
Write_ADC(0x40); //自校准
while(DRDY); //等待自校准完成
Write_ADC(0x38); //访问数据寄存器
point_array=array;
Read_ADC(20,array);
SendUart(20,array);
return (0);
}
/////////////////////////////////////////
void Write_ADC(BYTE DATA)
{
CS0=0; //使能AD7705
SPDAT=DATA; //发送数据
while(!SPIF==0); //等待发送完毕
CS0=1;
}
void Read_ADC(WORD array_NUM,BYTE *point_array)
{
WORD i;
for(i=0;i<array_NUM;i++)
{
CS0=0; //使能AD7705
while(DRDY); //
SPDAT=0X66; //移位寄存器写入8位数据
while(!(SPSTAT&SPIF)); // 等待发送完
*(point_array+i)=SPDAT;
i++;
SPDAT=0X66;
while(!(SPSTAT&SPIF));
*(point_array+i)=SPDAT;
CS0=1; //禁止AD7705器件
}
}
void UartInit() //9600bps@11.0592MHz
{
ACC = P_SW1;
ACC &= ~(SPI_S0 | SPI_S1); //S1_S0=0 S1_S1=0
P_SW1 = ACC; //P3.0 RXD P3.1 TXD
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xDC; //设定定时初值
TH1 = 0xDC; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
void delay50us()
{
BYTE i, j;
_nop_();
i = 1;
j = 134;
do
{
while (--j);
} while (--i);
}
//*********SPI初始化********///
void InitSPI()
{
ACC = P_SW1; //切换到第一组SPI
ACC &= ~(SPI_S0 | SPI_S1); //SPI_S0=0 SPI_S1=0
P_SW1 = ACC; //(P1.2/SS, P1.3/MOSI, P1.4/MISO, P1.5/SCLK)
SPSTAT = SPIF | WCOL; //清除SPI状态
SPCTL = SSIG | SPEN |MASTER | CPOL; //设置SPI为主模式 空闲位高
}
//////////////////////////
void SendUart(WORD array_NUM,BYTE *point_array)
{
WORD i;
for(i=0;i<array_NUM;i++)
{
while (!TI); //等待上一个数据发送完成
TI = 0; //清除发送完成标志
SBUF = *(point_array+i); //触发本次的数据发送
}
}
这是小弟用stc15和ad7705 ,弄得一段小程序 , stc自带spi 所以想用ad7705采集16位模拟信号,问题是编译时始终提示main函数”missing return value“ 找不到原因! 也没挂硬件,但是main函数 末尾加了一条 return(0); 问题就解决,为什么会这样喃?望不吝赐教,一定有小东西感谢,谢谢各位兄弟!
main加了void 解决 原来c语言主函数默认范围值是int
楼上正解。这也说明了小编在写程序时不按规范出牌~