找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2686|回复: 2
收起左侧

[请教]普中51单片机与max6675芯片用k型热电偶检测温度的问题

[复制链接]
ID:170626 发表于 2017-3-14 15:00 | 显示全部楼层 |阅读模式
小白初学,想实现k型热电偶+max6675+stc89c52单片机 组成一个检测温度的系统。
但是上网学着写了段程序,最后显示不出正确的数值。。。想求助各位大大,哪里出问题了。

0.png
回复

使用道具 举报

ID:170626 发表于 2017-3-14 15:01 | 显示全部楼层
附上程序:
#include "reg52.h"//头文件
#include "absacc.h"
#include "math.h"
#include "intrins.h"

#define uchar unsigned char //宏定义
#define uint unsigned int


sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;


sbit SO=P1^0;
sbit SCK=P1^1;
sbit CS=P1^2;


#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

void delay(unsigned int i)
{
        while(i--);        
}

uint Re_Convert (void); //温度转换
void DigDisplay(); //温度显示


uchar qian=0,bai=0,shi=0,ge=0,xiao=0;
uint P_Temp;
float wendu;

uchar code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0~F的值
uchar code xiaoshu[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //显示0~F的值(含小数点)  


void main(void) //主程序
{
        delayNOP();  
        SO =0;
        while(1)  
                {
                        P_Temp=Re_Convert();
                        wendu=0.25*P_Temp;//P_Temp =(1024*P_Temp)/4096   
                        delayNOP();  
              

                        DigDisplay();  
                        
                        P_Temp=0;  
                        wendu=0;   
                }
}


uint Re_Convert() //热电偶转换
{   
        unsigned int i;
        unsigned long tdata;
        tdata=0;
        SCK = 1;
        SO=0;
        CS = 1; //选择从机
        delayNOP();
        CS=0;        
        for(i=0;i<16;i++)
                {
                        tdata = tdata<<1; // 左移一位,或_crol_(temp,1)
                        delayNOP();
                        SCK=0;
                        if(SO == 1)
                                tdata = tdata|0x01; // 若接收到的位为1,则数据的最后一位置1
                        else
                        tdata = tdata & 0xfe; // 否则数据的最后一位置0
                        delayNOP();
                        SCK=1;
                        delayNOP();
                }
                tdata=tdata<<1;
                tdata=tdata>>4;

                return(tdata);
}




void DigDisplay()//温度显示
{  
         
        uchar i;
        uint temp=wendu*10;

               
                                bai=temp%10000/1000;   
                        shi=temp%1000/100;   
                        ge=temp%100/10;   
                        xiao=temp%10;

                        P0=0x0ff;
                        
                        for(i=0;i<4;i++)
                        {
                                switch(i)         //位选,选择点亮的数码管,
                                {
                                        case(3):
                                                LSA=1;LSB=1;LSC=0; P0=smgduan[bai];break;//显示第3位,即百位
                                        case(2):
                                                LSA=0;LSB=1;LSC=0; P0=smgduan[shi];break;//显示第2位,即十位
                                        case(1):
                                                LSA=1;LSB=0;LSC=0; P0=xiaoshu[ge];break;//显示第1位,即个位
                                        case(0):
                                                LSA=0;LSB=0;LSC=0; P0=smgduan[xiao];break;//显示第0位,即小数位
                                }
                                delay(100); //间隔一段时间扫描        
                                P0=0x00;//消隐
                        }
               
}               
回复

使用道具 举报

ID:170626 发表于 2017-3-14 15:01 | 显示全部楼层
跪求大神,是不是热电偶转换那段函数出问题了?不是特别懂串口模拟SPI,不知道有没有写错。
max6675是不是SCK CS SO三个引脚对应程序自己定义的三个I/O口,剩下的VCC和GND接在MCU对应的VCC和GND就好了?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表