本帖最后由 brew9 于 2020-2-27 14:40 編輯
這里分享一個基于開發板的簡溫度記錄系統,所有模塊均為板載。
以下為實物等圖片:
2020-02-27_142005.png (2.41 MB, 下載次數: 61)
下載附件
2020-2-27 14:28 上傳
2020-02-27_142810.png (66.91 KB, 下載次數: 62)
下載附件
2020-2-27 14:28 上傳
2020-02-27_142706.png (98.6 KB, 下載次數: 63)
下載附件
2020-2-27 14:28 上傳
2020-02-27_130748.png (51.97 KB, 下載次數: 52)
下載附件
2020-2-27 14:28 上傳
- /*
- 這是一個基于開發板的簡易的溫度記錄系統,所有模塊均為板載。
-
- 用數碼管顯示溫度和時間;
- 用時鐘模塊提供時基;
- 用24C02保存溫度數據;
- 用蜂鳴器做操作提示;
- 用串口輸出數據到電腦。
- Key_1啟動溫度記錄,Key_2輸出溫度數據。
- 注:如果沒有時鐘模塊也可以用單片機定時器計時,不過計時精度要差很多。
- */
- #include "config.h"
- #include "timer.h"
- #include "ds18b20.h"
- #include "ds1302.h"
- #include "i2c.h"
- uint8 timer; //定時器計數
- uint8 n = 0; //24c02內存位置變量
- int16 temp; //溫度變量
- //共陰數碼管0-9編碼和位碼
- uchar code seg_tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- uchar code bit_tab[] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
- //用于保存數字對應數碼管編碼的數組
- uchar num_code[8] = {0};
- //啟動記錄和改變延時的位變量
- bit starting,bF;
- //保存當前時間的結構體
- struct sTime cTime;
- //串口通訊初始化
- void T_U_init()
- {
- PCON = 0; //正常波特率(不翻倍)
- TMOD = 0X21; //T0工作方式1,T1工作方式2
- TH0 = 0xdc;
- TL0 = 0x00; //T0初值,10ms溢出
- TH1 = 0xfd;
- TL1 = 0xfd; //設置波特率9600
- IE = 0x82; //打開總中斷、T0中斷。禁止T1、串口中斷
- SCON = 0x40; //串口工作方式1
- TCON = 0x50; //啟動定時器0、1
- }
- //拆分浮點數到num_code數組
- void float2code(float fnum)
- {
- uint8 i = 0;
- uint8 len, point_pos;
- uchar str[8];
- TI = 1;
- sprintf(str, "%.1f", fnum*0.0625);
- TI = 0;
- len = strlen(str);
- if (len>8) return;
- point_pos = len - 2;
-
- //拆分整數部分
- for (i=0; i<point_pos; i++)
- {
- if (i < (point_pos-1)){
- if (str[i]=='-'){
- num_code[i] = 0x40;
- }else{
- num_code[i] = seg_tab[str[i]-0x30];
- }
- }else{
- //小數點左邊的數加上小數點編碼
- num_code[i] = seg_tab[str[i]-0x30] + 0x80;
- }
- }
- //拆分小數部分
- for (i=point_pos; i<len-1; i++)
- {
- num_code[i] = seg_tab[str[i+1]-0x30];
- }
- }
- //刷新溫度
- void ref_temp()
- {
- static int16 backup = 0;
-
- DS18B20_get_temp(&temp); //獲取當前溫度值
- DS18B20_start(); //啟動下一次轉換
-
- //溫度無改變則不處理,減少計算量
- if (backup!=temp)
- {
- float2code(temp); //刷新上次溫度值
- backup = temp;
- }
- }
- //刷新時間
- void ref_time()
- {
- DS1302_get_time(&cTime);
- //獲取時間后把數據拆分到顯示數組中
- num_code[4] = seg_tab[BCD2Dat(cTime.min) / 10];
- num_code[5] = seg_tab[BCD2Dat(cTime.min) % 10];
- num_code[6] = seg_tab[BCD2Dat(cTime.sec) / 10];
- num_code[7] = seg_tab[BCD2Dat(cTime.sec) % 10];
- }
- //8位數碼管顯示函數
- void display()
- {
- uint8 j = 0;
- for (j=0; j<8; j++)
- {
- bit_sel = 1;
- DATA = bit_tab[j];
- bit_sel = 0;
- seg_sel = 1;
- DATA = num_code[j];
- delay_ms(1);
- DATA = 0x00;
- seg_sel = 0;
- }
- }
- //保存當前溫度
- void save_temp(int16 t,uint16 n)
- {
- bit isACK1,isACK2;
- uint8 tmp;
- //將16位溫度數據拆分為低8位和高8位,寫入24c02中
- tmp = t;
- isACK1 = AT24C02_write_byte(n, tmp);
- delay_ms(50);
- tmp = t>>8;
- isACK2 = AT24C02_write_byte(n+1, tmp);
-
- //記錄成功則喇叭響一下
- if (isACK1 && isACK2)
- {
- beep = 0;
- delay_ms(10);
- beep = 1;
- }
- }
- //串口輸出保存的溫度
- void sent_temp()
- {
- uchar tmp,str[6];
- uint16 j;
- int16 t;
- for(j=0; j<255; j=j+2)
- {
- tmp = AT24C02_read_byte(j+1);
-
- //初發讀取24c02加大延時,之后減少延時加快處理速度
- //如果不進行此處理,則可能發生數據丟失
- if(bF)
- {
- delay_ms(10);
- }else{
- delay_ms(1000);
- bF=1;
- }
-
- //重組16位溫度int數據
- t = tmp << 8;
- tmp = AT24C02_read_byte(j);
- delay_ms(10);
- t |= tmp;
- //數據轉換及串口輸出
- TI = 1;
- sprintf(str, "%.2f", t*0.0625);
- printf("%s \n",str);
- while(!TI);
- TI = 0;
- }
- }
- void main()
- {
- uchar s,ts=1; //ts用于保存當前秒數,且必須賦值一個不等于0的值
-
- T_U_init();
- while(1)
- {
- display();
- //檢測時基數據,定時記錄溫度
- if(starting)
- {
- s = BCD2Dat(cTime.sec);
- //只有當秒數變化時才進入判斷步驟
- //此處每2秒記錄一次(可加入ds1302的分鐘數據加大間隔時間)
- if(s % 2 == 0 && s != ts)
- {
- save_temp(temp,n);
- n=n+2;
-
- //n初值為0,第一次記錄數據后不再為0,所以不會進入結束。
- //當n=254時,記錄最后一次數據,再加2后n為0,結束。
- if(n == 0)
- {
- starting = 0;
- beep = 0;
- delay_ms(10);
- beep = 1;
- }
- }
- ts = s;
- }
-
- //按鍵設置
- if (KEY_1==0)
- {
- delay_ms(10);
- if (KEY_1==0)
- {
- //初始化1302時把其分和秒對應內存清零
- DS1302_init();
- starting = 1;
- }
- while(!KEY_1);
- }
- if (KEY_2==0)
- {
- delay_ms(10);
- if (KEY_2==0)
- {
- sent_temp();
- }
- while(!KEY_2);
- }
- }
- }
- void timer0_service(void) interrupt 1
- {
- TH0 = 0xdc;
- TL0 = 0x00;
- timer++;
- if (timer == 100)
- {
- timer = 0;
- ref_temp();
- ref_time();
- }
- }
復制代碼
|