找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 5189|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)+MAX6675不能實(shí)時(shí)顯示問題,已調(diào)試到崩潰了

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:592477 發(fā)表于 2019-9-1 23:07 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
20黑幣
參考了網(wǎng)上的很多例程,溫度能讀取正常的,但無論怎樣都不能實(shí)時(shí)刷新顯示溫度,重新打開電源或者使用獨(dú)立按鍵按下就能讀取更新一次溫度????已經(jīng)調(diào)試到崩潰了!

單片機(jī)源程序如下:
  1. #include<intrins.h>
  2. #include "reg51.h"                         //此文件中定義了單片機(jī)的一些特殊功能寄存器
  3. #include "oled.h"

  4. sbit SO=P1^1;                                 
  5. sbit SCK=P1^3;                        
  6. sbit CS=P1^2;
  7. sbit key = P3^3;
  8.                                 
  9. unsigned int MAX6675_Temp;
  10.                                        
  11. void delay(unsigned int i)
  12. {
  13.         while(i--);        
  14. }


  15. unsigned int Re_Convert() //熱電偶數(shù)據(jù)讀取,返回溫度
  16. {
  17.         long int a=0x7ff8;
  18.         long int wendu=0,wendu_1;
  19.         float wendu_2;
  20.     unsigned int i;
  21.         CS=1;
  22.         SCK=0;
  23.         delay(200);
  24.         _nop_();
  25.         _nop_();
  26.         CS=0;
  27.         for(i=1;i<=16;i++)
  28.           {        wendu=wendu<<1;
  29.                 _nop_();
  30.                  SCK=1;
  31.                 if(SO==1){wendu=wendu|0x01;}
  32.                    else wendu=wendu|0x00;
  33.                 _nop_();
  34.                 _nop_();
  35.                 SCK=0;
  36.                 _nop_();
  37.                 _nop_();
  38.           }
  39.         wendu_1=wendu&a;
  40.         wendu_1=wendu_1>>3;
  41.         wendu_2=wendu_1*0.25;
  42.                
  43.         return wendu_2;                        //返回帶兩位小數(shù)的實(shí)際溫度

  44. }

  45. void main()
  46. {        

  47.                 OLED_Init();                        //初始化OLED  
  48.                 OLED_Clear();
  49.                
  50.         while(1)
  51.         {
  52.                 if(key==0)
  53.                 {
  54.                         delay(1000);
  55.                         if(key==0)
  56.                                 {
  57.                                         while(key==0);
  58.                                         MAX6675_Temp=Re_Convert();
  59.                                 }
  60.                 }
  61.                
  62.                 OLED_ShowNum(103,6,MAX6675_Temp,3,16);
  63.         
  64.         }               
  65. }
復(fù)制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:213173 發(fā)表于 2019-9-2 08:10 | 只看該作者
你把采樣MAX6675_Temp=Re_Convert();放在按鍵程序中當(dāng)然只有按一次鍵才能更新一次數(shù)據(jù),這么可能實(shí)時(shí)更新?
回復(fù)

使用道具 舉報(bào)

板凳
ID:425825 發(fā)表于 2019-9-2 08:11 | 只看該作者
如果能讀取一次準(zhǔn)確溫度,問題還是出在程序上
回復(fù)

使用道具 舉報(bào)

地板
ID:138097 發(fā)表于 2019-9-2 09:09 | 只看該作者
while(key==0);這是干什么,仿真看看,是不是卡死在這里了。。
回復(fù)

使用道具 舉報(bào)

5#
ID:105206 發(fā)表于 2019-9-2 09:27 | 只看該作者
以上程序是按鍵按下彈起才能讀溫度。
void main()
{        
unsigned int i;
                OLED_Init();                        //初始化OLED  
                OLED_Clear();
               
        while(1)
        {
                if(key==0)
                {
                        delay(1000);
                        if(key==0)
                                {
                                        while(key==0);
                                       
                                }
                }
i++;if(i==500)
{
i=0;
MAX6675_Temp=Re_Convert();
}
               
                OLED_ShowNum(103,6,MAX6675_Temp,3,16);
        
        }               
}
回復(fù)

