MAX6675

news/2024/7/4 1:47:15

许久没有学新东西,整一下Max6675吧

MCU用了STC15W408,串口输出

#include "stc15.h"
#include "intrins.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;

#define FOSC 11059200L          //系统频率
#define BAUD 115200             //串口波特率

#define NONE_PARITY     0       //无校验
#define ODD_PARITY      1       //奇校验
#define EVEN_PARITY     2       //偶校验
#define MARK_PARITY     3       //标记校验
#define SPACE_PARITY    4       //空白校验

#define PARITYBIT NONE_PARITY   //定义校验位



#define S1_S0 0x40              //P_SW1.6
#define S1_S1 0x80              //P_SW1.7


bit busy;

unsigned int temp_k = 0;
sbit spi_cs_pin = P1^7;
sbit spi_dat_pin = P1^6;
sbit spi_sck_pin = P1^5;


void SendData(BYTE dat);
void SendString(char *s);

#define DLY_SET 100
void delay(unsigned long i)
{
    while(i--);
}

void delay_l(unsigned long i)
{
    while(i--);
}


void main()
{

    unsigned char spi_rcv_cnt = 0;

    P1M0 = 0xa0;
    P1M1 = 0x00;

    P3M0 = 0x00;
    P3M1 = 0x00;

    P5M0 = 0x00;
    P5M1 = 0x00;


    ACC = P_SW1;
    ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=0
    P_SW1 = ACC;                //(P3.0/RxD, P3.1/TxD)
    
//  ACC = P_SW1;
//  ACC &= ~(S1_S0 | S1_S1);    //S1_S0=1 S1_S1=0
//  ACC |= S1_S0;               //(P3.6/RxD_2, P3.7/TxD_2)
//  P_SW1 = ACC;  
//  
//  ACC = P_SW1;
//  ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=1
//  ACC |= S1_S1;               //(P1.6/RxD_3, P1.7/TxD_3)
//  P_SW1 = ACC;  

#if (PARITYBIT == NONE_PARITY)
    SCON = 0x50;                //8位可变波特率
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
    SCON = 0xda;                //9位可变波特率,校验位初始为1
#elif (PARITYBIT == SPACE_PARITY)
    SCON = 0xd2;                //9位可变波特率,校验位初始为0
#endif

    T2L = (65536 - (FOSC/4/BAUD));   //设置波特率重装值
    T2H = (65536 - (FOSC/4/BAUD))>>8;
    AUXR = 0x14;                //T2为1T模式, 并启动定时器2
    AUXR |= 0x01;               //选择定时器2为串口1的波特率发生器
    ES = 1;                     //使能串口1中断
    EA = 1;

    SendString("Sys boot ... \r\n");
    while(1)
    {
        delay_l(100000);
        spi_sck_pin = 0;
        
        spi_cs_pin = 0;

        delay(DLY_SET);
        
        temp_k = 0;

        for(spi_rcv_cnt = 0;spi_rcv_cnt < 16;spi_rcv_cnt ++)
        {
            temp_k <<= 1;
            spi_sck_pin = 0;
            delay(DLY_SET);
            spi_sck_pin = 1;
            delay(DLY_SET);

            if(spi_dat_pin == 0)
            {
                // temp_k &= 0xfffe;
            }
			else
			{
				temp_k |= 0x00001;
			}

            // spi_sck_pin = 0;
        }
        spi_sck_pin = 0;
        spi_cs_pin = 1;

        if(temp_k & 0x04)
        {
            P10 = 1;   
            // SendString("Sensor disconncted ... \r\n");
        }
        else
        {
            P10 = 0;
            // SendString("Sensor connected ... \r\n");
        }

        temp_k >>= 5;

        temp_k -= 5;
        
        SendString("Temp: ");
        SendData(temp_k/100+0x30);
        SendData(temp_k%100/10+0x30);
        SendData(temp_k%100%10+0x30);
        SendString("\n\r");

    }
}

/*----------------------------
UART 中断服务程序
-----------------------------*/
void Uart() interrupt 4
{
    if (RI)
    {
        RI = 0;                 //清除RI位
        P0 = SBUF;              //P0显示串口数据
        P22 = RB8;              //P2.2显示校验位
    }
    if (TI)
    {
        TI = 0;                 //清除TI位
        busy = 0;               //清忙标志
    }
}

