stc15F2K60S2 AD7705 调试问题求助!

2019-07-15 17:25发布

//芯片的工作频率为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);                                 //触发本次的数据发送
    }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
zhou792008
2019-07-15 22:03
这是小弟用stc15和ad7705 ,弄得一段小程序 , stc自带spi 所以想用ad7705采集16位模拟信号,问题是编译时始终提示main函数”missing return value“ 找不到原因! 也没挂硬件,但是main函数 末尾加了一条 return(0); 问题就解决,为什么会这样喃?望不吝赐教,一定有小东西感谢,谢谢各位兄弟!

一周热门 更多>