|
基于STC89C52的eeprom開(kāi)機(jī)次數(shù)檢測(cè)+DS18B20數(shù)碼管顯示+DS1302的LCD1602時(shí)間顯示
一、設(shè)計(jì)的技術(shù)要求:
設(shè)計(jì)要求.jpg (275.11 KB, 下載次數(shù): 43)
下載附件
2022-4-14 17:47 上傳
單片機(jī)源程序如下:
- /***********************************************************************************
- ;功能說(shuō)明:STC89C52開(kāi)機(jī)次數(shù)+數(shù)碼管溫度報(bào)警+1602時(shí)間
- ;文件名稱:main.c
- ;版本號(hào):v1.0.0
- ;微處理器:STC89C52
- ;編譯環(huán)境:Keil uVision V4.10
- ;作 者:Cui Xinghai
- ;創(chuàng)建日期:2022.4.9
- ;***********************************************************************************/
- #define _MAIN_C
- #include <REG52.H>
- #include "config.h"
- #include "LCD1602.h"
- #include "LedBuzzer.h"
- #include "I2C.h"
- #include "eeprom.h"
- #include "keyboard.h"
- #include "DS18B20.h"
- #include "DS1302.h"
- #include "main.h"
- #include <reg52.h>
- bit flag100ms = 0; //100ms定時(shí)標(biāo)志
- uint8 T0RH = 0; //T0重載值的高字節(jié)
- uint8 T0RL = 0; //T0重載值的低字節(jié)
- int tempalarm = 26; //溫度蜂鳴器報(bào)警初始值
- uint8 dat;
- extern struct sLedBuff ledBuff; //LED顯示緩沖區(qū),默認(rèn)初值全0,正好達(dá)到上電全亮的效果
- extern unsigned char code LedChar[]; //數(shù)碼管顯示字符轉(zhuǎn)換表
- void main()
- {
- uint8 tmr1s = 10;
- uint8 delay = 1;
- EA = 1; //使能總中斷
- ConfigTimer0(1); //配置T0定時(shí)1ms
- ENLED = 0; //使能U3,選擇控制數(shù)碼管
- ADDR3 = 1; //因?yàn)樾枰獎(jiǎng)討B(tài)改變ADDR0-2的值,所以不需要再初始化了
- dat =E2ReadByte(0x02); //讀取指定地址上的一個(gè)字節(jié)
- LedNumber();
- if (dat>98) dat =0;
- else ++dat;
- E2WriteByte(0x02, dat); //再寫(xiě)回到對(duì)應(yīng)的地址上
-
- InitLcd1602(); //初始化液晶模塊
- Start18B20(); //啟動(dòng)首次溫度轉(zhuǎn)換
- BuzzBeep(); //蜂鳴器提示
- while (1)
- {
- KeyDriver(); //執(zhí)行按鍵驅(qū)動(dòng)
- if (flag100ms) //每隔100ms執(zhí)行以下分支
- {
- flag100ms = 0;
- if (delay > 0)
- {
- delay--;
- if (delay == 0)
- { //本段代碼僅在上電延時(shí)后執(zhí)行一次
- InitDS1302(); //初始化實(shí)時(shí)時(shí)鐘模塊
- }
- continue;
- }
- ShowRealTime(); //時(shí)間顯示刷新
- tmr1s++; //每隔1s執(zhí)行以下分支
- if (tmr1s >= 10)
- {
- tmr1s = 0;
- RefreshTemp(); //溫度刷新顯示
- }
- }
- }
- }
- /* 開(kāi)機(jī)次數(shù)數(shù)碼管顯示 */
- void LedNumber()
- {
- //以下代碼將sec按十進(jìn)制位從低到高依次提取并轉(zhuǎn)為數(shù)碼管顯示字符
- ledBuff.number[3] = LedChar[16];
- ledBuff.number[4] = LedChar[dat%10];
- ledBuff.number[5] = LedChar[dat/10%10];
- }
- /* 溫度刷新函數(shù),讀取當(dāng)前溫度并根據(jù)需要刷新液晶顯示 */
- void RefreshTemp()
- {
- int16 temp;
- int intT, decT; //溫度值的整數(shù)和小數(shù)部分
- static int16 backup = 32767; //保證首次執(zhí)行時(shí)必定刷新
-
- Get18B20Temp(&temp); //獲取當(dāng)前溫度值
- Start18B20(); //啟動(dòng)下一次轉(zhuǎn)換
- intT = temp >> 4; //分離出溫度值整數(shù)部分
- decT = temp & 0xF; //0x0000 0000 0000 1111分離出溫度值小數(shù)部分
- temp_alarm(&intT);
- if (backup != temp) //溫度變化時(shí)刷新液晶顯示
- {
- ledBuff.number[2] = LedChar[intT/10] ; //十位轉(zhuǎn)為ASCII碼
- ledBuff.number[1] = LedChar[intT%10] & 0x7f ; //個(gè)位轉(zhuǎn)為ASCII碼
- ledBuff.number[0] = LedChar[(decT*10) / 16];
- backup = temp; //刷新上次溫度值
- }
- }
- /*溫度蜂鳴器報(bào)警指示*/
- void temp_alarm( int *TEMP)
- {
- if(*TEMP >= tempalarm)
- {
- BuzzBeep();
- }
- else
- {
- BUZZER = 1; //蜂鳴器靜音
- }
- }
- /* 將一個(gè)字節(jié)按十六進(jìn)制格式顯示到屏幕上,(x,y)-屏幕起始坐標(biāo),byt-待顯示字節(jié) */
- void ShowHexByte(uint8 x, uint8 y, uint8 byt)
- {
- uint8 tmp;
- uint8 str[4];
-
- //高四位轉(zhuǎn)為十六進(jìn)制字符
- tmp = byt >> 4;
- if (tmp <= 9)
- str[0] = tmp + '0';
- else
- str[0] = tmp - 10 + 'A';
- //低四位轉(zhuǎn)為十六進(jìn)制字符
- tmp = byt & 0x0F;
- if (tmp <= 9)
- str[1] = tmp + '0';
- else
- str[1] = tmp - 10 + 'A';
- //添加結(jié)束符并顯示到液晶
- str[2] = '\0';
- LcdShowStr(x, y, str);
- }
- /* 讀取DS1302時(shí)間,顯示在液晶屏上 */
- void ShowRealTime()
- {
- struct sTime buf;
- static struct sTime pdata bkp = {0xAA,0xAA,0xAA,0xAA,0xAA,0xAA};
- GetRealTime(&buf);
- if (bkp.year != buf.year) //年變化時(shí)刷新顯示
- {
- ShowHexByte(3, 0, buf.year);
- bkp.year = buf.year;
- }
- if (bkp.mon != buf.mon) //月變化時(shí)刷新顯示
- {
- ShowHexByte(0, 1, buf.mon);
- bkp.mon = buf.mon;
- }
- if (bkp.day != buf.day) //月變化時(shí)刷新顯示
- {
- ShowHexByte(3, 1, buf.day);
- bkp.day = buf.day;
- }
- if (bkp.hour != buf.hour) //小時(shí)變化時(shí)刷新顯示
- {
- ShowHexByte(8, 1, buf.hour);
- bkp.hour = buf.hour;
- }
- if (bkp.min != buf.min) //分鐘變化時(shí)刷新顯示
- {
- ShowHexByte(11, 1, buf.min);
- bkp.min = buf.min;
- }
- if (bkp.sec != buf.sec) //秒變化時(shí)刷新顯示
- {
- ShowHexByte(14, 1, buf.sec);
- bkp.sec = buf.sec;
- }
- }
- /* 配置并啟動(dòng)T0,ms-T0定時(shí)時(shí)間 */
- void ConfigTimer0(uint16 ms)
- {
- uint32 tmp;
-
- tmp = (SYS_MCLK*ms)/1000; //計(jì)算所需的計(jì)數(shù)值
- tmp = 65536 - tmp; //計(jì)算定時(shí)器重載值
- tmp = tmp + 33; //補(bǔ)償中斷響應(yīng)延時(shí)造成的誤差
- T0RH = (uint8)(tmp>>8); //定時(shí)器重載值拆分為高低字節(jié)
- T0RL = (uint8)tmp;
- TMOD &= 0xF0; //清零T0的控制位
- TMOD |= 0x01; //配置T0為模式1
- TH0 = T0RH; //加載T0重載值
- TL0 = T0RL;
- ET0 = 1; //使能T0中斷
- TR0 = 1; //啟動(dòng)T0
- }
- /* T0中斷服務(wù)函數(shù),實(shí)現(xiàn)系統(tǒng)定時(shí)和按鍵掃描 */
- void InterruptTimer0() interrupt 1
- {
- static uint8 tmr100ms = 0;
-
- TH0 = T0RH; //重新加載重載值
- TL0 = T0RL;
- BuzzCtrl(); //蜂鳴器發(fā)聲控制
- LedScan(); //執(zhí)行LED掃描
- // KeyScan(); //執(zhí)行按鍵掃描
- tmr100ms++; //定時(shí)100ms
- if (tmr100ms >= 100)
- {
- tmr100ms = 0;
- flag100ms = 1;
- }
- }
復(fù)制代碼
二、附件內(nèi)容
uTools_1649929264495.png (15.3 KB, 下載次數(shù): 46)
下載附件
2022-4-14 17:47 上傳
三、文件附件
Keil代碼下載:
STC89C52-BOOT.zip
(833.77 KB, 下載次數(shù): 35)
2022-4-14 17:46 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
下載2:https://github.com/cuixh11/STC89C52-BOOT
|
評(píng)分
-
查看全部評(píng)分
|