/*----------------------------
发送串口数据
----------------------------*/
void SendData(BYTE dat)
{
    while (busy);               //等待前面的数据发送完成
    ACC = dat;                  //获取校验位P (PSW.0)
    if (P)                      //根据P来设置校验位
    {
#if (PARITYBIT == ODD_PARITY)
        TB8 = 0;                //设置校验位为0
#elif (PARITYBIT == EVEN_PARITY)
        TB8 = 1;                //设置校验位为1
#endif
    }
    else
    {
#if (PARITYBIT == ODD_PARITY)
        TB8 = 1;                //设置校验位为1
#elif (PARITYBIT == EVEN_PARITY)
        TB8 = 0;                //设置校验位为0
#endif
    }
    busy = 1;
    SBUF = ACC;                 //写数据到UART数据寄存器
}

/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)
{
    while (*s)                  //检测字符串结束标志
    {
        SendData(*s++);         //发送当前字符
    }
}




偷懒,直接用了阻塞式延时delay。。。

去掉了小数部分

采样需要时间

CS置高后6675更新数据

断开热电偶时P10置高,LED熄灭

MAX6675小模块测量值比万用表测量值高6摄氏度左右,直接测量值减去6作为输出值

采用打火机加热铠装热电偶,才500度不到就发红了,测试完毕!

Over!


http://www.niftyadmin.cn/n/643932.html

相关文章

工厂方法模式解决流水号生成问题

工厂方法模式以可移植的、可扩展的方式来生成流水号EJB应用中的一个难点。现在比较成熟的流水号生成策略有全局唯一标识&#xff08;即UUID&#xff09;和使用数据库内置流水号生成策略。全局唯一标识有单件模式、根据网络标识&#xff08;Mac地址&#xff0b;IP&#xff0b;JV…

mysql慢查询设置

show variables like slow_query_log; show variables like long_query_time; show variables like slow_query_log_file; show variables like log_queries_not_using_indexes; set global log_queries_not_using_indexesON; #设置开启记录无索引查询的功能 一、MySQL数…

大意了~checksum 到的低级问题

发送的数据需要在尾端做累加取反&#xff0c;但没有留意到最后一个字节&#xff08;累加取反值&#xff09;不用参与累加&#xff0c;因此累加值总是不对&#xff0c;浪费了好多时间&#xff01;&#xff01;&#xff01;

JAVA关键字大全

Java关键字的大致含义 关键字 含义 abstract 表明类或者成员方法具有抽象属性 assert 用来进行程序调试 boolean 基本数据类型之一&#xff0c;布尔类型 break 提前跳出一个块 byte 基本数据类型之一&#xff0c;字节类型 case 用在switch语句之中&#xff0c;表示其中的一个分…

CentOS6.4安装Zookeeper-3.4.12图解教程

注&#xff1a;图片如果损坏&#xff0c;点击文章链接&#xff1a;https://www.toutiao.com/i6595380916590215683/ 安装工具 VMware_workstation_full_12.5.2 CentOS6-Base-163 CentOS-6.4-x86_64-bin-DVD1.iso VM运行配置 双击运行VM 运行界面 点击下一步 如图操作&…

多对多记录的数据设计方式

A表中的一条记录对应B表的多条记录&#xff0c;例如&#xff1a;Posts表中&#xff0c;一条Post记录&#xff0c;可能属于多个Category&#xff0c;即对应多个PostCategories表中的数据B表中的一条记录对应A标的多条记录&#xff0c;例如&#xff1a;PostCategories表中&#x…

串口异步通信——时序宽度测试

一般情况下串口“bit 1 ”与“bit 0”宽度能基本维持对等&#xff0c;脉宽接近&#xff0c;把串口&#xff1a;“0x55”理解为一个占空比为50% 的方波&#xff0c;在占空比接近50%的情况下&#xff0c;通信一般不会出现错误。 但是&#xff0c;在一些脉宽有损失的场景中&#x…

北京好玩的博物馆

作者&#xff1a;鼎革链接&#xff1a;http://www.zhihu.com/question/20405263/answer/16385266来源&#xff1a;知乎著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。五星级推荐&#xff0c;去了还要再去的&#xff1a; 故宫博物院&#xff…