基于MC68HC705单片机的来电显示系统设计与实现

发布时间:2026/6/8 17:20:34

基于MC68HC705单片机的来电显示系统设计与实现 1. 项目概述与核心价值如果你在九十年代末或二十一世纪初接触过嵌入式开发尤其是与通信相关的项目那么“来电显示”这个功能绝对是一个绕不开的经典案例。它不像今天的智能手机那样来电信息唾手可得。在那个固定电话还是主流的年代能在电话铃响的间隙从一个小小的液晶屏上看到一串陌生的号码甚至是一个名字那种“科技感”是实实在在的。这个项目就是基于摩托罗拉经典的MC68HC(7)05系列微控制器从头构建一个能够捕获、解析并显示来电信息的嵌入式系统。简单来说这个项目要解决的核心问题是如何让一个成本敏感、资源有限的8位单片机听懂电话线上传来的“摩尔斯电码”即BFSK调制信号并把里面的号码和日期时间信息“翻译”出来最终通过某种方式比如连接到电脑展示给用户。这不仅仅是写几行代码那么简单它涉及对老旧但严谨的电信协议Bellcore规范的深刻理解、对模拟信号处理电路的设计以及如何在单片机上高效实现一个精简的通信协议栈。对于嵌入式开发者而言这是一个绝佳的练手项目能让你把单片机原理、通信协议、硬件接口和软件状态机设计等知识串起来。无论你是想重温经典还是学习如何将复杂协议落地到资源受限的MCU上这篇文章都能给你提供一份详实的“考古”与“复现”指南。2. 来电显示协议深度解析从信号到数据帧在动手写代码和画电路图之前我们必须彻底吃透来电显示Caller ID的协议。这就像你要和一个人对话必须先学会他的语言和沟通规则。来电显示的协议是一个典型的分层结构自底向上分为物理层、数据链路层和消息组装层。2.1 物理层电话线上的“频率密码”物理层定义了信息在模拟电话线上传输的“物理形式”。它规定了两件最关键的事速率和调制方式。传输速率固定为1200 波特Baud允许有±1%的误差。1200波特意味着每秒传输1200个符号在这里一个符号就代表一个二进制位bit。所以其数据速率就是1200 bps。调制方式采用二进制频移键控BFSK。这是一种非常经典且抗干扰能力相对较好的调制方式特别适合语音频带300-3400 Hz信道。逻辑 1用1200 Hz±1%的正弦波表示。逻辑 0用2200 Hz±1%的正弦波表示。为什么选这两个频率因为它们落在电话信道带宽的中心区域远离常见的干扰源如拨号音、忙音并且易于用简单的滤波器分离和解调。在硬件上我们需要一个能识别这两种频率并输出对应高低电平的电路这就是后面要提到的MC145447芯片的核心工作。2.2 数据链路层数据的“包装”与“校验”数据链路层负责把上层给的一串字节消息打包成能在物理层可靠传输的“帧”。它主要做了三件事添加同步头、定义字节格式和提供错误检测。帧结构一个完整的来电显示数据帧在物理层信号之上结构如下信道占用信号Channel Seizure300个交替的0和1以0开始以1结束。这相当于在说“注意我要开始发数据了请调整好你的接收器” 这串固定的0101...模式帮助接收端同步时钟。标志信号Mark Signal连续的180个逻辑1即180个1200Hz信号。这标志着同步结束真正有效的数据即将开始。它提供了一个稳定的“1”状态便于接收端确认同步完成并准备采样数据。有效数据Caller ID Data即消息组装层打包好的数据内容。校验和Checksum1个字节用于错误检测。字节格式每个数据字节包括校验和都采用异步串行格式传输即常见的1个起始位0 8个数据位LSB先传 1个停止位1。所以传输一个字节实际需要发送10个比特。错误检测 - 校验和计算这是确保数据正确性的关键。校验和的计算范围涵盖从“消息类型参数”开始到校验和之前的所有数据字节。算法将所有数据字节相加视为无符号整数求和结果对256取模即只保留低8位然后计算该结果的二进制补码即用0xFF减去该值再加1等价于按位取反后加1。验证接收端将所有接收到的数据字节包括接收到的校验和相加对256取模。如果传输没有错误最终结果应为0。重要限制协议只检错不纠错也没有重传机制。一旦校验失败接收设备只能丢弃整个帧。这就要求硬件设计如MC145447和软件采样必须足够可靠。2.3 消息组装层信息的“语义”与“格式”这一层定义了数据内容的含义和排列方式决定了我们最终能看到的是“号码时间”还是“号码时间姓名”。主要有两种格式单数据消息格式SDMF这是较早期的简单格式。帧头2字节。字节1消息类型。0x04表示包含主叫号码。字节2消息长度。表示后面跟随的数据字节数。对于标准的号码时间信息这个值是固定的。数据区全部为ASCII字符。日期4字节ASCII格式为MMDD。例如7月9日表示为0709。时间4字节ASCII格式为HHMM采用24小时制。例如下午2点05分表示为1405。电话号码10字节ASCII。如果来电是本地号码无区号则前三位用000填充。例如号码5551234会传输为0005551234。多数据消息格式MDMF这是更强大、更灵活的格式可以传输多种信息。帧头同样2字节。字节1消息类型。对于MDMF格式的来电显示数据此值为0x80十进制128。字节2消息长度。指后面所有“参数消息”的总字节数。参数消息序列这是MDMF的核心。数据区由多个“参数消息”串联而成每个参数消息包含一种特定类型的信息。参数消息结构字节1参数类型。例如0x01表示日期和时间0x02表示主叫号码0x07表示主叫姓名。字节2参数长度。表示该参数数据块的字节数。字节3-N参数数据。例如对于类型0x02号码数据就是ASCII码的号码字符串。实操心得协议解析的关键点状态机思维在单片机上解析这个协议本质上是在实现一个状态机。状态包括等待振铃、检测信道占用信号、检测标志信号、接收数据字节、计算校验和、验证帧完整性。时间容差协议中的时间间隔如振铃结束到数据开始之间的0.5-1.5秒有容差范围。软件设计时定时器判断要用“大于最小值且小于最大值”的逻辑而不是判断精确值。字节采样在1200波特率下一个比特的宽度约为833微秒。单片机需要用定时器精确地在比特位中心点采样以提高抗噪能力。起始位的下降沿是重新同步采样时钟的最佳时机。格式兼容一个健壮的解析器应该能同时处理SDMF和MDMF格式。可以先读取消息类型字节进行判断然后分支处理。3. 硬件系统设计与核心芯片选型纸上谈兵结束我们进入实战环节。硬件设计的目标是搭建一个桥梁一边连接着模拟电话线另一边连接着我们的微控制器MCU。核心思路是将复杂的模拟信号处理交给专用芯片让MCU专注于数字协议解析和系统控制。3.1 整体架构与模块划分整个硬件系统可以清晰地划分为两大功能模块来电显示数据采集模块负责与电话线连接完成BFSK信号的解调输出干净的TTL电平数字比特流。核心芯片Motorola MC145447来电显示接收器带振铃检测。输入电话线的Tip和Ring端。输出解调后的数字数据流DOC引脚、振铃检测状态/RDO引脚。主控与键盘接口模块负责协议解析、数据处理并通过模拟键盘协议将信息发送给主机如PC。核心芯片Motorola MC68HC705P9微控制器。功能读取MC145447的数据校验并解析协议将ASCII信息转换为IBM AT键盘扫描码通过键盘接口发送给电脑。3.2 核心芯片详解与电路设计要点3.2.1 MC145447来电显示信号处理专家这颗芯片是硬件设计的灵魂它集成了振铃检测、BFSK解调、数据整形等几乎所有模拟前端功能。电话线接口电路数据输入TITip Input和RIRing Input引脚通过高压电容如0.1µF / 250V分别耦合到电话线的Tip和Ring端。这两个电容隔离了电话线上的直流高压约48V和振铃交流高压约90V RMS只允许交流信号包括我们的1200/2200 Hz BFSK信号进入芯片。振铃检测输入RDI1和RDI2引脚通过一个电阻分压网络连接到经过整流、滤波后的电话线电压。RDI1主要用于唤醒芯片的振铃分析电路当线电压超过约40V RMS时RDI2用于分析振铃信号的占空比以确认是否为有效振铃。/RT引脚外接RC电路用于设定振铃检测的时间窗口。与MCU的接口数据输出DOCData Out Cooked引脚直接连接到MCU的一个输入引脚如PC0。DOC引脚只输出通过内部验证的有效数据字节已去除信道占用和标志信号简化了MCU的编程。状态指示/RDORing Detect Out引脚连接到MCU的另一个输入引脚如PC2。当MC145447检测到有效振铃时此引脚会输出低电平。这是MCU开始监控数据是否到来的关键触发信号。电源控制/PWRUP引脚通常通过RC电路延迟上拉以确保芯片电源稳定后再启动。在参考设计中此引脚被连接到MCU的一个输出引脚PC3由MCU软件控制上电时序从而省去了两个外部阻容元件。注意事项MC145447外围电路保护器件在实际产品中电话线入口必须放置气体放电管GDT和正温度系数热敏电阻PTC等保护器件以防雷击或电源浪涌损坏芯片。实验板可以暂时不用但必须有此意识。滤波电容芯片的电源引脚VDD, VSS必须就近放置去耦电容如0.1µF陶瓷电容以滤除高频噪声确保解调稳定性。时钟源MC145447需要一个外部的3.579545 MHz晶体即NTSC彩色副载波频率来产生内部时钟。晶体的负载电容需要根据数据手册精确匹配。3.2.2 MC68HC705P98位主控的职责这是一款典型的8位OTP一次性可编程单片机资源有限但足以胜任此任务。I/O引脚分配PC0配置为输入连接MC145447的DOC用于读取解调后的数据比特流。PC2配置为输入连接MC145447的/RDO用于检测振铃状态。PC3配置为输出连接MC145447的/PWRUP用于控制芯片上电。PA0-PA5用于模拟IBM AT键盘接口。这是一个双向串行协议时钟线CLK和数据线DATAMCU需要精确地模拟键盘发送扫描码的时序。键盘接口模拟这是本项目的一个巧妙之处。设备被设计成插在电脑键盘口和键盘之间从键盘口取电并通过向主机发送键盘扫描码来“模拟”按键从而将来电信息“输入”到电脑中。这省去了额外的电源和复杂的通信接口如串口。信号DATA数据线和CLK时钟线都是开源输出需要上拉电阻。协议主机降低时钟线启动传输设备在时钟为低时准备数据在时钟上升沿被主机采样。设备发送的每个字节包含1个起始位0、8个数据位LSB先传、1个奇偶校验位和1个停止位1。MCU需要用软件精确模拟此时序。硬件设计避坑指南电平匹配MC145447的输出是标准的CMOS电平0-VDD与MC68HC705P9的输入电平兼容。确保两者共地。键盘接口上拉IBM AT键盘接口的DATA和CLK线必须接上拉电阻通常4.7kΩ到5V否则无法被拉高。电源隔离虽然从键盘口取电方便但要注意键盘口的电流供应能力有限通常100mA左右。整个系统的功耗MCU、MC145447、指示灯等必须仔细核算避免过载。扫描码集务必注意参考设计中使用的是IBM AT键盘扫描码集这与后来更常见的PS/2扫描码集不同。如果你的目标主机是较新的电脑通常使用PS/2接口但兼容AT协议可能需要调整扫描码映射或者确保主机BIOS/OS设置正确。4. 软件设计与固件实现流程硬件是躯体软件是灵魂。MC68HC705P9上的固件需要高效、可靠地协调数据采集和键盘发送两大任务。其核心是一个由外部事件振铃驱动的状态机。4.1 固件主循环与状态机固件上电初始化后便进入一个以检测振铃为起点的循环。初始化配置I/O引脚方向PC0、PC2输入PC3、键盘接口相关引脚输出。初始化定时器用于后续的比特延时和超时判断。将MC145447的/PWRUP引脚拉低一段时间10µs后再拉高确保其可靠上电。所有变量和状态标志清零。等待振铃Idle状态程序在一个循环中持续查询PC2连接/RDO的状态。一旦检测到PC2变为低电平有效振铃记录当前时间并进入“等待振铃结束”状态。振铃结束与数据窗口等待持续监控PC2等待其恢复高电平振铃结束静默期开始。从振铃结束开始启动一个最多2秒的窗口在这个窗口内监控PC0连接DOC。如果在窗口内检测到PC0出现下降沿起始位开始则立即进入“接收数据”状态。如果2秒超时仍未检测到起始位则认为这不是一次有效的来电显示传输可能是普通电话或协议不支持状态机复位返回“等待振铃”状态。接收数据字节检测到起始位后延时0.5个比特时间约416µs到达第一个数据位的中心点采样PC0得到LSB。随后每隔1个比特时间833µs采样一次共采样8次得到8个数据位。再等待1个比特时间采样停止位应为高电平完成一个字节的接收。将接收到的字节存入缓冲区。第一个非0xFF/0x00的字节跳过可能残留的标志信号被认为是消息类型字节据此判断是SDMF还是MDMF格式。校验和验证与帧结束在接收每个数据字节的同时累加它们校验和字节除外以计算校验和。根据消息长度字段知道何时该接收校验和字节。接收完校验和字节后将其加入累加和并对256取模。如果结果为0则帧正确否则标记校验错误。数据转换与发送如果校验通过解析缓冲区中的数据提取日期、时间、号码和/或姓名的ASCII字符串。首先通过键盘接口发送一个CtrlL的扫描码序列。在Windows 95环境下这个快捷键会强制刷新桌面并可能将焦点切换到前台窗口。设计中的CALLERID.EXE程序在后台运行并捕获此按键从而激活自己。然后将解析出的ASCII字符串逐个字符转换为对应的IBM AT键盘“按下”和“弹起”扫描码通过键盘接口发送给主机。如果校验失败则发送一个预定义的错误码序列让主机程序显示错误信息。返回待机发送完成后清空缓冲区状态机复位回到“等待振铃”状态。4.2 键盘通信协议模拟实现模拟键盘协议是固件中时序要求最严格的部分。需要实现两个关键函数Send_Byte_To_Host()和Receive_Byte_From_Host()。发送字节流程检查主机是否将CLK线拉低主机允许发送。延时约60µs。发送起始位0将DATA线拉低。发送8个数据位LSB first在每个CLK低电平期间设置DATA线等待CLK变高再等待其变低然后设置下一位。发送奇偶校验位本例中可能省略或固定。发送停止位1将DATA线释放由上拉电阻拉高。等待主机释放CLK线变高。关键一步等待主机可能发回的“重发命令”0xFE。如果收到则重复发送刚才的字节。本设计设定最多重试一次。接收字节流程用于接收重发命令主机通过拉低DATA线并产生时钟来发送命令。设备在CLK下降沿采样DATA线。接收11个比特起始位8数据位奇偶停止位。软件实现心得与优化技巧中断 vs 查询在资源紧张的8位MCU上需要权衡。对于DOC引脚的数据采样由于比特间隔固定833µs使用定时器中断来驱动采样状态机是最可靠、最不占用CPU的方式。而对于/RDO振铃检测因其是异步事件使用外部中断如果MCU支持或高频查询均可。精确延时所有比特间隔、字节间间隔的延时必须使用硬件定时器实现。软件空循环延时受中断和时钟精度影响大不可靠。缓冲区管理接收数据缓冲区不宜过大256字节足够但结构要清晰。可以定义两个缓冲区一个用于原始字节接收一个用于解析后的ASCII字符串。超时处理在每个可能等待的状态如等待起始位、等待停止位、等待主机时钟都必须加入超时机制。超时后应复位状态机防止程序“卡死”。降低功耗如果设备是电池供电在“等待振铃”状态可以将MCU设置为休眠模式SLEEP用/RDO引脚的中断来唤醒MCU从而大幅降低功耗。5. 主机端软件CALLERID.EXE的角色与设计思路虽然原文档的重点在嵌入式端但一个完整的系统离不开主机软件的配合。CALLERID.EXE作为一个Windows 95应用程序其核心功能是作为一个“键盘记录器”和“信息显示器”。后台驻留与热键监听程序启动后即隐藏主窗口驻留在系统托盘或作为后台服务。它通过Windows API如SetWindowsHookEx设置全局键盘钩子监听所有键盘输入。但它只关心来自特定“键盘”即我们的设备的输入这通常需要通过设备驱动或过滤特定扫描码序列来实现。更简单的方案是监听CtrlL这个不常用的组合键作为激活信号。扫描码到ASCII的转换当捕获到来自设备的扫描码序列时程序需要将其转换回ASCII字符串。这需要维护一个IBM AT扫描码到ASCII字符的映射表。注意设备发送的是“按下”和“弹起”扫描码程序需要过滤掉“弹起”码只处理“按下”码并对修饰键如Shift进行状态管理以处理大小写。协议解析与显示将接收到的ASCII字符串按照SDMF或MDMF格式进行解析提取出日期、时间、号码、姓名等信息。然后更新其对话框界面将这些信息清晰地显示出来。可能还需要提供日志记录、弹出通知等附加功能。错误处理如果接收到设备发来的预定义错误码序列则在界面上显示“接收错误”或“校验失败”等提示信息。主机端开发注意事项权限与兼容性在现代操作系统如Windows 10/11上拦截全局键盘输入需要较高的权限管理员权限并且可能被安全软件拦截。开发时需要妥善处理。多线程键盘钩子回调函数执行要快避免阻塞系统消息队列。收到数据后应尽快将数据投递到工作线程进行解析和显示。模拟与现代替代在今天这种通过键盘接口“模拟按键”的方式已非主流。更通用的做法是让嵌入式设备通过USB CDC虚拟串口或USB HID接口与电脑通信。USB HID无需安装驱动可以直接定义自己的报告描述符来传输结构化数据比模拟键盘更专业、更高效。6. 调试、测试与常见问题排查将硬件焊接好代码烧录进去只是万里长征第一步。让整个系统稳定可靠地工作离不开细致的调试。6.1 调试阶段与工具硬件调试电源首先确保各点电压正常5V。特别是MC145447的VDD。时钟用示波器检查MC145447的晶体引脚确保3.579545MHz波形稳定幅度足够。电话线信号可以使用一个电话线模拟器或旧的调制解调器Modem来产生标准的振铃和BFSK信号这是最理想的测试信号源。切勿直接接入正在使用的电话线进行初期调试。关键点波形用示波器观察/RDO引脚来电时是否出现低电平脉冲。DOC引脚在振铃静默期是否出现规则的方波1200Hz的0101...同步头。软件/固件调试仿真器/调试器如果有MCU的仿真器可以单步跟踪代码观察在检测到振铃、起始位等事件时程序状态是否正常跳转。IO口模拟在没有真实电话信号时可以用另一个MCU或信号发生器模拟DOC引脚输出已知的测试数据帧包括同步头、标志位、测试数据、校验和来验证主MCU的解析逻辑是否正确。键盘接口测试暂时屏蔽来电显示接收部分编写测试代码让MCU循环发送固定的扫描码如字母‘A’看主机是否能正确接收到按键输入。这是验证键盘接口硬件和底层驱动代码是否正常的最直接方法。6.2 常见问题与解决方案速查表问题现象可能原因排查思路与解决方案完全无反应设备不工作1. 电源问题2. MCU未运行3. MC145447未正常工作1. 检查键盘口5V供电是否正常测量MCU VDD引脚。2. 检查MCU复位电路测量晶体是否起振。3. 检查MC145447的/PWRUP引脚时序测量其晶体。主机能收到CtrlL但收不到号码信息1. 未检测到来电显示数据2. 数据解析错误3. 键盘发送部分故障1. 用示波器检查/RDO和DOC在振铃后的波形确认数据是否到来。2. 在代码中设置调试点将接收到的原始字节通过某个IO口如串口打印出来检查是否正确。3. 单独测试键盘发送功能发送固定字符串。收到的号码乱码或部分错误1. 比特采样时序不准2. 校验和经常失败3. 电话线信号质量差1. 调整比特采样的延时中点确保在比特中心采样。使用定时器中断代替延时函数。2. 检查校验和计算代码是否正确。确认接收的字节数是否与消息长度字段匹配。3. 检查MC145447的输入耦合电容、滤波电路。确保测试信号源稳定。偶尔能成功经常失败1. 时序容差不足2. 中断冲突3. 缓冲区溢出1. 放宽协议中时间窗口的判断条件如振铃后等待数据的时间窗口。2. 检查键盘发送时序是否被来电显示接收中断打断。优化中断服务程序尽快退出。3. 确保缓冲区大小足够并在每次接收完成后彻底清空。设备在特定电话或线路上不工作1. 振铃制式不兼容2. 线路阻抗/衰减问题1. 某些交换机可能使用非标准的振铃模式如极性反转作为呼叫等待提示。MC145447的振铃检测电路可能需要调整RDI1/RDI2的分压电阻阈值。2. 长距离或老旧线路信号衰减大可能导致BFSK信号幅度不足。极少数情况下需考虑在输入端增加小信号放大器。6.3 从原型到产品一些进阶考量如果你不满足于做一个实验板而是想把它变成一个可靠的产品还需要考虑更多ESD与浪涌保护电话线是暴露端口必须加入TVS二极管、气体放电管等保护电路通过相关的安规认证如FCC Part 68, ITU-T K.20/K.21。电源管理如果采用电池供电需要充分利用MC145447和MC68HC705P9的休眠模式。在无振铃时让绝大部分电路进入低功耗状态。固件升级对于OTP型MCU一旦程序写错就需要更换芯片。考虑使用带Flash的型号如MC68HC908或预留一个简单的引导程序通过键盘接口进行固件更新。兼容性扩展尝试让解析器同时支持SDMF和MDMF格式。甚至可以尝试解析更复杂的FSK协议如FSK制式的来电显示中国早期标准或DTMF制式的二次拨号音。这个基于MC68HC(7)05的来电显示项目虽然其技术背景属于上一个通信时代但它所蕴含的**“理解协议、设计接口、在资源限制下解决问题”** 的嵌入式开发核心思想至今依然熠熠生辉。通过复现它你收获的不仅仅是一堆能显示号码的代码和电路更是一套处理真实世界通信问题的完整方法论。

相关新闻