51学习笔记之以硬件spi与max6675通信实现K型热电偶测温

发布时间:2024-07-24  

硬件:max6675  STC12C5A60S2 K型热电偶


功能:实现读取K型热电偶温度,并通过上位机打印出实际温度


难点:读取Max6675的数据是16位,而STC12系列单片机每次接收的数据为8位,如何通过硬件SPI实现直接读取Max6675的温度成为一难点。网上相关教程以及相关论文均是采用软件SPI模拟时序方式采集数据,故而通过STC12系列单片机自带的硬件SPI实现直接读取Max6675的数据具有实际研究意义。


代码:


#include "reg51.h"

#include "stdio.h"

#include           //??_nop_()????

#define MASTER //define:master undefine:slave

#define FOSC 11059200L

#define BAUD (256 - FOSC / 32 / 9600)  //253

typedef unsigned char BYTE;

typedef unsigned int WORD;

typedef unsigned long DWORD;

sfr AUXR = 0x8e; //Auxiliary register

sfr SPSTAT = 0xcd; //SPI status register

#define SPIF 0x80 //SPSTAT.7

#define WCOL 0x40 //SPSTAT.6

sfr SPCTL = 0xce; //SPI control register

#define SSIG 0x80 //SPCTL.7

#define SPEN 0x40 //SPCTL.6

#define DORD 0x20 //SPCTL.5

#define MSTR 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

sfr SPDAT = 0xcf; //SPI data register

sbit SPISS = P1^3; //SPI slave select, connect to slave' SS(P1.4) pin

void InitUart();

void InitSPI();

void SendUart(BYTE dat); //send data to PC

BYTE RecvUart(); //receive data from PC

unsigned int SPISwap(); //swap SPI data between master




void Delay_xms(unsigned int z){        

    unsigned char i, j;

    unsigned int k;

    for(k=0;k        _nop_();

        _nop_();

        i = 12;

        j = 84;

        do{while (--j);} 

        while (--i);

    }

    

}


///////////////////////////////////////////////////////////

void main()

{

    unsigned int t;

    unsigned int a= 0x01;

    unsigned int MAX6675_Temp;

    unsigned char Flag_connect;

    InitUart(); //initial UART

    InitSPI(); //initial SPI

    while (1)

    {

        

//        #ifdef MASTER //for master (receive UART data from PC and send it to slave,

//        // in the meantime receive SPI data from slave and send it to PC)

//        SendUart(SPISwap(RecvUart()));

//        #else //for salve (receive SPI data from master and

//        ACC = SPISwap(ACC); // send previous SPI data to master)

//        printf("dd");

//        #endif

        t=SPISwap();

        

    Flag_connect=t&0x04;             //¶Á³öÊý¾ÝµÄD2λÊÇÈȵçżµôÏß±ê־룬¸ÃλΪ1±íʾµôÏߣ¬¸ÃλΪ0±íʾÁ¬½Ó

  Flag_connect=Flag_connect>>2;     //MAX6675ÊÇ·ñÔÚÏß

    t = t<<1;                           //¶Á³öÀ´µÄÊý¾ÝµÄD3~D14ÊÇζÈÖµ

    t = t>>4;

    MAX6675_Temp = t/4-28;                //²âµÃµÄζȵ¥Î»ÊÇ0.25£¬ËùÒÔÒª³ËÒÔ0.25£¨¼´³ýÒÔ4£©²ÅÄܵõ½ÒÔ¶ÈΪµ¥Î»µÄζÈÖµ

    if(Flag_connect==0)       //Flag_connectΪ0±íʾÈȵçżÒÑÁ¬½Ó£¬ÕâʱÏÔʾζÈ

    {

        printf("%dn",MAX6675_Temp);

    }

    else

    {

        printf("δÁ¬ÉÏn");

    } 

        

//        printf("%dn",t);

////        printf("%d n",t/4);

        Delay_xms(1000);

        

        

        

    }

}

///////////////////////////////////////////////////////////

void InitUart()

{

    SCON = 0x5a; //set UART mode as 8-bit variable baudrate

    TMOD = 0x20; //timer1 as 8-bit auto reload mode

    AUXR = 0x40; //timer1 work at 1T mode

    TH1 = TL1 = BAUD; //115200 bps

    TR1 = 1;

}

///////////////////////////////////////////////////////////

void InitSPI()

{

    SPDAT = 0; //initial SPI data

    SPSTAT = SPIF | WCOL; //clear SPI status

    #ifdef MASTER

    SPCTL = SPEN | MSTR; //master mode

    #else

    SPCTL = SPEN; //slave mode

    #endif

}



///////////////////////////////////////////////////////////

void SendUart(BYTE dat)

{

    while (!TI); //wait pre-data sent

    TI = 0; //clear TI flag

    SBUF = dat; //send current data

}

///////////////////////////////////////////////////////////

BYTE RecvUart()

{

    while (!RI); //wait receive complete

    RI = 0; //clear RI flag

    return SBUF; //return receive data

}

///////////////////////////////////////////////////////////

unsigned int SPISwap()

{

    unsigned int temp=0;


    SPISS = 0; //pull low slave SS


    SPDAT = 25; //trigger SPI send

    while (!(SPSTAT & SPIF)); //wait send complete

        SPSTAT = SPIF | WCOL; //clear SPI statusa

    temp = SPDAT;

    temp = temp << 8;


    SPDAT = 45;

    while (!(SPSTAT & SPIF)); //wait send complet    

    temp = temp | SPDAT;

    SPSTAT = SPIF | WCOL; //clear SPI status


    SPISS = 1; //push high slave SS


    return temp; //return received SPI data

}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>