# 系统模块结构图(函数调用关系) ## 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 ```