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

硬件:max6675  STC12C5A60S2 K型热电偶

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

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

代码:

#include "reg51.h"
#include "stdio.h"
#include<intrins.h>           //??_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<z;k++){            //for???????1ms??
        _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;             //?á3?êy?Yμ?D2??ê?èèμ???μ???±ê????£??????a1±íê?μ???£??????a0±íê?á??ó
  Flag_connect=Flag_connect>>2;     //MAX6675ê?·??ú??
    t = t<<1;                           //?á3?à′μ?êy?Yμ?D3~D14ê????è?μ
    t = t>>4;
    MAX6675_Temp = t/4-28;                //2aμ?μ????èμ¥??ê?0.25£??ùò?òa3?ò?0.25£¨?′3yò?4£?2??üμ?μ?ò??è?aμ¥??μ????è?μ
    if(Flag_connect==0)       //Flag_connect?a0±íê?èèμ???ò?á??ó£??aê±??ê????è
    {
        printf("%d\n",MAX6675_Temp);
    }
    else
    {
        printf("?′á?é?\n");
    } 

//        printf("%d\n",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
}
时间: 2024-07-30 13:50:19

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

ArcGIS JS 学习笔记1 用ArcGIS JS 实现仿百度地图的距离量测和面积量测

一.开篇 在博客注册了三年,今天才决定写第一篇博客,警告自己不要懒!!! 二.关于ArcGIS JS 版本选择 在写这篇博客时ArcGIS JS 4.0正式版已经发布.它和3.x版本的不同是,Map不在是一个控件,而真的只是一张“图”,Map(4.0版本)需要在一个View里面来展示,在MapView里面就是一张平面图,在SceneView里面就一张三维地图.同一张地图在不同的View里面就可以呈现出不同的效果.但是4.0版本才是一个最初的版本,还有很多3.x有的功能没有被加入到其中.所以我打算

51学习笔记之关键词data、bdata、idata、pdata、xdata、code的含义

最近用51单片机做个小项目,编写程序时,出现如下错误 MAIN.C(284): error C249: 'PDATA': SEGMENT TOO LARGEMAIN.C(284): error C249: 'DATA': SEGMENT TOO LARGE 当时还不知道怎么回事,后来才发现51单片机的ram比较小,只有128b,所以要省着使用 当你定义数组不用更改时,就用uchar code XX[10]= 根据你数据的用处,你可以有以下几种选择: data:直接寻址的片内RAM区低128B(0

51学习笔记之使用printf打印串口数据

#include<reg51.h> #include<stdio.h> void UartInit(void) //初始化波特率为9600 { SCON=0x50; TMOD=0x20; TCON=0x40; TH1=0xfd; TI=1; TR1=1; } void main() { UartInit(); printf("hello world"); //输出一次数据 while(1); }

51学习笔记之以总线方式实现1602与8051连接

//以总线方式实现8051与1602的通信 //这个程序主要实现功能是向1602发送一串字符串,并显示出来 #include<reg52.h> #include<absacc.h> #define uchar unsigned char #define uint unsigned int #define LCDDDATA XBYTE[0xffff] //读数据地址 #define LCDXDATA XBYTE[0xfdff] //写数据地址 #define LCDDCOM XBYT

HTML5 学习笔记四(跨文档消息通信)

一.同域 父→子  方法: ⒈iframe对象:父页面的iframe中的子页面,父的iframe对象的contentWindow即为子window对象. ⒉父通过window.open()方法,其方法接收子url作为参数,方法返回值为子window对象. 子→父 方法: ⒈iframe:在父页面的iframe中,子页面的parent(window.parent)对象为父window. ⒉使用open()方法的父子,其子页面的window.openner即为父window对象. 二.跨域 在父窗口

2016年4月24日_JAVA学习笔记_多线程三_线程间通信

1.毕老师第十四天内容,线程间的通信.大概是使用wait(),notify()等一系列函数来控制各个线程的CPU执行资格和执行权,通过合适的时机在各个线程当中切换来达到线程间通信的目的. 涉及到的方法: wait():让线程处于等待状态,被wait()的线程会被存储到线程池当中,直到被唤醒.只能在同步方法中被调用. notify():随机选择一个在该对象上调用wait方法的线程,解除其阻塞状态.只能在同步方法和同步代码块中被调用. notifyAll():接触所有在该对象上调用wait()方法的

Angularjs学习笔记(四)----与后端服务器通信

一.使用$http进行XHR和JSONP请求 1.1 XHR请求 GET:$http.get(url,config) POST:$http.post(url,data,config) PUT:$http.put(url,data,config) DELETE:$http.delete(url,config) HEAD:$http.head 1.2 JSONP请求 $http.jsonp(url,config) 1.3 方法参数说明 url:调用目标URL data:请求体中送出的数据 confi

vue.js学习笔记(4)— 父子组件之间通信的第一种方式 props 和 $emit

我们知道,vue组件中,父组件把数组传递给子组件的话,通常是使用props传递,而vue规定,prop是只能单向下行传递的,那么子组件要怎么才能实现数据的向上传递呢,这里引述一个概念:"父子组件的关系:prop向下传递,事件向上传递",上一篇文章当中,关于数据向上传递用到的事件方法 $emit() 也进行了详细的说明,不懂的童鞋可以翻回去看一下.下面就是今天要说的父子组件相互通信的问题,点击效果依次如下: 代码如下: <!DOCTYPE html> <html>

树莓派学习笔记 1 -- 硬件的需求以及raspbian系统的安装

树莓派(Raspberry Pi) --  基于Linux系统的大小只有信用卡大小的卡片式机器.  按照发明者的想法,他是想降低学习程序开发的成本而设计制作的这款产品.你可以理解为一个简陋版的电脑.树莓派这是一个卡片,你需要买各种外设,然后自己DIY任何你想的,你可以的作品. Note:我使用的是最新的B+板. 一:硬件需求 话不多说,我们先来看看最基本的硬件需求. 这需要上面这几个才能使用一个完整的树莓派.树莓派对外设的要求是比较严的,很多外设不一定能支持,这个可以在买的时候询问商家. 1,无