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

QQ登錄

只需一步,快速開始

搜索
查看: 2617|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)K型熱電偶測(cè)溫工具制作 源程序MAX6675+TM1621

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:507428 發(fā)表于 2022-10-25 21:10 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
K型測(cè)溫模塊
        這款測(cè)溫計(jì)靈感來自孫老師發(fā)的測(cè)溫計(jì)視頻,我進(jìn)行了PCB和代碼的重做,使外形更小巧 ,使用STC8G1K08A-SOP8來替代STM8L(代價(jià)是功耗提高了一些)
        我的視頻鏈接:測(cè)溫小工具---K型熱電偶測(cè)溫
2、模塊參數(shù)
  • 大約平均功耗1mA
  • 尺寸36mm*20mm
  • 測(cè)量精度±2℃
  • 測(cè)溫范圍0~999℃
3、K型測(cè)溫計(jì)涉及的主要知識(shí)點(diǎn)
         1、SPI通信
         2、如何驅(qū)動(dòng)TM1621斷碼屏的IC
         3、如何與MAX6675通信
         4、怎么樣選擇硬件,使其較少的硬件資源,來完成所需功能
         5、如何使用一個(gè)IO口識(shí)別兩個(gè)按鍵
         6、STC8G的低功耗使用,和使用細(xì)節(jié)(其實(shí)實(shí)際功耗還是蠻高的,也算不上低功耗(*  ̄︿ ̄))
         7、STC8G的EEPROM使用,和使用細(xì)節(jié)
4、焊接說明
         推薦焊接順序:頂層貼片的IC和元器件-->底層的冷端接插端子-->紐扣電池座-->LCD斷碼屏(務(wù)必把屏幕放到最后焊)
         重點(diǎn)留意事項(xiàng)。
        a、STC8G單片機(jī)需要提前燒錄好代碼,在焊接;
        b、冷端接插端子需要提前插入一次,使其開口變大,這樣在焊接時(shí)就不用特意預(yù)留空隙

5、最后說明
          關(guān)于物料,我在原理圖的元器件參數(shù)里面有放了寶鏈接,可根據(jù)需要更換或入手;
          關(guān)于STC-ISP的下載配置和二次移植注意事項(xiàng),見附錄里面的壓縮包相關(guān)TXT文件,里面也有我寫的源碼文件,采用的是模塊化編程,如果需要TM1621等模塊代碼請(qǐng)自取,如有疑惑,請(qǐng)留言或私信,在我所不多的知識(shí)里為你提供參考

