久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6479|回復: 1
打印 上一主題 下一主題
收起左側

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

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

這里分享一個基于開發板的簡溫度記錄系統,所有模塊均為板載。
以下為實物等圖片:






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

  9.    Key_1啟動溫度記錄,Key_2輸出溫度數據。

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

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

  17. uint8 timer;        //定時器計數
  18. uint8 n = 0;        //24c02內存位置變量
  19. int16 temp;        //溫度變量

  20. //共陰數碼管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. //用于保存數字對應數碼管編碼的數組
  24. uchar num_code[8] = {0};

  25. //啟動記錄和改變延時的位變量
  26. bit starting,bF;

  27. //保存當前時間的結構體
  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;        //設置波特率9600
  38.         IE = 0x82;        //打開總中斷、T0中斷。禁止T1、串口中斷
  39.         SCON = 0x40;        //串口工作方式1
  40.         TCON = 0x50;        //啟動定時器0、1
  41. }

  42. //拆分浮點數到num_code數組
  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.         //拆分整數部分
  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.                         //小數點左邊的數加上小數點編碼
  66.                         num_code[i] = seg_tab[str[i]-0x30] + 0x80;        
  67.                 }
  68.         }
  69.         //拆分小數部分
  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);                //獲取當前溫度值
  81.         DS18B20_start();                        //啟動下一次轉換
  82.         
  83.         //溫度無改變則不處理,減少計算量
  84.         if (backup!=temp)
  85.         {
  86.                 float2code(temp);                //刷新上次溫度值
  87.                 backup = temp;
  88.         }
  89. }

  90. //刷新時間
  91. void ref_time()
  92. {
  93.          DS1302_get_time(&cTime);
  94.          //獲取時間后把數據拆分到顯示數組中
  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位數碼管顯示函數
  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. //保存當前溫度
  117. void save_temp(int16 t,uint16 n)
  118. {
  119.         bit isACK1,isACK2;
  120.         uint8 tmp;

  121.         //將16位溫度數據拆分為低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.                 //初發讀取24c02加大延時,之后減少延時加快處理速度
  147.                 //如果不進行此處理,則可能發生數據丟失
  148.                 if(bF)
  149.                 {        
  150.                         delay_ms(10);
  151.                 }else{
  152.                         delay_ms(1000);
  153.                         bF=1;
  154.                 }
  155.                
  156.                 //重組16位溫度int數據
  157.                 t = tmp << 8;

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

  161.                 //數據轉換及串口輸出
  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用于保存當前秒數,且必須賦值一個不等于0的值
  172.                
  173.         T_U_init();

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

  177.                 //檢測時基數據,定時記錄溫度
  178.                 if(starting)
  179.                 {
  180.                         s = BCD2Dat(cTime.sec);
  181.                         //只有當秒數變化時才進入判斷步驟
  182.                         //此處每2秒記錄一次(可加入ds1302的分鐘數據加大間隔時間)
  183.                         if(s % 2 == 0 && s != ts)
  184.                         {
  185.                                 save_temp(temp,n);
  186.                                 n=n+2;
  187.                                 
  188.                                 //n初值為0,第一次記錄數據后不再為0,所以不會進入結束。
  189.                                 //當n=254時,記錄最后一次數據,再加2后n為0,結束。
  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.                 //按鍵設置
  202.                 if (KEY_1==0)
  203.                 {
  204.                         delay_ms(10);
  205.                         if (KEY_1==0)
  206.                         {
  207.                                 //初始化1302時把其分和秒對應內存清零
  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. }
復制代碼



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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人在线免费 | 日韩精品一区二区三区在线 | 亚洲图片一区二区三区 | 全部免费毛片在线播放网站 | 人人鲁人人莫人人爱精品 | 欧美精品久久久 | 中文在线亚洲 | 亚洲精品日韩精品 | 久久av一区 | 国产精品日日做人人爱 | 超碰一区二区 | 一区影院| 91最新在线视频 | 91福利在线观看视频 | 成人国产一区二区三区精品麻豆 | 欧美久久久久久久 | 久久伊人影院 | 九九九久久国产免费 | 久久久久久国产精品久久 | 桃色五月 | 欧美成人精品在线观看 | 干出白浆视频 | 色综合久久久 | 男人的天堂在线视频 | 狠狠草视频 | 日韩www视频 | 天天综合网7799精品 | 精品国产精品国产偷麻豆 | 国产精品一区2区 | 夜夜草 | 国产精品日韩一区 | 国产xxx在线观看 | 色综合久久久久 | 欧美一区二区三区在线观看视频 | 国产在线观看一区二区 | 国产丝袜一区二区三区免费视频 | 精品国产精品一区二区夜夜嗨 | 成人夜晚看av | 羞羞色视频 | 99久久免费精品视频 | 国产一区二区三区四区在线观看 |