欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STC89C52單片機eeprom開機次數檢測+DS18B20數碼管顯示+DS1302的LCD1602時間顯示程序
[打印本頁]
作者:
1276327078
時間:
2022-4-14 17:47
標題:
STC89C52單片機eeprom開機次數檢測+DS18B20數碼管顯示+DS1302的LCD1602時間顯示程序
基于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
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1