使用道具 舉報(bào)

6#
ID:592477 發(fā)表于 2019-9-2 09:42 來自觸屏版 | 只看該作者
whx.000 發(fā)表于 2019-9-2 09:09
while(key==0);這是干什么,仿真看看,是不是卡死在這里了。。

并沒有卡死,同樣是讀取溫度放在按鍵判斷中,如果不加判斷按鍵彈起的話,怎么按也不能更新溫度
回復(fù)

使用道具 舉報(bào)

7#
ID:592477 發(fā)表于 2019-9-2 11:04 | 只看該作者
jubaolun 發(fā)表于 2019-9-2 09:27
以上程序是按鍵按下彈起才能讀溫度。
void main()
{        

你這程序也不行啊,從代碼上看,按下按鍵也沒有執(zhí)行讀取溫度的命令,不過我不斷按下按鍵的時(shí)候,有時(shí)稍微長按一下,結(jié)果溫度就偶爾有一次變化,否則一直都是“卡死”在之前變化的溫度值上
回復(fù)

使用道具 舉報(bào)

8#
ID:235200 發(fā)表于 2019-9-2 13:03 | 只看該作者
這樣的程序問題,最好把電路也貼出來,看是按鍵的問題還是顯示的問題,程序中判斷(key==0)無電路不能判斷你的程序,另外OLED_ShowNum(103,6,MAX6675_Temp,3,16)這處顯示程序就更看不出來是否正確不正確了
回復(fù)

使用道具 舉報(bào)

9#
ID:383215 發(fā)表于 2019-9-2 15:40 | 只看該作者
MAX6675早就調(diào)試出來,感覺沒有任何壓力,我就是參考下面的程序調(diào)試出來的:
#include <REGX52.H>
#include "intrins.h"                        //_nop_();延時(shí)函數(shù)用
#define uchar unsigned char
#define uint  unsigned int
sbit  SO  = P0^6;                                  //P3.6口與SO相連
sbit  SCK = P0^4;                                 //P3.4口與SCK相連
sbit  CS  = P0^5;                                  //P3.5口與CS相連
static uchar tempture[4];
static unsigned int MAX6675_Temp;
const uchar DevID = 1;                //本機(jī)設(shè)備ID
static uchar Flag_connect;
void DelayMs(unsigned int i);
unsigned int MAX6675_ReadReg(void)
{
        unsigned char i;   
        unsigned int dat;
        i   = 0;   
        dat = 0;  

        SCK = 0;   
        CS  = 0;
        _nop_();
        SCK = 1;
          
        for(i=0; i<16; i++)                //get D15-D0 from 6675  
        {      
                SCK = 0;
                _nop_();
                dat = dat<<1;
                  
                if( SO == 1 )   
                        dat = dat | 0x01;   

                SCK = 1;
                _nop_();           
        }
        CS = 1;  
          
        return dat;   
}  
/*
* 功  能:延時(shí),若干毫秒
* 參  數(shù):毫秒數(shù)
* 返回值:無
*/
void DelayMs(unsigned int i)        //一個(gè)延時(shí)函數(shù),這個(gè)函數(shù)在11.0592M晶振下的延時(shí)時(shí)間大概為1ms
{
        unsigned int j,k;

        for(j=i; j>0; j--)
                for(k=114; k>0; k--);
}
/*
* 功  能:串口初始化
* 參  數(shù):無
* 返回值:無
*/

void init_serialcomm( void )
{
        SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
        TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
        PCON |= 0x80 ; //SMOD=1;
        TH1=0XF3;                                //計(jì)數(shù)器初始值設(shè)置,注意波特率是4800的
        TL1=0XF3;
        IE |= 0x90 ; //Enable Serial Interrupt
        TR1 = 1 ; // timer 1 run
        // TI=1;
//        ES=1;                                                //打開接收中斷
//        EA=1;                                                //打開總中斷
//        TR1=1;                                        //打開計(jì)數(shù)器
}
//向串口發(fā)送一個(gè)字符
void send_char_com( unsigned char ch)
{
        SBUF = ch;
        while (TI == 0 );
        TI = 0 ;
}
//向串口發(fā)送一個(gè)字符串,strlen為該字符串長度
void send_string_com( unsigned char *str, unsigned int strlen)
{
        unsigned int k= 0 ;
        do
        {
        send_char_com(*(str + k));
        k++;
        }
        while (k < strlen);
}

void display(uint temp)
{
        uchar *n;

        tempture[0]=(temp % 10000)/1000 | 0x30;
        tempture[1]=(temp % 1000)/100 | 0x30;
        tempture[2]=(temp % 100)/10 | 0x30;
        tempture[3]=temp % 10 | 0x30;       
        n= &tempture;
        send_string_com( n , 4 );
               
}
void main(void)
{
        unsigned int t=0,j=0;
        unsigned int Temp=0;
        unsigned int id=0;
       
        P0=0x00;
        init_serialcomm();                        // 串口初始化

        while(1)
        {               
                t = MAX6675_ReadReg();
               
                  Flag_connect = t & 0x04;                         //讀出數(shù)據(jù)的D2位是熱電偶掉線標(biāo)志位,該位為1表示掉線,該位為0表示連接
                  Flag_connect = Flag_connect >> 2;         //MAX6675是否在線
               
                id = t & 0x02;
                id = id >> 1;

                if(Flag_connect==0)
                {
                        t = t<<1;                                                   //讀出來的數(shù)據(jù)的D3~D14是溫度值
                        t = t>>4;
                        MAX6675_Temp = t/4;                                //測得的溫度單位是0.25,所以要乘以0.25(即除以4)才能得到以度為單位的溫度值               
                        Temp = Temp + MAX6675_Temp;
                        j=j+1;
                        if(j==20)
                        {
                                Temp=Temp/20-32;
                                j=0;

                                send_string_com( "讀取的溫度值為:", 16);
                                display(Temp);
                                send_string_com( " ℃", 3); // ℃
                                Temp=0;
                                               
                                DelayMs(500);                                       
                        }
                }
                                               
                else       
                {
                        send_string_com( "熱電偶未連接", 12);
                         DelayMs(500);
                }

        }
}

我調(diào)試成功之后讀16位數(shù)據(jù)的程序是這個(gè)樣子:
unsigned int MAX6675_ReadReg( void )
{
        unsigned char i;   
        unsigned int dat;
         
        i   = 0;   
        dat = 0;  

        sck = 0;   
        cs  = 0;
        _nop_( ) ;
       
        for(i=0; i<16; i++)                //get D15-D0 from 6675  
        {      
                sck = 1;
                _nop_( ) ;
                dat <<= 1 ;
                if ( so == 1 )
                {
                        dat |= 0x01 ;
                }
                sck = 0 ;
        }
        cs = 1;  
        return dat;   
}  

回復(fù)

使用道具 舉報(bào)

10#
ID:606937 發(fā)表于 2019-9-3 16:02 | 只看該作者
不要按鍵一直讀的話,6675早就被讀死了,仔細(xì)看看間隔時(shí)間。
回復(fù)

使用道具 舉報(bào)

11#
ID:564490 發(fā)表于 2019-10-11 14:58 | 只看該作者
兩次讀MAX6675的時(shí)間間隔大于300ms就可以了,手冊(cè)上有具體的記不清了。
回復(fù)

使用道具 舉報(bào)

12#
ID:700054 發(fā)表于 2022-3-10 20:54 | 只看該作者
w_xmai 發(fā)表于 2019-10-11 14:58
兩次讀MAX6675的時(shí)間間隔大于300ms就可以了,手冊(cè)上有具體的記不清了。

感謝感謝,這個(gè)max6675讀取要間隔讀取呢,不然就卡死了,我說我調(diào)了半天都沒出來
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表