最后一次优化和调整代码,增加支持keil4的中文注释。
This commit is contained in:
@@ -0,0 +1,198 @@
|
||||
$NOMOD51
|
||||
;------------------------------------------------------------------------------
|
||||
; This file is part of the C51 Compiler package
|
||||
; Copyright (c) 1988-2005 Keil Elektronik GmbH and Keil Software, Inc.
|
||||
; Version 8.01
|
||||
;
|
||||
; *** <<< Use Configuration Wizard in Context Menu >>> ***
|
||||
;------------------------------------------------------------------------------
|
||||
; STARTUP.A51: This code is executed after processor reset.
|
||||
;
|
||||
; To translate this file use A51 with the following invocation:
|
||||
;
|
||||
; A51 STARTUP.A51
|
||||
;
|
||||
; To link the modified STARTUP.OBJ file to your application use the following
|
||||
; Lx51 invocation:
|
||||
;
|
||||
; Lx51 your object file list, STARTUP.OBJ controls
|
||||
;
|
||||
;------------------------------------------------------------------------------
|
||||
;
|
||||
; User-defined <h> Power-On Initialization of Memory
|
||||
;
|
||||
; With the following EQU statements the initialization of memory
|
||||
; at processor reset can be defined:
|
||||
;
|
||||
; <o> IDATALEN: IDATA memory size <0x0-0x100>
|
||||
; <i> Note: The absolute start-address of IDATA memory is always 0
|
||||
; <i> The IDATA space overlaps physically the DATA and BIT areas.
|
||||
IDATALEN EQU 80H
|
||||
;
|
||||
; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF>
|
||||
; <i> The absolute start address of XDATA memory
|
||||
XDATASTART EQU 0
|
||||
;
|
||||
; <o> XDATALEN: XDATA memory size <0x0-0xFFFF>
|
||||
; <i> The length of XDATA memory in bytes.
|
||||
XDATALEN EQU 0
|
||||
;
|
||||
; <o> PDATASTART: PDATA memory start address <0x0-0xFFFF>
|
||||
; <i> The absolute start address of PDATA memory
|
||||
PDATASTART EQU 0H
|
||||
;
|
||||
; <o> PDATALEN: PDATA memory size <0x0-0xFF>
|
||||
; <i> The length of PDATA memory in bytes.
|
||||
PDATALEN EQU 0H
|
||||
;
|
||||
;</h>
|
||||
;------------------------------------------------------------------------------
|
||||
;
|
||||
;<h> Reentrant Stack Initialization
|
||||
;
|
||||
; The following EQU statements define the stack pointer for reentrant
|
||||
; functions and initialized it:
|
||||
;
|
||||
; <h> Stack Space for reentrant functions in the SMALL model.
|
||||
; <q> IBPSTACK: Enable SMALL model reentrant stack
|
||||
; <i> Stack space for reentrant functions in the SMALL model.
|
||||
IBPSTACK EQU 0 ; set to 1 if small reentrant is used.
|
||||
; <o> IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF>
|
||||
; <i> Set the top of the stack to the highest location.
|
||||
IBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1
|
||||
; </h>
|
||||
;
|
||||
; <h> Stack Space for reentrant functions in the LARGE model.
|
||||
; <q> XBPSTACK: Enable LARGE model reentrant stack
|
||||
; <i> Stack space for reentrant functions in the LARGE model.
|
||||
XBPSTACK EQU 0 ; set to 1 if large reentrant is used.
|
||||
; <o> XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF>
|
||||
; <i> Set the top of the stack to the highest location.
|
||||
XBPSTACKTOP EQU 0xFFFF +1 ; default 0FFFFH+1
|
||||
; </h>
|
||||
;
|
||||
; <h> Stack Space for reentrant functions in the COMPACT model.
|
||||
; <q> PBPSTACK: Enable COMPACT model reentrant stack
|
||||
; <i> Stack space for reentrant functions in the COMPACT model.
|
||||
PBPSTACK EQU 0 ; set to 1 if compact reentrant is used.
|
||||
;
|
||||
; <o> PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF>
|
||||
; <i> Set the top of the stack to the highest location.
|
||||
PBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1
|
||||
; </h>
|
||||
;</h>
|
||||
;------------------------------------------------------------------------------
|
||||
;
|
||||
; Memory Page for Using the Compact Model with 64 KByte xdata RAM
|
||||
; <e>Compact Model Page Definition
|
||||
;
|
||||
; <i>Define the XDATA page used for PDATA variables.
|
||||
; <i>PPAGE must conform with the PPAGE set in the linker invocation.
|
||||
;
|
||||
; Enable pdata memory page initalization
|
||||
PPAGEENABLE EQU 0 ; set to 1 if pdata object are used.
|
||||
;
|
||||
; <o> PPAGE number <0x0-0xFF>
|
||||
; <i> uppermost 256-byte address of the page used for PDATA variables.
|
||||
PPAGE EQU 0
|
||||
;
|
||||
; <o> SFR address which supplies uppermost address byte <0x0-0xFF>
|
||||
; <i> most 8051 variants use P2 as uppermost address byte
|
||||
PPAGE_SFR DATA 0A0H
|
||||
;
|
||||
; </e>
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
; Standard SFR Symbols
|
||||
ACC DATA 0E0H
|
||||
B DATA 0F0H
|
||||
SP DATA 81H
|
||||
DPL DATA 82H
|
||||
DPH DATA 83H
|
||||
|
||||
NAME ?C_STARTUP
|
||||
|
||||
|
||||
?C_C51STARTUP SEGMENT CODE
|
||||
?STACK SEGMENT IDATA
|
||||
|
||||
RSEG ?STACK
|
||||
DS 1
|
||||
|
||||
EXTRN CODE (?C_START)
|
||||
PUBLIC ?C_STARTUP
|
||||
|
||||
CSEG AT 0
|
||||
?C_STARTUP: LJMP STARTUP1
|
||||
|
||||
RSEG ?C_C51STARTUP
|
||||
|
||||
STARTUP1:
|
||||
|
||||
IF IDATALEN <> 0
|
||||
MOV R0,#IDATALEN - 1
|
||||
CLR A
|
||||
IDATALOOP: MOV @R0,A
|
||||
DJNZ R0,IDATALOOP
|
||||
ENDIF
|
||||
|
||||
IF XDATALEN <> 0
|
||||
MOV DPTR,#XDATASTART
|
||||
MOV R7,#LOW (XDATALEN)
|
||||
IF (LOW (XDATALEN)) <> 0
|
||||
MOV R6,#(HIGH (XDATALEN)) +1
|
||||
ELSE
|
||||
MOV R6,#HIGH (XDATALEN)
|
||||
ENDIF
|
||||
CLR A
|
||||
XDATALOOP: MOVX @DPTR,A
|
||||
INC DPTR
|
||||
DJNZ R7,XDATALOOP
|
||||
DJNZ R6,XDATALOOP
|
||||
ENDIF
|
||||
|
||||
IF PPAGEENABLE <> 0
|
||||
MOV PPAGE_SFR,#PPAGE
|
||||
ENDIF
|
||||
|
||||
IF PDATALEN <> 0
|
||||
MOV R0,#LOW (PDATASTART)
|
||||
MOV R7,#LOW (PDATALEN)
|
||||
CLR A
|
||||
PDATALOOP: MOVX @R0,A
|
||||
INC R0
|
||||
DJNZ R7,PDATALOOP
|
||||
ENDIF
|
||||
|
||||
IF IBPSTACK <> 0
|
||||
EXTRN DATA (?C_IBP)
|
||||
|
||||
MOV ?C_IBP,#LOW IBPSTACKTOP
|
||||
ENDIF
|
||||
|
||||
IF XBPSTACK <> 0
|
||||
EXTRN DATA (?C_XBP)
|
||||
|
||||
MOV ?C_XBP,#HIGH XBPSTACKTOP
|
||||
MOV ?C_XBP+1,#LOW XBPSTACKTOP
|
||||
ENDIF
|
||||
|
||||
IF PBPSTACK <> 0
|
||||
EXTRN DATA (?C_PBP)
|
||||
MOV ?C_PBP,#LOW PBPSTACKTOP
|
||||
ENDIF
|
||||
|
||||
MOV SP,#?STACK-1
|
||||
|
||||
; This code is required if you use L51_BANK.A51 with Banking Mode 4
|
||||
;<h> Code Banking
|
||||
; <q> Select Bank 0 for L51_BANK.A51 Mode 4
|
||||
#if 0
|
||||
; <i> Initialize bank mechanism to code bank 0 when using L51_BANK.A51 with Banking Mode 4.
|
||||
EXTRN CODE (?B_SWITCH0)
|
||||
CALL ?B_SWITCH0 ; init bank mechanism to code bank 0
|
||||
#endif
|
||||
;</h>
|
||||
LJMP ?C_START
|
||||
|
||||
END
|
||||
@@ -0,0 +1,156 @@
|
||||
/******************************************************************************
|
||||
* 文件名:ds1302.c
|
||||
* 功能:DS1302 实时时钟驱动
|
||||
* 说明:提供读写 DS1302 的底层函数,以及时间和闹钟参数的存取。
|
||||
* 时间以 BCD 码格式存储于 TIME 数组中。
|
||||
* 硬件接口:DSIO=P3^4,RST=P3^5,SCLK=P3^6
|
||||
* 编译器:Keil C51
|
||||
******************************************************************************/
|
||||
|
||||
#include"ds1302.h"
|
||||
|
||||
/* DS1302 读写地址(存储顺序:秒、分、时、日、月、周、年) */
|
||||
uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
|
||||
uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
|
||||
|
||||
/* DS1302 默认时间:2013 年 1 月 1 日 星期二 12:00:00 */
|
||||
/* 存储顺序:秒、分、时、日、月、周、年(BCD 码) */
|
||||
uchar TIME[7] = {0, 0, 0x12, 0x01, 0x01, 0x02, 0x13};
|
||||
|
||||
/******************************************************************************
|
||||
* 函数名:Ds1302Write
|
||||
* 功能:向 DS1302 写入一字节数据(先写地址,再写数据)
|
||||
* 输入:addr = 寄存器地址,dat = 要写入的数据
|
||||
* 输出:无
|
||||
* 时序:RST 置高 → 写入 8 位地址(低位在前)→ 写入 8 位数据(低位在前)→ RST 置低
|
||||
******************************************************************************/
|
||||
void Ds1302Write(uchar addr, uchar dat)
|
||||
{
|
||||
uchar n;
|
||||
|
||||
RST = 0;
|
||||
_nop_();
|
||||
|
||||
SCLK = 0; /* 时钟先置低 */
|
||||
_nop_();
|
||||
RST = 1; /* 使能 DS1302 */
|
||||
_nop_();
|
||||
|
||||
for(n = 0; n < 8; n++) /* 发送 8 位地址(低位在前) */
|
||||
{
|
||||
DSIO = addr & 0x01; /* 输出当前位 */
|
||||
addr >>= 1;
|
||||
SCLK = 1; /* 时钟上升沿,DS1302 锁存数据 */
|
||||
_nop_();
|
||||
SCLK = 0;
|
||||
_nop_();
|
||||
}
|
||||
|
||||
for(n = 0; n < 8; n++) /* 发送 8 位数据(低位在前) */
|
||||
{
|
||||
DSIO = dat & 0x01;
|
||||
dat >>= 1;
|
||||
SCLK = 1;
|
||||
_nop_();
|
||||
SCLK = 0;
|
||||
_nop_();
|
||||
}
|
||||
|
||||
RST = 0; /* 结束通信 */
|
||||
_nop_();
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* 函数名:Ds1302Read
|
||||
* 功能:从 DS1302 读取一字节数据(先写地址,再读数据)
|
||||
* 输入:addr = 寄存器地址
|
||||
* 输出:返回读取到的数据
|
||||
* 时序:RST 置高 → 写入 8 位地址(低位在前)→ 读取 8 位数据(高位在前)→ RST 置低
|
||||
******************************************************************************/
|
||||
uchar Ds1302Read(uchar addr)
|
||||
{
|
||||
uchar n, dat, dat1;
|
||||
|
||||
RST = 0;
|
||||
_nop_();
|
||||
|
||||
SCLK = 0; /* 时钟先置低 */
|
||||
_nop_();
|
||||
RST = 1; /* 使能 DS1302 */
|
||||
_nop_();
|
||||
|
||||
for(n = 0; n < 8; n++) /* 发送 8 位地址(低位在前) */
|
||||
{
|
||||
DSIO = addr & 0x01;
|
||||
addr >>= 1;
|
||||
SCLK = 1;
|
||||
_nop_();
|
||||
SCLK = 0; /* 下降沿后 DS1302 输出数据 */
|
||||
_nop_();
|
||||
}
|
||||
_nop_();
|
||||
|
||||
for(n = 0; n < 8; n++) /* 读取 8 位数据(高位在前) */
|
||||
{
|
||||
dat1 = DSIO; /* 采样数据线 */
|
||||
dat = (dat >> 1) | (dat1 << 7); /* 高位在前,依次移入 */
|
||||
SCLK = 1;
|
||||
_nop_();
|
||||
SCLK = 0;
|
||||
_nop_();
|
||||
}
|
||||
|
||||
RST = 0; /* 结束通信 */
|
||||
_nop_();
|
||||
|
||||
SCLK = 1; /* 确保时序完整 */
|
||||
_nop_();
|
||||
DSIO = 0;
|
||||
_nop_();
|
||||
DSIO = 1;
|
||||
_nop_();
|
||||
|
||||
return dat;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* 函数名:Ds1302Init
|
||||
* 功能:初始化 DS1302 时钟芯片
|
||||
* 输入:无
|
||||
* 输出:无
|
||||
* 说明:检查秒寄存器的 CH 位。如果 CH=1 表示时钟停止(首次上电),
|
||||
* 则关闭写保护并写入默认时间;如果 CH=0 表示时钟已在运行,跳过初始化。
|
||||
******************************************************************************/
|
||||
void Ds1302Init()
|
||||
{
|
||||
uchar n;
|
||||
uchar sec;
|
||||
|
||||
sec = Ds1302Read(0x81); /* 读取秒寄存器,检查 CH 位(最高位) */
|
||||
if(!(sec & 0x80)) /* CH=0:时钟正在运行,无需初始化 */
|
||||
return;
|
||||
|
||||
/* CH=1:时钟停止,系统首次上电,写入默认时间 */
|
||||
Ds1302Write(0x8E, 0x00); /* 关闭写保护 */
|
||||
for(n = 0; n < 7; n++)
|
||||
{
|
||||
Ds1302Write(WRITE_RTC_ADDR[n], TIME[n]);
|
||||
}
|
||||
Ds1302Write(0x8E, 0x80); /* 开启写保护 */
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* 函数名:Ds1302ReadTime
|
||||
* 功能:读取 DS1302 当前时间到 TIME 数组
|
||||
* 输入:无
|
||||
* 输出:无(结果存入全局 TIME 数组)
|
||||
******************************************************************************/
|
||||
void Ds1302ReadTime()
|
||||
{
|
||||
uchar n;
|
||||
|
||||
for(n = 0; n < 7; n++)
|
||||
{
|
||||
TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
/******************************************************************************
|
||||
* 文件名:ds1302.h
|
||||
* 功能:DS1302 实时时钟驱动头文件
|
||||
* 硬件接口:DSIO = P3^4,RST = P3^5,SCLK = P3^6
|
||||
* 编译器:Keil C51
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __DS1302_H_
|
||||
#define __DS1302_H_
|
||||
|
||||
#include<reg51.h>
|
||||
#include<intrins.h>
|
||||
|
||||
/* 自定义数据类型 */
|
||||
#ifndef uchar
|
||||
#define uchar unsigned char
|
||||
#endif
|
||||
|
||||
#ifndef uint
|
||||
#define uint unsigned int
|
||||
#endif
|
||||
|
||||
/* DS1302 引脚定义 */
|
||||
sbit DSIO = P3^4; /* 数据线 */
|
||||
sbit RST = P3^5; /* 复位/使能引脚(CE) */
|
||||
sbit SCLK = P3^6; /* 串行时钟线 */
|
||||
|
||||
/* 函数声明 */
|
||||
void Ds1302Write(uchar addr, uchar dat); /* 向 DS1302 写入一字节数据 */
|
||||
uchar Ds1302Read(uchar addr); /* 从 DS1302 读取一字节数据 */
|
||||
void Ds1302Init(void); /* 初始化 DS1302 时钟芯片 */
|
||||
void Ds1302ReadTime(void); /* 读取当前时间到 TIME 数组 */
|
||||
|
||||
/* 外部全局变量 */
|
||||
extern uchar TIME[7]; /* 时间缓冲区:秒、分、时、日、月、周、年(BCD 码) */
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,109 @@
|
||||
#include "ds18b20.h"
|
||||
|
||||
/*
|
||||
* ????????DS18B20_Reset
|
||||
* ???? ????¦ËDS18B20????????????
|
||||
* ???? ????
|
||||
* ??? ??1=?????0=??????
|
||||
*/
|
||||
bit DS18B20_Reset(void)
|
||||
{
|
||||
unsigned int i;
|
||||
unsigned char presence;
|
||||
|
||||
DS18B20_DQ = 0; /* ????????480~960us */
|
||||
for(i=250; i>0; i--); /* DJNZ???: 250*2=500us */
|
||||
DS18B20_DQ = 1; /* ????????DS18B20????15~60us??????60~240us */
|
||||
for(i=10; i>0; i--); /* DJNZ: 10*2=20us, ?????????? */
|
||||
|
||||
presence = DS18B20_DQ; /* ???????????(0=?????1=??????) */
|
||||
|
||||
for(i=200; i>0; i--); /* DJNZ: 200*2=400us, ????????? */
|
||||
|
||||
return (presence == 0); /* ????1?????????????? */
|
||||
}
|
||||
|
||||
/*
|
||||
* ????????DS18B20_WriteByte
|
||||
* ???? ????DS18B20§Õ????????(LSB????)
|
||||
* ???? ??dat=?§Õ???????
|
||||
* ??? ????
|
||||
*/
|
||||
void DS18B20_WriteByte(uchar dat)
|
||||
{
|
||||
unsigned char i, j;
|
||||
|
||||
for(i=0; i<8; i++)
|
||||
{
|
||||
DS18B20_DQ = 0; /* ??????????§Õ?? */
|
||||
if(dat & 0x01) /* §Õ1????????? */
|
||||
DS18B20_DQ = 1;
|
||||
else /* §Õ0?????????? */
|
||||
DS18B20_DQ = 0;
|
||||
for(j=35; j>0; j--); /* DJNZ: 35*2=70us, ?????>=60us */
|
||||
DS18B20_DQ = 1; /* ??????? */
|
||||
dat >>= 1; /* ???¦Ë(LSB first) */
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* ????????DS18B20_ReadByte
|
||||
* ???? ????DS18B20?????????(LSB????)
|
||||
* ???? ????
|
||||
* ??? ????????????
|
||||
*/
|
||||
uchar DS18B20_ReadByte(void)
|
||||
{
|
||||
unsigned char i, j, dat = 0;
|
||||
|
||||
for(i=0; i<8; i++)
|
||||
{
|
||||
DS18B20_DQ = 0; /* ?????????????? */
|
||||
DS18B20_DQ = 1; /* ??????? */
|
||||
for(j=7; j>0; j--); /* DJNZ: 7*2=14us, ???DS18B20???????(~15us) */
|
||||
|
||||
dat >>= 1; /* ?????¦Ë */
|
||||
if(DS18B20_DQ)
|
||||
dat |= 0x80; /* LSB first?????????????¦Ë??????¦Ë */
|
||||
|
||||
for(j=23; j>0; j--); /* DJNZ: 23*2=46us, ?????>=60us */
|
||||
}
|
||||
return dat;
|
||||
}
|
||||
|
||||
/*
|
||||
* ????????DS18B20_StartConvert
|
||||
* ???? ??????DS18B20??????
|
||||
* ???? ????
|
||||
* ??? ????
|
||||
*/
|
||||
void DS18B20_StartConvert(void)
|
||||
{
|
||||
if(!DS18B20_Reset()) return; /* ??¦Ë???????? */
|
||||
DS18B20_WriteByte(0xCC); /* ????ROM */
|
||||
DS18B20_WriteByte(0x44); /* ????????? */
|
||||
}
|
||||
|
||||
/*
|
||||
* ????????DS18B20_ReadTemp
|
||||
* ???? ?????DS18B20??????(16¦Ë)
|
||||
* ???? ??temp=??????????????
|
||||
* ??? ??1=????????0=DS18B20¦Ä???
|
||||
*/
|
||||
bit DS18B20_ReadTemp(int *temp)
|
||||
{
|
||||
uchar tempL, tempH;
|
||||
int raw;
|
||||
|
||||
if(!DS18B20_Reset()) return 0; /* ??¦Ë???????? */
|
||||
DS18B20_WriteByte(0xCC); /* ????ROM */
|
||||
DS18B20_WriteByte(0xBE); /* ??????? */
|
||||
|
||||
tempL = DS18B20_ReadByte(); /* ?????????? */
|
||||
tempH = DS18B20_ReadByte(); /* ?????????? */
|
||||
|
||||
raw = (tempH << 8) | tempL; /* ???16¦Ë???? */
|
||||
*temp = raw;
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
#ifndef __DS18B20_H_
|
||||
#define __DS18B20_H_
|
||||
|
||||
#include<reg51.h>
|
||||
#include<intrins.h>
|
||||
|
||||
/* ????????????? */
|
||||
#ifndef uchar
|
||||
#define uchar unsigned char
|
||||
#endif
|
||||
|
||||
#ifndef uint
|
||||
#define uint unsigned int
|
||||
#endif
|
||||
|
||||
/* DS18B20????????????? */
|
||||
sbit DS18B20_DQ = P3^7;
|
||||
|
||||
/* ???????? */
|
||||
bit DS18B20_Reset(void); /* ??¦ËDS18B20???????? */
|
||||
void DS18B20_WriteByte(uchar dat); /* §Õ???????? */
|
||||
uchar DS18B20_ReadByte(void); /* ????????? */
|
||||
void DS18B20_StartConvert(void); /* ????????? */
|
||||
bit DS18B20_ReadTemp(int *temp); /* ????????? */
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,151 @@
|
||||
/******************************************************************************
|
||||
* 文件名:lcd.c
|
||||
* 功能:LCD1602 液晶显示驱动
|
||||
* 说明:支持 4 位和 8 位数据总线模式,由 LCD1602_4PINS 宏控制。
|
||||
* 当前使用 4 位模式,RS=P2^6,RW=P2^5,EN=P2^7,数据口=P0。
|
||||
* 编译器:Keil C51
|
||||
******************************************************************************/
|
||||
|
||||
#include"lcd.h"
|
||||
|
||||
/******************************************************************************
|
||||
* 函数名:Lcd1602_Delay1ms
|
||||
* 功能:毫秒级延时函数(12MHz 晶振,12T 模式)
|
||||
* 输入:c = 延时毫秒数
|
||||
* 输出:无
|
||||
******************************************************************************/
|
||||
void Lcd1602_Delay1ms(uint c)
|
||||
{
|
||||
uchar a, b;
|
||||
for(; c > 0; c--)
|
||||
{
|
||||
for(b = 199; b > 0; b--)
|
||||
{
|
||||
for(a = 1; a > 0; a--);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* 函数名:LcdWriteCom
|
||||
* 功能:向 LCD1602 写入一个 8 位指令
|
||||
* 输入:com = 指令字节
|
||||
* 输出:无
|
||||
* 说明:根据是否定义 LCD1602_4PINS,编译为 4 位或 8 位模式
|
||||
******************************************************************************/
|
||||
#ifndef LCD1602_4PINS /* 8 位数据线模式 */
|
||||
|
||||
void LcdWriteCom(uchar com)
|
||||
{
|
||||
LCD1602_E = 0; /* 使能信号置低 */
|
||||
LCD1602_RS = 0; /* 选择指令寄存器 */
|
||||
LCD1602_RW = 0; /* 选择写操作 */
|
||||
|
||||
LCD1602_DATAPINS = com; /* 输出指令字节 */
|
||||
Lcd1602_Delay1ms(1); /* 等待数据稳定 */
|
||||
|
||||
LCD1602_E = 1; /* 产生使能脉冲 */
|
||||
Lcd1602_Delay1ms(5); /* 保持高电平 */
|
||||
LCD1602_E = 0;
|
||||
}
|
||||
|
||||
#else /* 4 位数据线模式 */
|
||||
|
||||
void LcdWriteCom(uchar com)
|
||||
{
|
||||
LCD1602_E = 0;
|
||||
LCD1602_RS = 0;
|
||||
LCD1602_RW = 0;
|
||||
|
||||
LCD1602_DATAPINS = com; /* 先送高 4 位 */
|
||||
Lcd1602_Delay1ms(1);
|
||||
LCD1602_E = 1;
|
||||
Lcd1602_Delay1ms(1);
|
||||
LCD1602_E = 0;
|
||||
|
||||
Lcd1602_Delay1ms(1);
|
||||
LCD1602_DATAPINS = com << 4; /* 再送低 4 位 */
|
||||
Lcd1602_Delay1ms(1);
|
||||
LCD1602_E = 1;
|
||||
Lcd1602_Delay1ms(1);
|
||||
LCD1602_E = 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* 函数名:LcdWriteData
|
||||
* 功能:向 LCD1602 写入一个 8 位数据
|
||||
* 输入:dat = 数据字节
|
||||
* 输出:无
|
||||
******************************************************************************/
|
||||
#ifndef LCD1602_4PINS /* 8 位数据线模式 */
|
||||
|
||||
void LcdWriteData(uchar dat)
|
||||
{
|
||||
LCD1602_E = 0; /* 使能信号置低 */
|
||||
LCD1602_RS = 1; /* 选择数据寄存器 */
|
||||
LCD1602_RW = 0; /* 选择写操作 */
|
||||
|
||||
LCD1602_DATAPINS = dat; /* 输出数据字节 */
|
||||
Lcd1602_Delay1ms(1);
|
||||
|
||||
LCD1602_E = 1; /* 产生使能脉冲 */
|
||||
Lcd1602_Delay1ms(5);
|
||||
LCD1602_E = 0;
|
||||
}
|
||||
|
||||
#else /* 4 位数据线模式 */
|
||||
|
||||
void LcdWriteData(uchar dat)
|
||||
{
|
||||
LCD1602_E = 0;
|
||||
LCD1602_RS = 1;
|
||||
LCD1602_RW = 0;
|
||||
|
||||
LCD1602_DATAPINS = dat; /* 先送高 4 位 */
|
||||
Lcd1602_Delay1ms(1);
|
||||
LCD1602_E = 1;
|
||||
Lcd1602_Delay1ms(1);
|
||||
LCD1602_E = 0;
|
||||
|
||||
Lcd1602_Delay1ms(1);
|
||||
LCD1602_DATAPINS = dat << 4; /* 再送低 4 位 */
|
||||
Lcd1602_Delay1ms(1);
|
||||
LCD1602_E = 1;
|
||||
Lcd1602_Delay1ms(1);
|
||||
LCD1602_E = 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* 函数名:LcdInit
|
||||
* 功能:LCD1602 初始化(设置显示模式、开显示、清屏)
|
||||
* 输入:无
|
||||
* 输出:无
|
||||
******************************************************************************/
|
||||
#ifndef LCD1602_4PINS /* 8 位数据线模式初始化 */
|
||||
|
||||
void LcdInit()
|
||||
{
|
||||
LcdWriteCom(0x38); /* 设置显示模式:16x2、5x7 点阵、8 位数据 */
|
||||
LcdWriteCom(0x0c); /* 开显示,不显示光标 */
|
||||
LcdWriteCom(0x06); /* 写入数据后地址自动加 1 */
|
||||
LcdWriteCom(0x01); /* 清屏 */
|
||||
LcdWriteCom(0x80); /* 设置 DDRAM 起始地址为 0x00(第一行) */
|
||||
}
|
||||
|
||||
#else /* 4 位数据线模式初始化 */
|
||||
|
||||
void LcdInit()
|
||||
{
|
||||
LcdWriteCom(0x32); /* 从 8 位模式切换为 4 位模式 */
|
||||
LcdWriteCom(0x28); /* 4 位模式下设置显示模式 */
|
||||
LcdWriteCom(0x0c); /* 开显示,不显示光标 */
|
||||
LcdWriteCom(0x06); /* 写入数据后地址自动加 1 */
|
||||
LcdWriteCom(0x01); /* 清屏 */
|
||||
LcdWriteCom(0x80); /* 设置 DDRAM 起始地址为 0x00(第一行) */
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,39 @@
|
||||
/******************************************************************************
|
||||
* 文件名:lcd.h
|
||||
* 功能:LCD1602 液晶驱动头文件
|
||||
* 硬件接口:4 位数据总线模式
|
||||
* RS = P2^6,RW = P2^5,EN = P2^7,数据口 = P0
|
||||
* 编译器:Keil C51
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __LCD_H_
|
||||
#define __LCD_H_
|
||||
|
||||
/* 使用 4 位数据线模式(注释此行则使用 8 位模式) */
|
||||
#define LCD1602_4PINS
|
||||
|
||||
/* 标准头文件 */
|
||||
#include<reg51.h>
|
||||
|
||||
/* 自定义数据类型 */
|
||||
#ifndef uchar
|
||||
#define uchar unsigned char
|
||||
#endif
|
||||
|
||||
#ifndef uint
|
||||
#define uint unsigned int
|
||||
#endif
|
||||
|
||||
/* LCD 引脚定义 */
|
||||
#define LCD1602_DATAPINS P0 /* LCD 数据口(P0 口) */
|
||||
sbit LCD1602_E = P2^7; /* 使能信号 */
|
||||
sbit LCD1602_RW = P2^5; /* 读写选择:0=写,1=读 */
|
||||
sbit LCD1602_RS = P2^6; /* 寄存器选择:0=指令,1=数据 */
|
||||
|
||||
/* 函数声明 */
|
||||
void Lcd1602_Delay1ms(uint c); /* 毫秒延时(12MHz 晶振) */
|
||||
void LcdWriteCom(uchar com); /* 写入 8 位指令 */
|
||||
void LcdWriteData(uchar dat); /* 写入 8 位数据 */
|
||||
void LcdInit(void); /* 初始化 LCD1602 */
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,603 @@
|
||||
/******************************************************************************
|
||||
* 文件名:main.c
|
||||
* 功能:DS1302 实时时钟 + DS18B20 温度采集 + LCD1602 显示
|
||||
* 支持按键切换时钟/秒表模式,可设置时间。
|
||||
* 硬件配置:
|
||||
* LCD1602(4 位模式):RS=P2^6, RW=P2^5, EN=P2^7, 数据口=P0
|
||||
* DS1302:DSIO=P3^4, RST=P3^5, SCLK=P3^6
|
||||
* DS18B20:DQ=P3^7
|
||||
* 按键:K1=P3^1, K2=P3^0, K3=P3^2, K4=P3^3
|
||||
* 蜂鸣器/报警:已禁用(函数为空)
|
||||
* 编译器:Keil C51
|
||||
******************************************************************************/
|
||||
|
||||
#include<reg51.h>
|
||||
#include<intrins.h>
|
||||
#include"lcd.h"
|
||||
#include"ds1302.h"
|
||||
#include"temp.h"
|
||||
|
||||
|
||||
/*========================== 引脚定义 ==========================*/
|
||||
|
||||
sbit K1 = P3^1; /* 模式切换/确认键 */
|
||||
sbit K2 = P3^0; /* 切换/返回键 */
|
||||
sbit K3 = P3^2; /* 加/开始暂停键 */
|
||||
sbit K4 = P3^3; /* 减/清零键 */
|
||||
|
||||
|
||||
/*========================== 全局变量 ==========================*/
|
||||
|
||||
unsigned char mode = 0; /* 工作模式:0=时钟,2=秒表 */
|
||||
unsigned char last_mode = 0xFF; /* 前一次模式,用于检测模式切换 */
|
||||
int temperature = 0; /* 温度值(放大 10 倍,如 253 表示 25.3°C) */
|
||||
unsigned char temp_state = 0; /* 温度采集状态机:0=空闲,1=转换中 */
|
||||
unsigned int temp_wait = 0; /* 温度转换等待计数器 */
|
||||
|
||||
unsigned char alarm_hour = 6; /* 闹钟小时 */
|
||||
unsigned char alarm_min = 0; /* 闹钟分钟 */
|
||||
unsigned char alarm_on = 0; /* 闹钟开关:0=关,1=开 */
|
||||
|
||||
unsigned int sw_sec = 0; /* 秒表累计秒数 */
|
||||
unsigned char sw_csec = 0; /* 秒表百分秒(0~99) */
|
||||
bit sw_running = 0; /* 秒表运行状态:0=停止,1=运行 */
|
||||
|
||||
|
||||
/*========================== 宏定义 ==========================*/
|
||||
|
||||
/* BCD 码转十进制:0x12 → 12 */
|
||||
#define BCD2DEC(bcd) (((bcd)>>4)*10 + ((bcd)&0x0f))
|
||||
|
||||
/* 十进制转 BCD 码:12 → 0x12 */
|
||||
#define DEC2BCD(dec) (((dec)/10<<4) | ((dec)%10))
|
||||
|
||||
|
||||
/*========================== 函数声明 ==========================*/
|
||||
|
||||
void Delay10ms(void);
|
||||
|
||||
void Timer1Init(void);
|
||||
void TempPros(void);
|
||||
void AlarmJudge(void);
|
||||
void AlarmBuzPro(void);
|
||||
void SetTime(void);
|
||||
void LcdFramework(void);
|
||||
void LcdUpdate(void);
|
||||
void KeyScan(void);
|
||||
|
||||
|
||||
/*======================= 按键检测函数 ========================*/
|
||||
|
||||
/*
|
||||
* K1_Pressed:检测 K1 键是否被按下
|
||||
* 功能:软件消抖,等待按键释放后返回 1
|
||||
* 返回:1=按下了 K1,0=未按下
|
||||
*/
|
||||
bit K1_Pressed(void)
|
||||
{
|
||||
if(K1) return 0; /* 首次检测,高电平表示未按下 */
|
||||
Delay10ms(); /* 软件消抖 */
|
||||
if(K1) return 0; /* 再次检测,确认按下 */
|
||||
while(!K1); /* 等待按键释放 */
|
||||
return 1; /* 有效按下 */
|
||||
}
|
||||
|
||||
/*
|
||||
* K2_Pressed:检测 K2 键是否被按下
|
||||
*/
|
||||
bit K2_Pressed(void)
|
||||
{
|
||||
if(K2) return 0;
|
||||
Delay10ms();
|
||||
if(K2) return 0;
|
||||
while(!K2);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* K3_Pressed:检测 K3 键是否被按下
|
||||
*/
|
||||
bit K3_Pressed(void)
|
||||
{
|
||||
if(K3) return 0;
|
||||
Delay10ms();
|
||||
if(K3) return 0;
|
||||
while(!K3);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* K4_Pressed:检测 K4 键是否被按下
|
||||
*/
|
||||
bit K4_Pressed(void)
|
||||
{
|
||||
if(K4) return 0;
|
||||
Delay10ms();
|
||||
if(K4) return 0;
|
||||
while(!K4);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/*===================== LCD 辅助函数 ======================*/
|
||||
|
||||
/*
|
||||
* LcdWriteStr:在 LCD 当前位置显示字符串
|
||||
* 输入:str = 指向 code 区字符串的指针
|
||||
*/
|
||||
void LcdWriteStr(unsigned char code *str)
|
||||
{
|
||||
while(*str) LcdWriteData(*str++);
|
||||
}
|
||||
|
||||
/*
|
||||
* LcdShowNumAt:在 LCD 指定位置显示两位十进制数
|
||||
* 输入:addr = DDRAM 地址,num = 要显示的数值(0~99)
|
||||
*/
|
||||
void LcdShowNumAt(unsigned char addr, unsigned char num)
|
||||
{
|
||||
LcdWriteCom(addr);
|
||||
LcdWriteData('0' + num / 10); /* 十位 ASCII 码 */
|
||||
LcdWriteData('0' + num % 10); /* 个位 ASCII 码 */
|
||||
}
|
||||
|
||||
/*
|
||||
* AdjustValue:通用参数调节函数
|
||||
* 功能:在指定位置显示数值,K3/K4 加减,K1 确认退出
|
||||
* 光标停留在数值的最后一位上。
|
||||
* 输入:val = 待调节变量指针
|
||||
* maxVal = 最大值
|
||||
* dispAddr = 显示地址
|
||||
* cursorAddr = 光标地址(函数内会自动加 1 移到末位)
|
||||
*/
|
||||
void AdjustValue(unsigned char *val, unsigned char maxVal,
|
||||
unsigned char dispAddr, unsigned char cursorAddr)
|
||||
{
|
||||
LcdWriteCom(cursorAddr + 1); /* 光标放在数值最后一位 */
|
||||
LcdWriteCom(0x0f); /* 显示闪烁光标 */
|
||||
|
||||
while(1)
|
||||
{
|
||||
if(K3_Pressed()) /* K3:加 */
|
||||
{
|
||||
if(*val < maxVal) (*val)++;
|
||||
else *val = 0;
|
||||
LcdShowNumAt(dispAddr, *val);
|
||||
LcdWriteCom(cursorAddr + 1); /* 光标回到末位 */
|
||||
LcdWriteCom(0x0f);
|
||||
}
|
||||
if(K4_Pressed()) /* K4:减 */
|
||||
{
|
||||
if(*val > 0) (*val)--;
|
||||
else *val = maxVal;
|
||||
LcdShowNumAt(dispAddr, *val);
|
||||
LcdWriteCom(cursorAddr + 1);
|
||||
LcdWriteCom(0x0f);
|
||||
}
|
||||
if(K1_Pressed()) /* K1:确认退出 */
|
||||
{
|
||||
LcdWriteCom(0x0c); /* 关闭光标 */
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*========================== 主函数 ==========================*/
|
||||
|
||||
void main()
|
||||
{
|
||||
Timer1Init(); /* 初始化定时器 1(用于秒表计时) */
|
||||
LcdInit(); /* 初始化 LCD1602 液晶 */
|
||||
|
||||
Ds1302Init(); /* 初始化 DS1302 时钟芯片 */
|
||||
|
||||
/* 从 DS1302 RAM 读取闹钟参数(上电保持) */
|
||||
alarm_hour = Ds1302Read(0xC1);
|
||||
if(alarm_hour > 23) alarm_hour = 6; /* 数据异常时使用默认值 */
|
||||
alarm_min = Ds1302Read(0xC3);
|
||||
if(alarm_min > 59) alarm_min = 0;
|
||||
alarm_on = Ds1302Read(0xC5);
|
||||
if(alarm_on > 1) alarm_on = 0;
|
||||
|
||||
/* 主循环 */
|
||||
while(1)
|
||||
{
|
||||
Ds1302ReadTime(); /* 读取 DS1302 当前时间到 TIME 数组 */
|
||||
|
||||
TempPros(); /* 温度采集状态机(非阻塞式) */
|
||||
|
||||
/* 模式切换时刷新 LCD 静态框架 */
|
||||
if(mode != last_mode)
|
||||
{
|
||||
LcdFramework();
|
||||
last_mode = mode;
|
||||
}
|
||||
|
||||
AlarmJudge(); /* 闹钟判断(当前为空函数) */
|
||||
AlarmBuzPro(); /* 蜂鸣器驱动(当前为空函数) */
|
||||
KeyScan(); /* 按键扫描 */
|
||||
LcdUpdate(); /* 刷新 LCD 动态显示 */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ShowLcdWeek:在 LCD 当前位置显示星期缩写
|
||||
* 输入:week = 1~7(对应 Sunday~Saturday)
|
||||
*/
|
||||
void ShowLcdWeek(unsigned char week)
|
||||
{
|
||||
switch(week)
|
||||
{
|
||||
case 1: LcdWriteData('S'); LcdWriteData('u'); LcdWriteData('n'); break; /* Sunday */
|
||||
case 2: LcdWriteData('M'); LcdWriteData('o'); LcdWriteData('n'); break; /* Monday */
|
||||
case 3: LcdWriteData('T'); LcdWriteData('u'); LcdWriteData('e'); break; /* Tuesday */
|
||||
case 4: LcdWriteData('W'); LcdWriteData('e'); LcdWriteData('d'); break; /* Wednesday */
|
||||
case 5: LcdWriteData('T'); LcdWriteData('h'); LcdWriteData('u'); break; /* Thursday */
|
||||
case 6: LcdWriteData('F'); LcdWriteData('r'); LcdWriteData('i'); break; /* Friday */
|
||||
case 7: LcdWriteData('S'); LcdWriteData('a'); LcdWriteData('t'); break; /* Saturday */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*===================== LCD 框架刷新 ======================*/
|
||||
|
||||
/*
|
||||
* LcdFramework:刷新 LCD 静态框架
|
||||
* 功能:根据当前模式,绘制 LCD 的固定显示内容
|
||||
* 模式 0(时钟):显示日期和时间占位符
|
||||
* 模式 2(秒表):显示秒表标题和数字占位符
|
||||
*/
|
||||
void LcdFramework()
|
||||
{
|
||||
LcdWriteCom(0x0c); /* 关闭光标 */
|
||||
|
||||
if(mode == 0) /* 时钟模式 */
|
||||
{
|
||||
LcdWriteCom(0x80);
|
||||
LcdWriteStr("20 - - "); /* 第一行:年-月-日 */
|
||||
LcdWriteCom(0xC0);
|
||||
LcdWriteStr(" : : "); /* 第二行:时:分:秒 + 温度 */
|
||||
}
|
||||
else if(mode == 2) /* 秒表模式 */
|
||||
{
|
||||
LcdWriteCom(0x80);
|
||||
LcdWriteStr(" Stop Watch "); /* 第一行:标题居中 */
|
||||
LcdWriteCom(0xC0);
|
||||
LcdWriteStr(" : : . "); /* 第二行:HH:MM:SS.cs 居中 */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*======================= LCD 动态更新 ========================*/
|
||||
|
||||
/*
|
||||
* LcdUpdate:刷新 LCD 动态显示数据
|
||||
* 功能:根据当前模式,更新温度/时间/秒表等动态数值
|
||||
* 时钟模式显示年月日时分秒星期和温度
|
||||
* 秒表模式显示时、分、秒、百分秒
|
||||
*/
|
||||
void LcdUpdate()
|
||||
{
|
||||
int temp_disp;
|
||||
|
||||
if(mode == 0) /* 时钟模式 */
|
||||
{
|
||||
/* 显示日期 */
|
||||
LcdShowNumAt(0x82, BCD2DEC(TIME[6])); /* 年 */
|
||||
LcdShowNumAt(0x85, BCD2DEC(TIME[4])); /* 月 */
|
||||
LcdShowNumAt(0x88, BCD2DEC(TIME[3])); /* 日 */
|
||||
|
||||
/* 显示星期 */
|
||||
LcdWriteCom(0x8C);
|
||||
ShowLcdWeek(TIME[5] & 0x07);
|
||||
|
||||
/* 显示时间 */
|
||||
LcdShowNumAt(0xC0, BCD2DEC(TIME[2])); /* 时 */
|
||||
LcdShowNumAt(0xC3, BCD2DEC(TIME[1])); /* 分 */
|
||||
LcdShowNumAt(0xC6, BCD2DEC(TIME[0])); /* 秒 */
|
||||
|
||||
/* 显示温度:格式 "-12.3C" 或 " 25.0C" */
|
||||
LcdWriteCom(0xC9);
|
||||
temp_disp = temperature;
|
||||
if(temp_disp < 0)
|
||||
{
|
||||
LcdWriteData('-');
|
||||
temp_disp = -temp_disp;
|
||||
}
|
||||
else
|
||||
{
|
||||
LcdWriteData(' '); /* 正数前留空格 */
|
||||
}
|
||||
LcdWriteData('0' + temp_disp / 100); /* 十位 */
|
||||
LcdWriteData('0' + (temp_disp / 10) % 10); /* 个位 */
|
||||
LcdWriteData('.'); /* 小数点 */
|
||||
LcdWriteData('0' + temp_disp % 10); /* 十分位 */
|
||||
LcdWriteData('C'); /* 单位 */
|
||||
}
|
||||
else if(mode == 2) /* 秒表模式 */
|
||||
{
|
||||
/* 居中显示,位置 0xC2/0xC5/0xC8/0xCB */
|
||||
LcdShowNumAt(0xC2, sw_sec / 3600); /* 小时 */
|
||||
LcdShowNumAt(0xC5, (sw_sec % 3600) / 60); /* 分钟 */
|
||||
LcdShowNumAt(0xC8, sw_sec % 60); /* 秒钟 */
|
||||
LcdShowNumAt(0xCB, sw_csec); /* 百分秒 */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*========================== 按键扫描 ==========================*/
|
||||
|
||||
/*
|
||||
* KeyScan:按键扫描处理
|
||||
* 功能:根据当前模式处理按键事件
|
||||
* 时钟模式:K1=设置时间,K2=切换到秒表
|
||||
* 秒表模式:K3=启动/暂停,K4=清零(暂停时),K2=返回时钟
|
||||
*/
|
||||
void KeyScan()
|
||||
{
|
||||
if(mode == 0) /* 时钟模式 */
|
||||
{
|
||||
if(K1_Pressed()) /* K1:进入时间设置 */
|
||||
{
|
||||
SetTime();
|
||||
last_mode = 0xFF; /* 强制刷新 LCD */
|
||||
}
|
||||
if(K2_Pressed()) /* K2:切换到秒表 */
|
||||
{
|
||||
mode = 2;
|
||||
sw_running = 0;
|
||||
sw_sec = 0;
|
||||
sw_csec = 0;
|
||||
LcdFramework();
|
||||
last_mode = mode;
|
||||
LcdUpdate();
|
||||
}
|
||||
}
|
||||
else if(mode == 2) /* 秒表模式 */
|
||||
{
|
||||
if(K3_Pressed()) /* K3:启动/暂停秒表 */
|
||||
{
|
||||
sw_running = !sw_running;
|
||||
TR1 = sw_running; /* TR1 控制定时器 1 的启停 */
|
||||
}
|
||||
if(K4_Pressed()) /* K4:暂停时清零 */
|
||||
{
|
||||
if(!sw_running)
|
||||
{
|
||||
sw_sec = 0;
|
||||
sw_csec = 0;
|
||||
}
|
||||
}
|
||||
if(K2_Pressed()) /* K2:返回时钟模式 */
|
||||
{
|
||||
mode = 0;
|
||||
TR1 = 0;
|
||||
sw_running = 0;
|
||||
sw_sec = 0;
|
||||
sw_csec = 0;
|
||||
LcdFramework();
|
||||
last_mode = mode;
|
||||
LcdUpdate();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*========================== 时间设置 ==========================*/
|
||||
|
||||
/*
|
||||
* SetTime:时间和日期设置
|
||||
* 功能:对年、月、日、时、分、秒逐一进行调节,
|
||||
* 星期通过 K3/K4 手动调节,完成后全部写入 DS1302。
|
||||
* 操作:K1 切换调节字段,K3/K4 加减,调节完秒后自动写入。
|
||||
*/
|
||||
void SetTime()
|
||||
{
|
||||
unsigned char y, mo, d, w, h, mi, s;
|
||||
|
||||
/* 将 TIME 数组中的 BCD 码转换为十进制 */
|
||||
y = BCD2DEC(TIME[6]);
|
||||
mo = BCD2DEC(TIME[4]);
|
||||
d = BCD2DEC(TIME[3]);
|
||||
w = TIME[5] & 0x07;
|
||||
h = BCD2DEC(TIME[2]);
|
||||
mi = BCD2DEC(TIME[1]);
|
||||
s = BCD2DEC(TIME[0]);
|
||||
|
||||
/* 绘制设置界面 */
|
||||
LcdWriteCom(0x80);
|
||||
LcdWriteStr("20 - - "); /* 第一行:20YY-MM-DD */
|
||||
LcdWriteCom(0xC0);
|
||||
LcdWriteStr(" : : "); /* 第二行:HH:MM:SS */
|
||||
|
||||
/* 显示当前时间 */
|
||||
LcdShowNumAt(0x82, y); /* 年 */
|
||||
LcdShowNumAt(0x85, mo); /* 月 */
|
||||
LcdShowNumAt(0x88, d); /* 日 */
|
||||
LcdWriteCom(0x8C); ShowLcdWeek(w); /* 星期 */
|
||||
LcdShowNumAt(0xC0, h); /* 时 */
|
||||
LcdShowNumAt(0xC3, mi); /* 分 */
|
||||
LcdShowNumAt(0xC6, s); /* 秒 */
|
||||
|
||||
/* 逐一调节数值(K3/K4 加减,K1 跳到下一项) */
|
||||
AdjustValue(&y, 99, 0x82, 0x82); /* 年 */
|
||||
AdjustValue(&mo, 12, 0x85, 0x85); /* 月 */
|
||||
AdjustValue(&d, 31, 0x88, 0x88); /* 日 */
|
||||
AdjustValue(&h, 23, 0xC0, 0xC0); /* 时 */
|
||||
AdjustValue(&mi, 59, 0xC3, 0xC3); /* 分 */
|
||||
AdjustValue(&s, 59, 0xC6, 0xC6); /* 秒 */
|
||||
|
||||
/* 手动调节星期 */
|
||||
LcdWriteCom(0x8E); LcdWriteCom(0x0f); /* 光标在星期最后一位 */
|
||||
while(1)
|
||||
{
|
||||
if(K3_Pressed())
|
||||
{
|
||||
if(w < 7) w++; else w = 1;
|
||||
LcdWriteCom(0x8C); ShowLcdWeek(w);
|
||||
LcdWriteCom(0x8E); LcdWriteCom(0x0f);
|
||||
}
|
||||
if(K4_Pressed())
|
||||
{
|
||||
if(w > 1) w--; else w = 7;
|
||||
LcdWriteCom(0x8C); ShowLcdWeek(w);
|
||||
LcdWriteCom(0x8E); LcdWriteCom(0x0f);
|
||||
}
|
||||
if(K1_Pressed()) { break; }
|
||||
}
|
||||
|
||||
/* 将调整后的值转回 BCD 码写入 TIME 数组 */
|
||||
TIME[6] = DEC2BCD(y);
|
||||
TIME[4] = DEC2BCD(mo);
|
||||
TIME[3] = DEC2BCD(d);
|
||||
TIME[5] = w;
|
||||
TIME[2] = DEC2BCD(h);
|
||||
TIME[1] = DEC2BCD(mi);
|
||||
TIME[0] = DEC2BCD(s);
|
||||
|
||||
/* 写入 DS1302 */
|
||||
Ds1302Write(0x8E, 0x00); /* 关闭写保护 */
|
||||
Ds1302Write(0x80, TIME[0]); /* 秒 */
|
||||
Ds1302Write(0x82, TIME[1]); /* 分 */
|
||||
Ds1302Write(0x84, TIME[2]); /* 时 */
|
||||
Ds1302Write(0x86, TIME[3]); /* 日 */
|
||||
Ds1302Write(0x88, TIME[4]); /* 月 */
|
||||
Ds1302Write(0x8a, TIME[5]); /* 周 */
|
||||
Ds1302Write(0x8c, TIME[6]); /* 年 */
|
||||
Ds1302Write(0x8E, 0x80); /* 开启写保护 */
|
||||
|
||||
/* 恢复显示 */
|
||||
LcdWriteCom(0x0c); /* 关闭光标 */
|
||||
last_mode = 0xFF; /* 强制刷新 LCD */
|
||||
}
|
||||
|
||||
|
||||
/*========================= 定时器初始化 =========================*/
|
||||
|
||||
/*
|
||||
* Timer1Init:初始化定时器 1
|
||||
* 功能:配置 T1 为模式 1(16 位定时器),启用中断
|
||||
* 用于秒表计时,每 10ms 中断一次
|
||||
*/
|
||||
void Timer1Init()
|
||||
{
|
||||
TMOD &= 0x0F; /* 清空 T1 相关位 */
|
||||
TMOD |= 0x10; /* 设置 T1 为模式 1(16 位定时器) */
|
||||
ET1 = 1; /* 使能 T1 中断 */
|
||||
EA = 1; /* 开启总中断 */
|
||||
}
|
||||
|
||||
|
||||
/*====================== 定时器 1 中断服务 ======================*/
|
||||
|
||||
/*
|
||||
* Timer1:定时器 1 中断服务函数
|
||||
* 功能:每 10ms 中断一次(12MHz 晶振),秒表运行时累加百分秒
|
||||
* 百分秒到 100 时进位 1 秒
|
||||
*/
|
||||
void Timer1() interrupt 3
|
||||
{
|
||||
TH1 = 0xD8; /* 重装初值:定时 10ms */
|
||||
TL1 = 0xF0;
|
||||
|
||||
if(sw_running) /* 秒表正在运行时才累加 */
|
||||
{
|
||||
sw_csec++;
|
||||
if(sw_csec >= 100) /* 百分秒满 100 进 1 秒 */
|
||||
{
|
||||
sw_csec = 0;
|
||||
sw_sec++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*======================= 温度采集 ========================*/
|
||||
|
||||
/*
|
||||
* TempPros:温度采集状态机(非阻塞式)
|
||||
* 功能:分两步完成温度采集,避免长时间阻塞主循环
|
||||
* state=0:发送转换命令(复位→0xCC→0x44),切换到等待状态
|
||||
* state=1:等待约 800ms(40 次主循环),然后读取温度
|
||||
* (复位→0xCC→0xBE→读 2 字节→计算→回 state=0)
|
||||
* 说明:DS18B20 在 12 位分辨率下需要最长 750ms 完成转换,
|
||||
* 等待期间主循环正常运行(按键响应、显示刷新不受影响)。
|
||||
*/
|
||||
void TempPros()
|
||||
{
|
||||
unsigned char tmL, tmH;
|
||||
int raw;
|
||||
unsigned char sign = 0;
|
||||
|
||||
if(temp_state == 0)
|
||||
{
|
||||
/* 第一步:启动温度转换 */
|
||||
Ds18b20Init();
|
||||
Ds18b20WriteByte(0xCC); /* 跳过 ROM(单设备模式) */
|
||||
Ds18b20WriteByte(0x44); /* 启动温度转换命令 */
|
||||
temp_state = 1; /* 切换到等待状态 */
|
||||
temp_wait = 0;
|
||||
}
|
||||
else if(temp_state == 1)
|
||||
{
|
||||
/* 第二步:等待转换完成 */
|
||||
temp_wait++;
|
||||
if(temp_wait >= 40) /* 约 800ms(每循环 ~20ms) */
|
||||
{
|
||||
Ds18b20Init();
|
||||
Ds18b20WriteByte(0xCC); /* 跳过 ROM */
|
||||
Ds18b20WriteByte(0xBE); /* 读取暂存器命令 */
|
||||
tmL = Ds18b20ReadByte();/* 读取温度低字节 */
|
||||
tmH = Ds18b20ReadByte();/* 读取温度高字节 */
|
||||
raw = (tmH << 8) | tmL; /* 合并为 16 位原始值 */
|
||||
|
||||
/* 负数处理:符号位为 1 时取反加 1 */
|
||||
if(raw & 0x8000)
|
||||
{
|
||||
raw = ~raw + 1;
|
||||
sign = 1;
|
||||
}
|
||||
|
||||
/* 转换为放大 10 倍的温度值:原始值 × 10 / 16 */
|
||||
temperature = raw * 10 / 16;
|
||||
if(sign)
|
||||
temperature = -temperature;
|
||||
|
||||
temp_state = 0; /* 回到空闲状态,准备下一次采集 */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*======================== 闹钟/蜂鸣器 ========================*/
|
||||
|
||||
/*
|
||||
* AlarmJudge:闹钟判断函数(蜂鸣器已损坏,保留为空)
|
||||
*/
|
||||
void AlarmJudge(void)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* AlarmBuzPro:蜂鸣器驱动函数(蜂鸣器已损坏,保留为空)
|
||||
*/
|
||||
void AlarmBuzPro(void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/*========================= 延时函数 ==========================*/
|
||||
|
||||
/*
|
||||
* Delay10ms:软件延时约 10ms(12MHz 晶振,12T 模式)
|
||||
* 用于按键消抖
|
||||
*/
|
||||
void Delay10ms(void)
|
||||
{
|
||||
unsigned char a, b, c;
|
||||
for(c = 1; c > 0; c--)
|
||||
for(b = 38; b > 0; b--)
|
||||
for(a = 130; a > 0; a--);
|
||||
}
|
||||
@@ -0,0 +1,181 @@
|
||||
# 系统模块结构图(函数调用关系)
|
||||
|
||||
## main.c 模块
|
||||
|
||||
```
|
||||
main() ──────────────────────────────────────────────────────────────────────
|
||||
│ [初始化]
|
||||
├── Timer1Init() // 定时器1初始化
|
||||
├── LcdInit() ──→ lcd.c // LCD1602初始化
|
||||
├── Ds1302Init() ──→ ds1302.c // DS1302初始化
|
||||
│ └── Ds1302Read(), Ds1302Write()
|
||||
├── DS18B20_SetResolution() ──→ ds18b20.c
|
||||
├── DS18B20_StartConvert() ──→ ds18b20.c
|
||||
└── Ds1302Read() ──→ ds1302.c // 读取闹钟参数
|
||||
│
|
||||
│ [主循环 while(1)]
|
||||
├── Ds1302ReadTime() ──→ ds1302.c // 每次循环读取时钟
|
||||
├── TempPros() // 温度处理(每5次循环)
|
||||
│ ├── DS18B20_GetTemp() ──→ ds18b20.c
|
||||
│ └── DS18B20_StartConvert()
|
||||
├── LcdFramework() // 模式切换时刷新框架
|
||||
│ └── LcdWriteStr() → LcdWriteData() ──→ lcd.c
|
||||
├── AlarmJudge() // 闹钟时间匹配判断
|
||||
├── AlarmBuzPro() // 蜂鸣器驱动
|
||||
│ └── DelayMs()
|
||||
├── KeyScan() // 按键扫描
|
||||
│ └── KeyPressed() (×5) // 消抖检测
|
||||
│ ├── SetAlarm() // K1: 闹钟设置
|
||||
│ │ ├── LcdWriteStr() → lcd.c
|
||||
│ │ ├── LcdShowNumAt() → lcd.c
|
||||
│ │ ├── AdjustValue() // 小时/分钟调节
|
||||
│ │ │ ├── KeyPressed()
|
||||
│ │ │ ├── KeySound()
|
||||
│ │ │ └── LcdShowNumAt()
|
||||
│ │ ├── KeyPressed()
|
||||
│ │ │ └── KeySound()
|
||||
│ │ └── Ds1302Write() → ds1302.c
|
||||
│ ├── KeySound() / ReturnSound()
|
||||
│ │ └── DelayMs()
|
||||
│ └── 修改秒表全局变量
|
||||
│
|
||||
└── LcdUpdate() // LCD数据刷新
|
||||
├── LcdShowNumAt() → lcd.c
|
||||
├── ShowLcdWeek()
|
||||
│ └── LcdWriteData() → lcd.c
|
||||
├── LcdWriteCom() → lcd.c
|
||||
└── LcdWriteData() → lcd.c
|
||||
|
||||
Timer1() interrupt 3 // 定时器中断(10ms)
|
||||
└── sw_running == 1 → sw_csec++ → sw_sec++ // 秒表计时
|
||||
```
|
||||
|
||||
## ds1302.c 模块
|
||||
|
||||
```
|
||||
Ds1302Init()
|
||||
├── Ds1302Read(0x81) // 读秒寄存器,检测CH位
|
||||
└── Ds1302Write() × 9 // 写入默认时间 + 关闭写保护
|
||||
|
||||
Ds1302ReadTime()
|
||||
└── Ds1302Read() × 7 // 批量读取7个时间寄存器
|
||||
|
||||
Ds1302Write(addr, dat) // SPI协议写
|
||||
├── RST=1, SCLK=0
|
||||
├── 循环8次: 逐位发送地址(LSB→MSB)
|
||||
└── 循环8次: 逐位发送数据
|
||||
|
||||
Ds1302Read(addr) // SPI协议读
|
||||
├── RST=1, SCLK=0
|
||||
├── 循环8次: 逐位发送地址
|
||||
└── 循环8次: 逐位读取数据(MSB→LSB)
|
||||
```
|
||||
|
||||
## ds18b20.c 模块
|
||||
|
||||
```
|
||||
DS18B20_Reset()
|
||||
├── DQ=0 → 延时480μs
|
||||
└── DQ=1 → 等待应答
|
||||
|
||||
DS18B20_WriteByte(dat) // 单总线写
|
||||
└── 循环8次: DQ=0 → 写bit → 延时60μs → DQ=1
|
||||
|
||||
DS18B20_ReadByte() // 单总线读
|
||||
└── 循环8次: DQ=0 → DQ=1 → 读bit → 延时
|
||||
|
||||
DS18B20_StartConvert() // 启动温度转换
|
||||
├── DS18B20_Reset()
|
||||
├── DS18B20_WriteByte(0xCC) // 跳过ROM
|
||||
└── DS18B20_WriteByte(0x44) // 启动转换
|
||||
|
||||
DS18B20_SetResolution(res) // 设置分辨率
|
||||
├── DS18B20_Reset()
|
||||
├── DS18B20_WriteByte(0xCC)
|
||||
├── DS18B20_WriteByte(0x4E) // 写暂存器
|
||||
├── DS18B20_WriteByte(0x00) // TH
|
||||
├── DS18B20_WriteByte(0x00) // TL
|
||||
├── DS18B20_WriteByte(res) // 配置寄存器
|
||||
├── DS18B20_Reset()
|
||||
├── DS18B20_WriteByte(0xCC)
|
||||
└── DS18B20_WriteByte(0x48) // 复制到EEPROM
|
||||
|
||||
DS18B20_GetTemp(int *temp) // 读取温度值
|
||||
├── DS18B20_Reset()
|
||||
├── DS18B20_WriteByte(0xCC)
|
||||
├── DS18B20_WriteByte(0xBE) // 读暂存器
|
||||
├── DS18B20_ReadByte() // 低字节
|
||||
└── DS18B20_ReadByte() // 高字节
|
||||
```
|
||||
|
||||
## lcd.c 模块
|
||||
|
||||
```
|
||||
LcdInit()
|
||||
└── LcdWriteCom() × 5 // 初始化指令序列
|
||||
|
||||
LcdWriteCom(com) // 写指令(4位模式)
|
||||
├── RS=0, RW=0
|
||||
├── P0=com → 写高4位
|
||||
├── E=1 → 延时 → E=0
|
||||
└── P0=com<<4 → 写低4位
|
||||
└── E=1 → 延时 → E=0
|
||||
└── 内部调用 Lcd1602_Delay1ms()
|
||||
|
||||
LcdWriteData(dat) // 写数据(4位模式)
|
||||
├── RS=1, RW=0
|
||||
├── P0=dat → 写高4位
|
||||
├── E=1 → 延时 → E=0
|
||||
└── P0=dat<<4 → 写低4位
|
||||
└── E=1 → 延时 → E=0
|
||||
└── 内部调用 Lcd1602_Delay1ms()
|
||||
```
|
||||
|
||||
## 函数调用总图
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────┐
|
||||
│ main() 主循环 │
|
||||
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
||||
│ │ DS1302 │ │ DS18B20 │ │ LCD1602 │ │ 按键扫描 │ │ 闹钟处理 │ │
|
||||
│ │ 时钟模块 │ │ 温度模块 │ │ 显示模块 │ │ KeyScan │ │ Judge │ │
|
||||
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
|
||||
│ │ │ │ │ │ │
|
||||
│ ┌────▼────┐ ┌────▼────┐ ┌────▼────┐ ┌────▼────┐ ┌────▼────┐ │
|
||||
│ │ReadTime │ │TempPros │ │LcdUpdate│ │KeyPressed│ │AlarmBuz │ │
|
||||
│ │Init │ │GetTemp │ │Framework│ │SetAlarm │ │Pro │ │
|
||||
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Timer1 中断 (10ms) │ │
|
||||
│ │ → 秒表 sw_csec / sw_sec 累加 │ │
|
||||
│ └─────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
┌──────────────────┼──────────────────┐
|
||||
▼ ▼ ▼
|
||||
┌───────────┐ ┌───────────┐ ┌───────────┐
|
||||
│ ds1302.c │ │ ds18b20.c │ │ lcd.c │
|
||||
│ 底层驱动 │ │ 底层驱动 │ │ 底层驱动 │
|
||||
│ SPI协议 │ │ 单总线协议 │ │ 并行接口 │
|
||||
└───────────┘ └───────────┘ └───────────┘
|
||||
│ │ │
|
||||
▼ ▼ ▼
|
||||
┌───────────────────────────────────────────────┐
|
||||
│ STC89C52 硬件层 │
|
||||
│ P1^0-2 DS1302 │ P3^7 DS18B20 │ P0/P2 LCD │
|
||||
│ P3^0-3 按键 │ P2^0 蜂鸣器 │ Timer1 │
|
||||
└───────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## 文件间依赖
|
||||
|
||||
```
|
||||
main.c ──→ lcd.h (LcdInit, LcdWriteCom, LcdWriteData)
|
||||
main.c ──→ ds1302.h (Ds1302Init, Ds1302ReadTime, Ds1302Read, Ds1302Write)
|
||||
main.c ──→ ds18b20.h (DS18B20_GetTemp, DS18B20_StartConvert, DS18B20_SetResolution)
|
||||
|
||||
ds1302.c ──→ reg51.h, intrins.h
|
||||
ds18b20.c ──→ reg51.h, intrins.h
|
||||
lcd.c ──→ reg51.h
|
||||
```
|
||||
Binary file not shown.
@@ -0,0 +1,210 @@
|
||||
:0300000002049E59
|
||||
:0C049E00787FE4F6D8FD75812D0204E59E
|
||||
:1007FC00323020202D20202D2020202020202020B1
|
||||
:10080C000020203A20203A202020202020202020C8
|
||||
:10081C00200020202053746F70205761746368206F
|
||||
:10082C00202000202020203A20203A20202E20209A
|
||||
:04083C002020200058
|
||||
:100927000123000129FF02260000012800022B00F5
|
||||
:1009370000012406012500012A0002210000012DE3
|
||||
:0309470000C100EC
|
||||
:100A420030B102C322120A9830B102C32230B1FD82
|
||||
:020A5200D322AD
|
||||
:100A540030B002C322120A9830B002C32230B0FD73
|
||||
:020A6400D3229B
|
||||
:100A660030B202C322120A9830B202C32230B2FD5B
|
||||
:020A7600D32289
|
||||
:100A780030B302C322120A9830B302C32230B3FD46
|
||||
:020A8800D32277
|
||||
:1009D8008E0F8F10851082850F83E49360170510A2
|
||||
:1009E800E510AE0F7002050F14F5828E83E493FFB5
|
||||
:0609F800120AB180DF22AB
|
||||
:0C09AD00AB0FAA10A9111203B4FDAF1388
|
||||
:1009B9008D15120AA5E51575F00A842430FF120A6F
|
||||
:0F09C900B1E51575F00A84E5F02430FF020AB19C
|
||||
:10063B008B0F8A1089118D12E51404FF120AA57F06
|
||||
:10064B000F120AA5120A665028AB0FAA10A9111295
|
||||
:10065B0003B4C39512500774011203CD8004E41246
|
||||
:10066B0003EF1209ADE51404FF120AA57F0F120A5E
|
||||
:10067B00A5120A785029AB0FAA10A9111203B4D3F3
|
||||
:10068B009400400774FF1203CD8005E5121203EFAF
|
||||
:10069B001209ADE51404FF120AA57F0F120AA51269
|
||||
:0A06AB000A4250A07F0C120AA5229B
|
||||
:1006B500120ABD120A241209547FC11207698F2438
|
||||
:1006C500E524D3941740037524067FC31207698F69
|
||||
:1006D50025E525D3943B4003E4F5257FC51207693D
|
||||
:1006E5008F2AE52AD394014003E4F52A1200031268
|
||||
:1006F50005B6E52365296006120840852329120001
|
||||
:0C0705001912001A12071112026180E0A4
|
||||
:10052A00EF14B4070040030205B590054275F003C5
|
||||
:10053A00A4C58325F0C58373020557020560020529
|
||||
:10054A006E02057C02058A0205980205A67F5312EF
|
||||
:10055A000AB17F7580077F4D120AB17F6F120AB107
|
||||
:10056A007F6E80447F54120AB17F75120AB17F658B
|
||||
:10057A0080367F57120AB17F65120AB17F648028DC
|
||||
:10058A007F54120AB17F68120AB17F75801A7F46BA
|
||||
:10059A00120AB17F72120AB17F69800C7F53120A64
|
||||
:0C05AA00B17F61120AB17F74120AB12205
|
||||
:100840007F0C120AA5E52370177F80120AA57E0788
|
||||
:100850007FFC1209D87FC0120AA57E087F0D801A7E
|
||||
:10086000E523B402187F80120AA57E087F1E1209B4
|
||||
:0E087000D87FC0120AA57E087F2F1209D82259
|
||||
:10026100E5236003020365E51CC4540F75F00AA47D
|
||||
:10027100FFE51C540F2FFD7F821209B9E51AC45402
|
||||
:100281000F75F00AA4FFE51A540F2FFD7F8512099F
|
||||
:10029100B9E519C4540F75F00AA4FFE519540F2FDD
|
||||
:1002A100FD7F881209B97F8C120AA5E51B5407FF4F
|
||||
:1002B10012052AE518C4540F75F00AA4FFE5185475
|
||||
:1002C1000F2FFD7FC01209B9E517C4540F75F00A4D
|
||||
:1002D100A4FFE517540F2FFD7FC31209B9E516C41A
|
||||
:1002E100540F75F00AA4FFE516540F2FFD7FC612B7
|
||||
:1002F10009B97FC9120AA5852608852709C3E5081A
|
||||
:100301006480948050127F2D120AB1C3E49509F5DF
|
||||
:1003110009E49508F50880057F20120AB1AE08AFFF
|
||||
:10032100097C007D64120468EF2430FF120AB1AE2B
|
||||
:1003310008AF097C007D0A1204687C007D0A120462
|
||||
:1003410068ED2430FF120AB17F2E120AB1AE08AF58
|
||||
:10035100097C007D0A120468ED2430FF120AB17F86
|
||||
:1003610043020AB1E52364027048AE21AF227C0E3C
|
||||
:100371007D10120413AD077FC21209B9AE21AF225D
|
||||
:100381007C0E7D101204137E007F3CCFCDCFCECCEE
|
||||
:10039100CE120413AD077FC51209B9AE21AF227C7D
|
||||
:1003A100007D3C1204137FC81209B9AD2D7FCB1219
|
||||
:0203B10009B988
|
||||
:0103B3002227
|
||||
:10071100E5237018120A42500612001E7529FF12B5
|
||||
:100721000A545043752302C200E4802CE52364027D
|
||||
:100731007035120A665006B200A200928E120A7833
|
||||
:10074100500A200007E4F521F522F52D120A545034
|
||||
:1007510016E4F523C28EC200F521F522F52D12080B
|
||||
:080761004085232912026122E8
|
||||
:10001E00E51CC4540F75F00AA4FFE51C540F2FF510
|
||||
:10002E0008E51AC4540F75F00AA4FFE51A540F2FF1
|
||||
:10003E00F509E519C4540F75F00AA4FFE519540F1C
|
||||
:10004E002FF50AE51B5407F50BE518C4540F75F090
|
||||
:10005E000AA4FFE518540F2FF50CE517C4540F75BD
|
||||
:10006E00F00AA4FFE517540F2FF50DE516C4540F33
|
||||
:10007E0075F00AA4FFE516540F2FF50E7F80120AB5
|
||||
:10008E00A57E077FFC1209D87FC0120AA57E087FC5
|
||||
:10009E000D1209D8AD087F821209B9AD097F8512FC
|
||||
:1000AE0009B9AD0A7F881209B97F8C120AA5AF0B68
|
||||
:1000BE0012052AAD0C7FC01209B9AD0D7FC312090E
|
||||
:1000CE00B9AD0E7FC61209B97B007A007908751397
|
||||
:1000DE00827514827D6312063B7B007A0079097566
|
||||
:1000EE0013857514857D0C12063B7B007A00790A08
|
||||
:1000FE007513887514887D1F12063B7B007A007974
|
||||
:10010E000C7513C07514C07D1712063B7B007A0068
|
||||
:10011E00790D7513C37514C37D3B12063B7B007AB4
|
||||
:10012E0000790E7513C67514C67D3B12063B7F8E85
|
||||
:10013E00120AA57F0F120AA5120A665022E50BC3FA
|
||||
:10014E0094075004050B8003750B017F8C120AA5D2
|
||||
:10015E00AF0B12052A7F8E120AA57F0F120AA51267
|
||||
:10016E000A785021E50B94014004150B8003750BA2
|
||||
:10017E00077F8C120AA5AF0B12052A7F8E120AA5D5
|
||||
:10018E007F0F120AA5120A4250AEE50875F00A84D6
|
||||
:10019E00C454F0FFE50875F00A84E5F04FF51CE550
|
||||
:1001AE000975F00A84C454F0FFE50975F00A84E578
|
||||
:1001BE00F04FF51AE50A75F00A84C454F0FFE50A0B
|
||||
:1001CE0075F00A84E5F04FF519850B1BE50C75F0FB
|
||||
:1001DE000A84C454F0FFE50C75F00A84E5F04FF57F
|
||||
:1001EE0018E50D75F00A84C454F0FFE50D75F00A9C
|
||||
:1001FE0084E5F04FF517E50E75F00A84C454F0FF50
|
||||
:10020E00E50E75F00A84E5F04FF516E4FD7F8E12CB
|
||||
:10021E0008F2AD167F801208F2AD177F821208F237
|
||||
:10022E00AD187F841208F2AD197F861208F2AD1A4E
|
||||
:10023E007F881208F2AD1B7F8A1208F2AD1C7F8CEC
|
||||
:10024E001208F27D807F8E1208F27F0C120AA575BD
|
||||
:02025E0029FF76
|
||||
:01026000227B
|
||||
:0B0ABD0053890F438910D2ABD2AF2247
|
||||
:03001B000209FED9
|
||||
:1009FE00C0E0C0D0758DD8758BF0300014052DE594
|
||||
:100A0E002DC39464400B752D000522E5227002055E
|
||||
:060A1E0021D0D0D0E0322F
|
||||
:1005B600E4F509E52870161209817FCC1208BC7F84
|
||||
:1005C600441208BC752801E4F52BF52C22E52864B5
|
||||
:1005D600017061052CE52C7002052BC39428E52BD0
|
||||
:1005E600940040501209817FCC1208BC7FBE1208CD
|
||||
:1005F600BC12087E8F0812087EEFFEE508FFEE307B
|
||||
:10060600E710EFF4FFEEF4FEEF2401FFE43EFE7583
|
||||
:1006160009017C007D0A1204017D101204688E26F1
|
||||
:100626008F27E509600BC3E49527F527E49526F5A2
|
||||
:0406360026E4F52899
|
||||
:01063A00229D
|
||||
:0100190022C4
|
||||
:01001A0022C3
|
||||
:0C0A98007F017E267D82DDFEDEFADFF6A7
|
||||
:010AA400222F
|
||||
:1007B300C2A58B807F017E001207E3D2A77F017E53
|
||||
:1007C300001207E3C2A77F017E001207E3EBC454C4
|
||||
:1007D300F0F5807F017E001207E3D2A77F017E0040
|
||||
:1007E300D3EF9400EE9400400F7DC77C01DCFEDD67
|
||||
:0807F300FAEF1F70EB1E80E815
|
||||
:0107FB0022DB
|
||||
:0C0AA500AB07C2A7C2A61207B3C2A7226B
|
||||
:0C0AB100AB07C2A7D2A61207B3C2A7224F
|
||||
:100A24007F32120AA57F28120AA57F0C120AA57F1D
|
||||
:0E0A340006120AA57F01120AA57F80020AA5FC
|
||||
:0E0A8A0081838587898B8D80828486888A8C03
|
||||
:09094A000716000012010102135E
|
||||
:1008F200C2B500C2B600D2B500E4FEEF1392B4EF67
|
||||
:10090200C313FFD2B600C2B6000EBE08EEE4FEED7F
|
||||
:100912001392B4EDC313FDD2B600C2B6000EBE08E8
|
||||
:04092200EEC2B5006C
|
||||
:0109260022AE
|
||||
:10076900C2B500C2B600D2B500E4FDEF1392B4EFF2
|
||||
:10077900C313FFD2B600C2B6000DBD08EE00E4FDFA
|
||||
:10078900A2B4E433FFC43333335480FCEEC3134CB7
|
||||
:10079900FED2B600C2B6000DBD08E5C2B500D2B69C
|
||||
:0907A90000C2B400D2B400AF0696
|
||||
:0107B2002224
|
||||
:100954007F81120769EF30E723E4FD7F8E1208F2EE
|
||||
:10096400E4FCEC900A9193FF74162CF8E6FD12084F
|
||||
:0C097400F20CBC07ED7D807F8E1208F2B3
|
||||
:010980002254
|
||||
:10000300E4FBEB900A8A93FF12076974162BF8A698
|
||||
:05001300070BBB07ED27
|
||||
:0100180022C5
|
||||
:10098100C2B77F467E00EF1FAC0670011E4C70F6A9
|
||||
:10099100D2B7E4FEFF30B7110FBF00010ED3EF94C1
|
||||
:0B09A10088EE941340EF7F00227F01DE
|
||||
:0109AC002228
|
||||
:1008BC00E4FBFAC2B7050BE50B7002050AEF1392C5
|
||||
:1008CC00B7750A00750B06E50B150BAC0A70021513
|
||||
:1008DC000A4C70F3D2B7EFC313FF0BBB00010AEB4A
|
||||
:0508EC0064084A70CE13
|
||||
:0108F10022E4
|
||||
:10087E007D087C00C2B70FBF0000D2B70FBF0000CB
|
||||
:10088E000FBF0000A2B7E433C43333335480FBE907
|
||||
:10089E00C3134BF97E007F04EF1FAA0670011E4A98
|
||||
:0D08AE0070F6ED1D70011CED4C70C9AF011E
|
||||
:0108BB00221A
|
||||
:1004AA000206B5E493A3F8E493A34003F68001F2AD
|
||||
:1004BA0008DFF48029E493A3F85407240CC8C33353
|
||||
:1004CA00C4540F4420C8834004F456800146F6DF22
|
||||
:1004DA00E4800B0102040810204080900927E47E82
|
||||
:1004EA00019360BCA3FF543F30E509541FFEE49317
|
||||
:1004FA00A360010ECF54C025E060A840B8E493A3DE
|
||||
:10050A00FAE493A3F8E493A3C8C582C8CAC583CA08
|
||||
:10051A00F0A3C8C582C8CAC583CADFE9DEE780BEC0
|
||||
:0109530000A3
|
||||
:1003B400BB010689828A83E0225002E722BBFE0247
|
||||
:0903C400E32289828A83E493227A
|
||||
:1003CD00BB010989828A83F8E028F022500327F7C0
|
||||
:1003DD0022BBFE05F8E328F3228A838982F8E49391
|
||||
:0203ED002822C4
|
||||
:1003EF00BB010689828A83F0225002F722BBFE01ED
|
||||
:0203FF00F322E7
|
||||
:10040100EF8DF0A4A8F0CF8CF0A428CE8DF0A42E0F
|
||||
:02041100FE22C9
|
||||
:10041300BC000BBE0029EF8DF084FFADF022E4CCCD
|
||||
:10042300F875F008EF2FFFEE33FEEC33FCEE9DEC96
|
||||
:10043300984005FCEE9DFE0FD5F0E9E4CEFD22EDDC
|
||||
:10044300F8F5F0EE8420D21CFEADF075F008EF2F26
|
||||
:10045300FFED33FD4007985006D5F0F222C398FD17
|
||||
:050463000FD5F0EA22B4
|
||||
:10046800C2D5EC30E709B2D5E4C39DFDE49CFCEEAF
|
||||
:1004780030E715B2D5E4C39FFFE49EFE120413C310
|
||||
:10048800E49DFDE49CFC800312041330D507C3E40B
|
||||
:060498009FFFE49EFE221E
|
||||
:00000001FF
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,380 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
|
||||
|
||||
<SchemaVersion>1.0</SchemaVersion>
|
||||
|
||||
<Header>### uVision Project, (C) Keil Software</Header>
|
||||
|
||||
<Targets>
|
||||
<Target>
|
||||
<TargetName>Target 1</TargetName>
|
||||
<ToolsetNumber>0x0</ToolsetNumber>
|
||||
<ToolsetName>MCS-51</ToolsetName>
|
||||
<TargetOption>
|
||||
<TargetCommonOption>
|
||||
<Device>AT89C51</Device>
|
||||
<Vendor>Atmel</Vendor>
|
||||
<Cpu>IRAM(0-0x7F) IROM(0-0xFFF) CLOCK(24000000)</Cpu>
|
||||
<FlashUtilSpec></FlashUtilSpec>
|
||||
<StartupFile>"LIB\STARTUP.A51" ("Standard 8051 Startup Code")</StartupFile>
|
||||
<FlashDriverDll></FlashDriverDll>
|
||||
<DeviceId>2976</DeviceId>
|
||||
<RegisterFile>REGX51.H</RegisterFile>
|
||||
<MemoryEnv></MemoryEnv>
|
||||
<Cmp></Cmp>
|
||||
<Asm></Asm>
|
||||
<Linker></Linker>
|
||||
<OHString></OHString>
|
||||
<InfinionOptionDll></InfinionOptionDll>
|
||||
<SLE66CMisc></SLE66CMisc>
|
||||
<SLE66AMisc></SLE66AMisc>
|
||||
<SLE66LinkerMisc></SLE66LinkerMisc>
|
||||
<UseEnv>0</UseEnv>
|
||||
<BinPath></BinPath>
|
||||
<IncludePath></IncludePath>
|
||||
<LibPath></LibPath>
|
||||
<RegisterFilePath>Atmel\</RegisterFilePath>
|
||||
<DBRegisterFilePath>Atmel\</DBRegisterFilePath>
|
||||
<TargetStatus>
|
||||
<Error>0</Error>
|
||||
<ExitCodeStop>0</ExitCodeStop>
|
||||
<ButtonStop>0</ButtonStop>
|
||||
<NotGenerated>0</NotGenerated>
|
||||
<InvalidFlash>1</InvalidFlash>
|
||||
</TargetStatus>
|
||||
<OutputDirectory>.\</OutputDirectory>
|
||||
<OutputName>pro</OutputName>
|
||||
<CreateExecutable>1</CreateExecutable>
|
||||
<CreateLib>0</CreateLib>
|
||||
<CreateHexFile>1</CreateHexFile>
|
||||
<DebugInformation>1</DebugInformation>
|
||||
<BrowseInformation>1</BrowseInformation>
|
||||
<ListingPath>.\</ListingPath>
|
||||
<HexFormatSelection>0</HexFormatSelection>
|
||||
<Merge32K>0</Merge32K>
|
||||
<CreateBatchFile>0</CreateBatchFile>
|
||||
<BeforeCompile>
|
||||
<RunUserProg1>0</RunUserProg1>
|
||||
<RunUserProg2>0</RunUserProg2>
|
||||
<UserProg1Name></UserProg1Name>
|
||||
<UserProg2Name></UserProg2Name>
|
||||
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
|
||||
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
|
||||
</BeforeCompile>
|
||||
<BeforeMake>
|
||||
<RunUserProg1>0</RunUserProg1>
|
||||
<RunUserProg2>0</RunUserProg2>
|
||||
<UserProg1Name></UserProg1Name>
|
||||
<UserProg2Name></UserProg2Name>
|
||||
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
|
||||
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
|
||||
</BeforeMake>
|
||||
<AfterMake>
|
||||
<RunUserProg1>0</RunUserProg1>
|
||||
<RunUserProg2>0</RunUserProg2>
|
||||
<UserProg1Name></UserProg1Name>
|
||||
<UserProg2Name></UserProg2Name>
|
||||
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
|
||||
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
|
||||
</AfterMake>
|
||||
<SelectedForBatchBuild>0</SelectedForBatchBuild>
|
||||
<SVCSIdString></SVCSIdString>
|
||||
</TargetCommonOption>
|
||||
<CommonProperty>
|
||||
<UseCPPCompiler>0</UseCPPCompiler>
|
||||
<RVCTCodeConst>0</RVCTCodeConst>
|
||||
<RVCTZI>0</RVCTZI>
|
||||
<RVCTOtherData>0</RVCTOtherData>
|
||||
<ModuleSelection>0</ModuleSelection>
|
||||
<IncludeInBuild>1</IncludeInBuild>
|
||||
<AlwaysBuild>0</AlwaysBuild>
|
||||
<GenerateAssemblyFile>0</GenerateAssemblyFile>
|
||||
<AssembleAssemblyFile>0</AssembleAssemblyFile>
|
||||
<PublicsOnly>0</PublicsOnly>
|
||||
<StopOnExitCode>3</StopOnExitCode>
|
||||
<CustomArgument></CustomArgument>
|
||||
<IncludeLibraryModules></IncludeLibraryModules>
|
||||
<BankNo>65535</BankNo>
|
||||
</CommonProperty>
|
||||
<DllOption>
|
||||
<SimDllName>S8051.DLL</SimDllName>
|
||||
<SimDllArguments></SimDllArguments>
|
||||
<SimDlgDll>DP51.DLL</SimDlgDll>
|
||||
<SimDlgDllArguments>-p51</SimDlgDllArguments>
|
||||
<TargetDllName>S8051.DLL</TargetDllName>
|
||||
<TargetDllArguments></TargetDllArguments>
|
||||
<TargetDlgDll>TP51.DLL</TargetDlgDll>
|
||||
<TargetDlgDllArguments>-p51</TargetDlgDllArguments>
|
||||
</DllOption>
|
||||
<DebugOption>
|
||||
<OPTHX>
|
||||
<HexSelection>0</HexSelection>
|
||||
<HexRangeLowAddress>0</HexRangeLowAddress>
|
||||
<HexRangeHighAddress>0</HexRangeHighAddress>
|
||||
<HexOffset>0</HexOffset>
|
||||
<Oh166RecLen>16</Oh166RecLen>
|
||||
</OPTHX>
|
||||
<Simulator>
|
||||
<UseSimulator>1</UseSimulator>
|
||||
<LoadApplicationAtStartup>1</LoadApplicationAtStartup>
|
||||
<RunToMain>1</RunToMain>
|
||||
<RestoreBreakpoints>1</RestoreBreakpoints>
|
||||
<RestoreWatchpoints>1</RestoreWatchpoints>
|
||||
<RestoreMemoryDisplay>1</RestoreMemoryDisplay>
|
||||
<RestoreFunctions>1</RestoreFunctions>
|
||||
<RestoreToolbox>1</RestoreToolbox>
|
||||
<LimitSpeedToRealTime>0</LimitSpeedToRealTime>
|
||||
</Simulator>
|
||||
<Target>
|
||||
<UseTarget>0</UseTarget>
|
||||
<LoadApplicationAtStartup>1</LoadApplicationAtStartup>
|
||||
<RunToMain>0</RunToMain>
|
||||
<RestoreBreakpoints>1</RestoreBreakpoints>
|
||||
<RestoreWatchpoints>1</RestoreWatchpoints>
|
||||
<RestoreMemoryDisplay>1</RestoreMemoryDisplay>
|
||||
<RestoreFunctions>0</RestoreFunctions>
|
||||
<RestoreToolbox>1</RestoreToolbox>
|
||||
</Target>
|
||||
<RunDebugAfterBuild>0</RunDebugAfterBuild>
|
||||
<TargetSelection>-1</TargetSelection>
|
||||
<SimDlls>
|
||||
<CpuDll></CpuDll>
|
||||
<CpuDllArguments></CpuDllArguments>
|
||||
<PeripheralDll></PeripheralDll>
|
||||
<PeripheralDllArguments></PeripheralDllArguments>
|
||||
<InitializationFile></InitializationFile>
|
||||
</SimDlls>
|
||||
<TargetDlls>
|
||||
<CpuDll></CpuDll>
|
||||
<CpuDllArguments></CpuDllArguments>
|
||||
<PeripheralDll></PeripheralDll>
|
||||
<PeripheralDllArguments></PeripheralDllArguments>
|
||||
<InitializationFile></InitializationFile>
|
||||
<Driver></Driver>
|
||||
</TargetDlls>
|
||||
</DebugOption>
|
||||
<Utilities>
|
||||
<Flash1>
|
||||
<UseTargetDll>0</UseTargetDll>
|
||||
<UseExternalTool>0</UseExternalTool>
|
||||
<RunIndependent>0</RunIndependent>
|
||||
<UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
|
||||
<Capability>0</Capability>
|
||||
<DriverSelection>-1</DriverSelection>
|
||||
</Flash1>
|
||||
<Flash2></Flash2>
|
||||
<Flash3></Flash3>
|
||||
<Flash4></Flash4>
|
||||
</Utilities>
|
||||
<Target51>
|
||||
<Target51Misc>
|
||||
<MemoryModel>0</MemoryModel>
|
||||
<RTOS>0</RTOS>
|
||||
<RomSize>2</RomSize>
|
||||
<DataHold>0</DataHold>
|
||||
<XDataHold>0</XDataHold>
|
||||
<UseOnchipRom>0</UseOnchipRom>
|
||||
<UseOnchipArithmetic>0</UseOnchipArithmetic>
|
||||
<UseMultipleDPTR>0</UseMultipleDPTR>
|
||||
<UseOnchipXram>0</UseOnchipXram>
|
||||
<HadIRAM>1</HadIRAM>
|
||||
<HadXRAM>0</HadXRAM>
|
||||
<HadIROM>1</HadIROM>
|
||||
<Moda2>0</Moda2>
|
||||
<Moddp2>0</Moddp2>
|
||||
<Modp2>0</Modp2>
|
||||
<Mod517dp>0</Mod517dp>
|
||||
<Mod517au>0</Mod517au>
|
||||
<Mode2>0</Mode2>
|
||||
<useCB>0</useCB>
|
||||
<useXB>0</useXB>
|
||||
<useL251>0</useL251>
|
||||
<useA251>0</useA251>
|
||||
<Mx51>0</Mx51>
|
||||
<ModC812>0</ModC812>
|
||||
<ModCont>0</ModCont>
|
||||
<Lp51>0</Lp51>
|
||||
<useXBS>0</useXBS>
|
||||
<ModDA>0</ModDA>
|
||||
<ModAB2>0</ModAB2>
|
||||
<Mx51P>0</Mx51P>
|
||||
<hadXRAM2>0</hadXRAM2>
|
||||
<uocXram2>0</uocXram2>
|
||||
<ModC2>0</ModC2>
|
||||
<ModH2>0</ModH2>
|
||||
<Mdu_R515>0</Mdu_R515>
|
||||
<Mdu_F120>0</Mdu_F120>
|
||||
<Psoc>0</Psoc>
|
||||
<hadIROM2>0</hadIROM2>
|
||||
<ModSmx2>0</ModSmx2>
|
||||
<cBanks>0</cBanks>
|
||||
<xBanks>0</xBanks>
|
||||
<OnChipMemories>
|
||||
<RCB>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0xffff</Size>
|
||||
</RCB>
|
||||
<RXB>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</RXB>
|
||||
<Ocm1>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</Ocm1>
|
||||
<Ocm2>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</Ocm2>
|
||||
<Ocm3>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</Ocm3>
|
||||
<Ocr1>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</Ocr1>
|
||||
<Ocr2>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</Ocr2>
|
||||
<Ocr3>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</Ocr3>
|
||||
<IRO>
|
||||
<Type>1</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x1000</Size>
|
||||
</IRO>
|
||||
<IRA>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x80</Size>
|
||||
</IRA>
|
||||
<XRA>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</XRA>
|
||||
<XRA512>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</XRA512>
|
||||
<IROM512>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</IROM512>
|
||||
</OnChipMemories>
|
||||
</Target51Misc>
|
||||
<C51>
|
||||
<RegisterColoring>0</RegisterColoring>
|
||||
<VariablesInOrder>0</VariablesInOrder>
|
||||
<IntegerPromotion>1</IntegerPromotion>
|
||||
<uAregs>0</uAregs>
|
||||
<UseInterruptVector>1</UseInterruptVector>
|
||||
<Fuzzy>3</Fuzzy>
|
||||
<Optimize>8</Optimize>
|
||||
<WarningLevel>2</WarningLevel>
|
||||
<SizeSpeed>1</SizeSpeed>
|
||||
<ObjectExtend>1</ObjectExtend>
|
||||
<ACallAJmp>0</ACallAJmp>
|
||||
<InterruptVectorAddress>0</InterruptVectorAddress>
|
||||
<VariousControls>
|
||||
<MiscControls></MiscControls>
|
||||
<Define></Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath></IncludePath>
|
||||
</VariousControls>
|
||||
</C51>
|
||||
<Ax51>
|
||||
<UseMpl>0</UseMpl>
|
||||
<UseStandard>1</UseStandard>
|
||||
<UseCase>0</UseCase>
|
||||
<UseMod51>0</UseMod51>
|
||||
<VariousControls>
|
||||
<MiscControls></MiscControls>
|
||||
<Define></Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath></IncludePath>
|
||||
</VariousControls>
|
||||
</Ax51>
|
||||
<Lx51>
|
||||
<useFile>0</useFile>
|
||||
<linkonly>0</linkonly>
|
||||
<UseMemoryFromTarget>1</UseMemoryFromTarget>
|
||||
<CaseSensitiveSymbols>0</CaseSensitiveSymbols>
|
||||
<WarningLevel>2</WarningLevel>
|
||||
<DataOverlaying>1</DataOverlaying>
|
||||
<OverlayString></OverlayString>
|
||||
<MiscControls></MiscControls>
|
||||
<DisableWarningNumbers></DisableWarningNumbers>
|
||||
<LinkerCmdFile></LinkerCmdFile>
|
||||
<Assign></Assign>
|
||||
<ReserveString></ReserveString>
|
||||
<CClasses></CClasses>
|
||||
<UserClasses></UserClasses>
|
||||
<CSection></CSection>
|
||||
<UserSection></UserSection>
|
||||
<CodeBaseAddress></CodeBaseAddress>
|
||||
<XDataBaseAddress></XDataBaseAddress>
|
||||
<PDataBaseAddress></PDataBaseAddress>
|
||||
<BitBaseAddress></BitBaseAddress>
|
||||
<DataBaseAddress></DataBaseAddress>
|
||||
<IDataBaseAddress></IDataBaseAddress>
|
||||
<Precede></Precede>
|
||||
<Stack></Stack>
|
||||
<CodeSegmentName></CodeSegmentName>
|
||||
<XDataSegmentName></XDataSegmentName>
|
||||
<BitSegmentName></BitSegmentName>
|
||||
<DataSegmentName></DataSegmentName>
|
||||
<IDataSegmentName></IDataSegmentName>
|
||||
</Lx51>
|
||||
</Target51>
|
||||
</TargetOption>
|
||||
<Groups>
|
||||
<Group>
|
||||
<GroupName>Source Group 1</GroupName>
|
||||
<Files>
|
||||
<File>
|
||||
<FileName>STARTUP.A51</FileName>
|
||||
<FileType>2</FileType>
|
||||
<FilePath>.\STARTUP.A51</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>main.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>.\main.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>lcd.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>.\lcd.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>ds1302.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>.\ds1302.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>temp.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>.\temp.c</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
</Groups>
|
||||
</Target>
|
||||
</Targets>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,85 @@
|
||||
/******************************************************************************
|
||||
* 文件名:temp.c
|
||||
* 功能:DS18B20 温度传感器驱动
|
||||
* 说明:三个底层函数分别实现初始化、写字节和读字节,
|
||||
* 配合 main.c 中的非阻塞状态机完成温度采集。
|
||||
* 编译器:Keil C51
|
||||
******************************************************************************/
|
||||
|
||||
#include"temp.h"
|
||||
|
||||
/******************************************************************************
|
||||
* 函数名:Ds18b20Init
|
||||
* 功能:初始化 DS18B20(发送复位脉冲,检测存在脉冲)
|
||||
* 输入:无
|
||||
* 输出:返回 1 表示检测到 DS18B20,返回 0 表示设备不存在
|
||||
* 时序:总线拉低 642us → 释放 → 等待 DS18B20 拉低(15~60us)→ 检测存在
|
||||
******************************************************************************/
|
||||
unsigned char Ds18b20Init()
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
DSPORT = 0; /* 拉低总线,发送复位脉冲 */
|
||||
i = 70;
|
||||
while(i--); /* 延时约 642us(>480us 最低要求) */
|
||||
|
||||
DSPORT = 1; /* 释放总线 */
|
||||
i = 0;
|
||||
while(DSPORT) /* 等待 DS18B20 拉低总线(存在脉冲) */
|
||||
{
|
||||
i++;
|
||||
if(i > 5000) /* 超时约 5ms,认为设备不存在 */
|
||||
return 0;
|
||||
}
|
||||
return 1; /* 初始化成功 */
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* 函数名:Ds18b20WriteByte
|
||||
* 功能:向 DS18B20 写入一个字节(低位在前)
|
||||
* 输入:dat = 要写入的数据
|
||||
* 输出:无
|
||||
* 时序:每写一位,拉低 1us → 写入数据位 → 保持 68us → 释放总线
|
||||
******************************************************************************/
|
||||
void Ds18b20WriteByte(unsigned char dat)
|
||||
{
|
||||
unsigned int i, j;
|
||||
|
||||
for(j = 0; j < 8; j++)
|
||||
{
|
||||
DSPORT = 0; /* 拉低总线,开始写时隙 */
|
||||
i++;
|
||||
DSPORT = dat & 0x01; /* 写入当前位(低位在前) */
|
||||
i = 6;
|
||||
while(i--); /* 保持 68us(>60us 要求) */
|
||||
DSPORT = 1; /* 释放总线 */
|
||||
dat >>= 1; /* 准备下一位 */
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* 函数名:Ds18b20ReadByte
|
||||
* 功能:从 DS18B20 读取一个字节(低位在前)
|
||||
* 输入:无
|
||||
* 输出:返回读取到的字节数据
|
||||
* 时序:每读一位,拉低 1us → 释放 → 等待 6us → 采样总线 → 等待 48us
|
||||
******************************************************************************/
|
||||
unsigned char Ds18b20ReadByte()
|
||||
{
|
||||
unsigned char byte, bi;
|
||||
unsigned int i, j;
|
||||
|
||||
for(j = 8; j > 0; j--)
|
||||
{
|
||||
DSPORT = 0; /* 拉低总线,开始读时隙 */
|
||||
i++;
|
||||
DSPORT = 1; /* 释放总线 */
|
||||
i++;
|
||||
i++; /* 等待约 6us 后采样 */
|
||||
bi = DSPORT; /* 读取当前位 */
|
||||
byte = (byte >> 1) | (bi << 7); /* 低位在前,依次移入 */
|
||||
i = 4;
|
||||
while(i--); /* 等待 48us,确保时隙 >60us */
|
||||
}
|
||||
return byte;
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
/******************************************************************************
|
||||
* 文件名:temp.h
|
||||
* 功能:DS18B20 温度传感器驱动头文件
|
||||
* 硬件接口:P3^7(单总线数据线)
|
||||
* 编译器:Keil C51
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __TEMP_H_
|
||||
#define __TEMP_H_
|
||||
|
||||
#include<reg51.h>
|
||||
|
||||
/* DS18B20 单总线数据引脚定义 */
|
||||
sbit DSPORT=P3^7;
|
||||
|
||||
/* DS18B20 基本操作函数 */
|
||||
unsigned char Ds18b20Init(void); /* 初始化 DS18B20,返回 1=存在 0=不存在 */
|
||||
void Ds18b20WriteByte(unsigned char dat); /* 向 DS18B20 写入一个字节 */
|
||||
unsigned char Ds18b20ReadByte(void); /* 从 DS18B20 读取一个字节 */
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user