6、實(shí)拍圖


    本次程序使用的是STC8G1K08A-SOP8單片機(jī),由于引腳受限,所以在給TM1621
    和MAX6675通信時(shí),采用的是一個(gè)IO連接,由于MAX6675的數(shù)據(jù)是輸出給單片機(jī),
    而TM1621是單片機(jī)發(fā)送數(shù)據(jù)給它,所以當(dāng)MAX6675的數(shù)據(jù)腳和TM1621的數(shù)據(jù)腳
    連在一起,使用普通的IO模式是無法對(duì)這兩個(gè)進(jìn)行正常通信的。
    解決辦法:在MAX6675的數(shù)據(jù)口串聯(lián)一個(gè)電阻,并且在單片機(jī)數(shù)據(jù)端口接一個(gè)上拉電阻5~10K左右(重要提示。。。
          (在和TM1621通信時(shí)需要有上拉電阻,和MAX6675通信時(shí)可以不用上拉電阻)
            為了降低功耗,需要對(duì)上拉電阻進(jìn)行開關(guān)控制(也可以一直接著上拉電阻,只是功耗高一些而已)
            正好STC8G內(nèi)部集成了上拉電阻和控制,所以程序上會(huì)有控制上拉電阻開關(guān)的代碼

單片機(jī)源程序如下:
  1. /*
  2. * @Name           SPI_Soft_config
  3. * @Brief          軟件SPI相關(guān)配置
  4. * @Author          飛羽(2022-09-07)
  5. * @Param          None       
  6. * @Return         None       
  7. * @Others        (包含所需頭文件:Soft_SPI.h)       
  8.                         軟件實(shí)現(xiàn)的SPI的相關(guān)引腳在Soft_SPI.h里面定義,需要根據(jù)實(shí)際情況進(jìn)行修改
  9.                         引腳配置由SPI_Soft_GPIO_Init()函數(shù)實(shí)現(xiàn),被GPIO_config()調(diào)用
  10. */
  11. void SPI_Soft_config(void)
  12. {
  13.         SPI_Soft_t.SPI_Mode = SPI_SOFT_MASTER;                //SPI_SOFT_MASTER,SPI_SOFT_SLAVE
  14.         SPI_Soft_t.SPI_CPOL = HIGH;                                        //時(shí)鐘極性 HIGH,LOW
  15.         SPI_Soft_t.SPI_CPHA = SPI_SOFT_2EDGE;                //時(shí)鐘相位SPI_SOFT_1EDGE,  SPI_SOFT_2EDGE,數(shù)據(jù)采樣時(shí)的邊沿
  16.         SPI_Soft_t.SPI_Speed_us = 20;                                //0~65535,這里是指一個(gè)SCLK脈沖的時(shí)間(注意us延時(shí)不是很準(zhǔn)確,請(qǐng)根據(jù)實(shí)際情況來修改)                               
  17.         SPI_Soft_t.SPI_Data_Time_Div = TIME_DIV_2;        //采集數(shù)據(jù)的時(shí)間除數(shù),TIME_DIV_5, TIME_DIV_3, TIME_DIV_2  (SPI_Speed_us / SPI_Data_Time_Div)
  18.         SPI_Soft_t.SPI_OPEN_IO_MODE  = GPIO_PullUp;  //數(shù)據(jù)傳輸時(shí)的IO模式  GPIO_PullUp、GPIO_OUT_OD,這里為了兼容主/從機(jī)模式時(shí)的數(shù)據(jù)傳輸功能,沒有特定吧MOSI或MISO設(shè)置成高組模式
  19.         SPI_Soft_t.SPI_First_Bit = SPI_SOFT_MSB;        //數(shù)據(jù)傳輸數(shù)據(jù)位模式,SPI_SOFT_MSB(高位在前),SPI_SOFT_LSB(低位在前)
  20. //        SPI_Soft_t.SPI_Soft_ss_GPIO  = SPI_SOFT_SS_GPIO;
  21. //        SPI_Soft_t.SPI_Soft_ss_PIN   = SPI_SOFT_SS_PIN;
  22.         SPI_Change_MAX6675();
  23. //        SPI_Change_TM1621();
  24. }


  25. /*
  26. * @Name           System_Init
  27. * @Brief          系統(tǒng)初始化
  28. * @Author          飛羽
  29. * @Param          None       
  30. * @Return         None
  31. * @Others        寫入所有想要初始化的外設(shè)函數(shù)
  32. */
  33. void System_Init(void)
  34. {
  35.         RSTCFG &= 0XBF;                //關(guān)閉低壓復(fù)位,降低功耗
  36.        
  37.         Switch_config();
  38.         SPI_Soft_config();
  39.         GPIO_config();
  40.        
  41.         SPI_Change_TM1621();
  42.         TM1621_Init();
  43.         //EA_ENABLE();       

  44.         set_pdModeCount = ONE_MINUTE_COUNT*60;                //第一次燒錄程序時(shí)初始化進(jìn)入掉電模式的時(shí)間,即默認(rèn)為60分鐘
  45.         K_Off_Count = 0;
  46.        
  47.         P_SW2 = 0x80;
  48.         IRC32KCR = 0x80; //啟動(dòng)內(nèi)部 32K IRC
  49.         while (!(IRC32KCR & 1)); //等待時(shí)鐘穩(wěn)定
  50.         CLKDIV = 0x00; //時(shí)鐘不分頻
  51.         CKSEL = 0x03; //選擇內(nèi)部 32K
  52.         P_SW2 = 0x00;
  53.        
  54.         APP_Read_EEPROM();                //導(dǎo)出EEPROM內(nèi)容
  55.        
  56.         if(set_pdModeCount < ONE_MINUTE_COUNT){        //設(shè)定值最少為1分鐘
  57.                 set_pdModeCount = ONE_MINUTE_COUNT;
  58.         }
  59.        
  60. //delay_ms(250);
  61.   delay_ms(200);
  62. }



  63. /*
  64. * @Name           System_Run
  65. * @Brief          系統(tǒng)運(yùn)行函數(shù)
  66. * @Author          飛羽
  67. * @Param          None       
  68. * @Return         None
  69. * @Others        None
  70. */
  71. extern void System_Run(void)
  72. {
  73.         static uint8_t times = 0;
  74.        
  75.         if(TRUE == Is_IntoPdMode()){        //設(shè)定時(shí)間進(jìn)入掉電模式
  76.                 IntoPdMode();
  77.         }
  78.         if(TRUE == Is_K_Off_IntoPdMode()){        //設(shè)定時(shí)間沒有接入K型熱電偶而進(jìn)入掉電模式
  79.                 IntoPdMode();
  80.         }
  81.         sw = SW_Detect();        //按鍵掃描

  82. //使用掉電延時(shí)作為延時(shí),這里結(jié)合外部語句延時(shí),大概為1s延時(shí)時(shí)間       
  83.         WKTCL = 252;                //掉電定時(shí)器喚醒時(shí)間
  84.         if(fun_disp_status == NORMAL) WKTCH = 0X02;                //正常顯示的延時(shí)長(zhǎng)一些,在32K主頻時(shí),這里的時(shí)間,加上其他語句執(zhí)行的時(shí)間才是延時(shí)時(shí)間
  85.         WKTCH |= 0X80;                //打開掉電定時(shí)器喚醒使能

  86.         P3_PULL_UP_DISABLE(GPIO_Pin_3);       
  87.         SPI_SOFT_SCLK_IO = LOW;
  88.         SPI_SOFT_MISO_IO = LOW;
  89.        
  90.         MCU_POWER_DOWN();                //進(jìn)入掉電模式
  91.         WKTCH &= ~0X80;    //關(guān)閉掉電定時(shí)器喚醒使能
  92.        
  93.        
  94. //        delay_ms(250);
  95. //    delay_ms(85);                //這里的毫秒時(shí),在主頻很低時(shí)已沒有實(shí)際意義,因?yàn)槠渌Z句的占用時(shí)間已經(jīng)不能忽略
  96.                                                 //這里一輪的時(shí)間大概約為500ms
  97.                                                 //MAX6675溫度轉(zhuǎn)化延時(shí),必須加,
  98.                                                 //這個(gè)時(shí)間也是長(zhǎng)按刻度時(shí)間,修改后按情況也同步修改“APP_Temperature.c”里面的key_long_times
  99.        
  100.         SPI_Change_MAX6675();
  101.         if(fun_disp_status == NORMAL) {
  102.                 LCD_Show_Normal();
  103.                 pdModeCount++;               
  104.         }
  105.         else if(fun_disp_status == SHOW_MAX_TEMP) {
  106.                 LCD_SHOW_MAX_TEMP();
  107.                
  108.         }
  109.         else if(fun_disp_status == SHOW_MIN_TEMP) {
  110.                 LCD_SHOW_MIN_TEMP();
  111.         }
  112.         else if(fun_disp_status == SET_OFF_TIME) {
  113.                 Set_Off_Time();
  114.         }
  115.         else if(fun_disp_status == INTO_PdMODE) {        //手動(dòng)進(jìn)入掉電模式       
  116.                 Set_Into_PdMode();
  117.         }

  118.        
  119.         if(sw == SW_DOWN) {
  120.                 sw = SW_Detect();        //再次判斷按鍵
  121.                 if(sw == SW_DOWN){
  122.                         pdModeCount = 0;        //每次有按鍵按下,就更新自動(dòng)掉電時(shí)間計(jì)數(shù)               
  123.                         if(pdTime_set_flag == 0){
  124.                                 if(times < 2) {        //2表示長(zhǎng)按時(shí)間次數(shù),長(zhǎng)按刻度時(shí)間由外部的延時(shí)決定
  125.                                         times++;
  126.                                         LCD_Set_Disp_Num(times,DP_SET);        //長(zhǎng)按指示
  127.                                         LCD_Set_Disp_Num(times + 1,DP_SET);        //長(zhǎng)按指示
  128.                                 }
  129.                                 else{
  130.                                         times = 0;
  131.                                         fun_disp_status++;
  132.                                         if(fun_disp_status == FUN_DISP_STATUS_MAX_LEN){        //溢出歸零
  133.                                                 fun_disp_status = 0;
  134.                                         }
  135.                                         key_long_times = 1;                //初始化                                       
  136.                                 }
  137.                                
  138.                         }       
  139.                 }
  140.         }
  141.         else{
  142.                 times = 0;
  143.         }

  144.        
  145.         SPI_Change_TM1621();
  146.         LCD_All_Display();
  147. //        if(pdTime_set_flag == 0) {
  148. //                LCD_Show();
  149. //                Inc_pdModeCount();
  150. //        }
  151. //        else{
  152. //                Set_pdTime();
  153. //        }
  154. }
復(fù)制代碼
Keil代碼下載: K型測(cè)溫計(jì)-STC8G-MAX6675---2022-10-18.7z (1.11 MB, 下載次數(shù): 53)

評(píng)分

參與人數(shù) 1黑幣 +90 收起 理由
admin + 90 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:151348 發(fā)表于 2022-10-29 18:04 | 只看該作者
這種斷碼屏貌似不好買,要么不包郵,還好,之前在賣舊貨店鋪撿垃圾發(fā)現(xiàn)一些就屯起來了,有空也試試
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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