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