最后一次优化和调整代码,增加支持keil4的中文注释。
This commit is contained in:
@@ -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
|
||||
```
|
||||
Reference in New Issue
Block a user