找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

一個(gè)簡單的溫度記錄儀制作(51單片機(jī)開發(fā)板+部分源程序)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本帖最后由 brew9 于 2020-2-27 14:40 編輯

這里分享一個(gè)基于開發(fā)板的簡溫度記錄系統(tǒng),所有模塊均為板載。
以下為實(shí)物等圖片:






  1. /*
  2.    這是一個(gè)基于開發(fā)板的簡易的溫度記錄系統(tǒng),所有模塊均為板載。
  3.    
  4.    用數(shù)碼管顯示溫度和時(shí)間;
  5.    用時(shí)鐘模塊提供時(shí)基;
  6.    用24C02保存溫度數(shù)據(jù);
  7.    用蜂鳴器做操作提示;
  8.    用串口輸出數(shù)據(jù)到電腦。

  9.    Key_1啟動(dòng)溫度記錄,Key_2輸出溫度數(shù)據(jù)。

  10.    注:如果沒有時(shí)鐘模塊也可以用單片機(jī)定時(shí)器計(jì)時(shí),不過計(jì)時(shí)精度要差很多。
  11. */

  12. #include "config.h"
  13. #include "timer.h"
  14. #include "ds18b20.h"
  15. #include "ds1302.h"
  16. #include "i2c.h"

  17. uint8 timer;        //定時(shí)器計(jì)數(shù)
  18. uint8 n = 0;        //24c02內(nèi)存位置變量
  19. int16 temp;        //溫度變量

  20. //共陰數(shù)碼管0-9編碼和位碼
  21. uchar code seg_tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  22. uchar code bit_tab[] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};

  23. //用于保存數(shù)字對應(yīng)數(shù)碼管編碼的數(shù)組
  24. uchar num_code[8] = {0};

  25. //啟動(dòng)記錄和改變延時(shí)的位變量
  26. bit starting,bF;

  27. //保存當(dāng)前時(shí)間的結(jié)構(gòu)體
  28. struct sTime cTime;

  29. //串口通訊初始化
  30. void T_U_init()
  31. {
  32.         PCON = 0;        //正常波特率(不翻倍)
  33.         TMOD = 0X21;         //T0工作方式1,T1工作方式2
  34.         TH0 = 0xdc;
  35.         TL0 = 0x00;         //T0初值,10ms溢出
  36.         TH1 = 0xfd;
  37.         TL1 = 0xfd;        //設(shè)置波特率9600
  38.         IE = 0x82;        //打開總中斷、T0中斷。禁止T1、串口中斷
  39.         SCON = 0x40;        //串口工作方式1
  40.         TCON = 0x50;        //啟動(dòng)定時(shí)器0、1
  41. }

  42. //拆分浮點(diǎn)數(shù)到num_code數(shù)組
  43. void float2code(float fnum)
  44. {
  45.         uint8 i = 0;
  46.         uint8 len, point_pos;
  47.         uchar str[8];

  48.         TI = 1;
  49.         sprintf(str, "%.1f", fnum*0.0625);
  50.         TI = 0;
  51.         len = strlen(str);
  52.         if (len>8) return;
  53.         point_pos = len - 2;
  54.         
  55.         //拆分整數(shù)部分
  56.         for (i=0; i<point_pos; i++)
  57.         {
  58.                 if (i < (point_pos-1)){
  59.                         if (str[i]=='-'){
  60.                                 num_code[i] = 0x40;
  61.                         }else{
  62.                                 num_code[i] = seg_tab[str[i]-0x30];
  63.                         }        
  64.                 }else{
  65.                         //小數(shù)點(diǎn)左邊的數(shù)加上小數(shù)點(diǎn)編碼
  66.                         num_code[i] = seg_tab[str[i]-0x30] + 0x80;        
  67.                 }
  68.         }
  69.         //拆分小數(shù)部分
  70.         for (i=point_pos; i<len-1; i++)
  71.         {
  72.                 num_code[i] = seg_tab[str[i+1]-0x30];
  73.         }
  74. }

  75. //刷新溫度
  76. void ref_temp()
  77. {
  78.         static int16 backup = 0;
  79.         
  80.         DS18B20_get_temp(&temp);                //獲取當(dāng)前溫度值
  81.         DS18B20_start();                        //啟動(dòng)下一次轉(zhuǎn)換
  82.         
  83.         //溫度無改變則不處理,減少計(jì)算量
  84.         if (backup!=temp)
  85.         {
  86.                 float2code(temp);                //刷新上次溫度值
  87.                 backup = temp;
  88.         }
  89. }

  90. //刷新時(shí)間
  91. void ref_time()
  92. {
  93.          DS1302_get_time(&cTime);
  94.          //獲取時(shí)間后把數(shù)據(jù)拆分到顯示數(shù)組中
  95.          num_code[4] = seg_tab[BCD2Dat(cTime.min) / 10];
  96.          num_code[5] = seg_tab[BCD2Dat(cTime.min) % 10];
  97.          num_code[6] = seg_tab[BCD2Dat(cTime.sec) / 10];
  98.          num_code[7] = seg_tab[BCD2Dat(cTime.sec) % 10];
  99. }

  100. //8位數(shù)碼管顯示函數(shù)
  101. void display()
  102. {
  103.         uint8 j = 0;
  104.         for (j=0; j<8; j++)
  105.         {
  106.                 bit_sel = 1;
  107.                 DATA = bit_tab[j];
  108.                 bit_sel = 0;
  109.                 seg_sel = 1;
  110.                 DATA = num_code[j];
  111.                 delay_ms(1);
  112.                 DATA = 0x00;
  113.                 seg_sel = 0;
  114.         }
  115. }
  116. //保存當(dāng)前溫度
  117. void save_temp(int16 t,uint16 n)
  118. {
  119.         bit isACK1,isACK2;
  120.         uint8 tmp;

  121.         //將16位溫度數(shù)據(jù)拆分為低8位和高8位,寫入24c02中
  122.         tmp = t;
  123.         isACK1 = AT24C02_write_byte(n, tmp);

  124.         delay_ms(50);

  125.         tmp = t>>8;
  126.         isACK2 = AT24C02_write_byte(n+1, tmp);
  127.         
  128.         //記錄成功則喇叭響一下
  129.         if (isACK1 && isACK2)
  130.         {
  131.                 beep = 0;
  132.                 delay_ms(10);
  133.                 beep = 1;
  134.         }
  135. }
  136. //串口輸出保存的溫度
  137. void sent_temp()
  138. {
  139.         uchar tmp,str[6];
  140.         uint16 j;
  141.         int16 t;
  142.         for(j=0; j<255; j=j+2)
  143.         {
  144.                 tmp = AT24C02_read_byte(j+1);
  145.                
  146.                 //初發(fā)讀取24c02加大延時(shí),之后減少延時(shí)加快處理速度
  147.                 //如果不進(jìn)行此處理,則可能發(fā)生數(shù)據(jù)丟失
  148.                 if(bF)
  149.                 {        
  150.                         delay_ms(10);
  151.                 }else{
  152.                         delay_ms(1000);
  153.                         bF=1;
  154.                 }
  155.                
  156.                 //重組16位溫度int數(shù)據(jù)
  157.                 t = tmp << 8;

  158.                 tmp = AT24C02_read_byte(j);
  159.                 delay_ms(10);
  160.                 t |= tmp;

  161.                 //數(shù)據(jù)轉(zhuǎn)換及串口輸出
  162.                 TI = 1;
  163.                 sprintf(str, "%.2f", t*0.0625);
  164.                 printf("%s \n",str);
  165.                 while(!TI);
  166.                 TI = 0;
  167.         }
  168. }

  169. void main()
  170. {
  171.         uchar s,ts=1;        //ts用于保存當(dāng)前秒數(shù),且必須賦值一個(gè)不等于0的值
  172.                
  173.         T_U_init();

  174.         while(1)
  175.         {
  176.                 display();

  177.                 //檢測時(shí)基數(shù)據(jù),定時(shí)記錄溫度
  178.                 if(starting)
  179.                 {
  180.                         s = BCD2Dat(cTime.sec);
  181.                         //只有當(dāng)秒數(shù)變化時(shí)才進(jìn)入判斷步驟
  182.                         //此處每2秒記錄一次(可加入ds1302的分鐘數(shù)據(jù)加大間隔時(shí)間)
  183.                         if(s % 2 == 0 && s != ts)
  184.                         {
  185.                                 save_temp(temp,n);
  186.                                 n=n+2;
  187.                                 
  188.                                 //n初值為0,第一次記錄數(shù)據(jù)后不再為0,所以不會(huì)進(jìn)入結(jié)束。
  189.                                 //當(dāng)n=254時(shí),記錄最后一次數(shù)據(jù),再加2后n為0,結(jié)束。
  190.                                 if(n == 0)
  191.                                 {
  192.                                         starting = 0;

  193.                                         beep = 0;
  194.                                         delay_ms(10);
  195.                                         beep = 1;
  196.                                 }
  197.                         }
  198.                         ts = s;
  199.                 }
  200.                
  201.                 //按鍵設(shè)置
  202.                 if (KEY_1==0)
  203.                 {
  204.                         delay_ms(10);
  205.                         if (KEY_1==0)
  206.                         {
  207.                                 //初始化1302時(shí)把其分和秒對應(yīng)內(nèi)存清零
  208.                                 DS1302_init();
  209.                                 starting = 1;
  210.                         }
  211.                         while(!KEY_1);
  212.                 }
  213.                 if (KEY_2==0)
  214.                 {
  215.                         delay_ms(10);
  216.                         if (KEY_2==0)
  217.                         {
  218.                                 sent_temp();
  219.                         }
  220.                         while(!KEY_2);
  221.                 }
  222.         }
  223. }

  224. void timer0_service(void) interrupt 1
  225. {
  226.         TH0 = 0xdc;
  227.         TL0 = 0x00;
  228.         timer++;
  229.         if (timer == 100)
  230.         {
  231.                 timer = 0;
  232.                 ref_temp();
  233.                 ref_time();
  234.         }

  235. }
復(fù)制代碼



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

使用道具 舉報(bào)

沙發(fā)
ID:27254 發(fā)表于 2021-3-4 08:10 | 只看該作者
樓主你好!能否把全部代碼發(fā)上來參考一下,謝謝!
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

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