版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机技术与应用了解串口通信单片机技术与应用
设备间的数据“对话”丨嵌入式系统、工业控制、物联网等高效可靠通信技术串口通信“基础语言”一、什么是串口通信并行通信:同时传输速度快串行通信:计算机和嵌入式系统中:数据传输分为并行通信和串行通信距离短成本高顺序传输速度慢距离长成本低一、什么是串口通信串行通信接口(通常指COM接口)串行接口简称串口一、什么是串口通信低成本:仅需1根数据线(单向)或2根(双向),适合低成本设备间的通信通过单根数据线逐位传输数据串口通信(SerialCommunication)就是基于串行通信方式一、什么是串口通信抗干扰:适用于数米至数十米的远距离传输(如工业现场)通过单根数据线逐位传输数据串口通信(SerialCommunication)就是基于串行通信方式一、什么是串口通信灵活性:支持异步通信(无需时钟线)和同步通信两种模式通过单根数据线逐位传输数据串口通信(SerialCommunication)就是基于串行通信方式二、串口通信的关键要素1.信号线TX(发送线):用于发送数据,例如,单片机TX→
传感器RXRX(接收线):用于接收数据,例如,单片机RX←
传感器TX串口通信需要三个基本信号线:GND(地线):提供参考电平,确保双方电压一致二、串口通信的关键要素2.通信方式单工:数据只能单向传输半双工:数据可以双向传输,但同一时间只能发送或接收(如对讲机)分为:全双工:数据可以同时双向传输(如手机通话)二、串口通信的关键要素3.数据帧起始位:标识数据帧的开始,通常为1位低电平数据位:实际传输的二进制数据(如ASCII码),通常5~8位串口通信的数据以帧为单位传输校验位(可选):用于检测传输错误(奇校验或偶校验),通常为1位停止位:标识数据帧的结束,通常为1~2位高电平二、串口通信的关键要素发送字符‘A’若数据位为8位、无校验位、1位停止位则完整数据帧为:0(起始位)+01000001(数据位)+1(停止位)如图所示:根据实际需求,为数据帧选择合适的数据位、校验位和停止位二、串口通信的关键要素丨4.波特率(BaudRate)双方使用相同的波特率常见的波特率有9600、115200等数据解析乱码位数发送更快更高的波特率二、串口通信的关键要素在实际应用中,常见的串口通信协议有以下几种:5.通信协议:RS-232:通常使用9针或25针的DB接口电平标准为±12V,传输距离较短(约15米)通过MAX232芯片转换,抗干扰强常用于电脑与嵌入式设备之间的通信二、串口通信的关键要素在实际应用中,常见的串口通信协议有以下几种:5.通信协议:RS-485:采用差分信号传输,抗干扰能力强传输距离可达1200米,支持多节点通信常用于工业控制和楼宇自动化系统二、串口通信的关键要素在实际应用中,常见的串口通信协议有以下几种:5.通信协议:TTL电平:电平标准为0V和3.3V/5V,适合短距离(<1m)通信常用于嵌入式设备内部通信,如单片机与模块之间的连接不同的协议适用于不同的应用场景,选择时需要根据实际需求进行权衡二、串口通信的关键要素在嵌入式系统中,串口通信依赖三大模块:6.核心硬件如CC2530的USART模块,负责数据格式转换与电平控制通过晶体振荡器生成基准时钟,确保速率同步临时存储待发送或接收的数据,避免数据丢失收发器波特率发生器缓冲区三、串口通信的实际应用嵌入式设备调试:通过串口将调试信息发送到电脑,方便开发人员查看设备运行状态串口通信在嵌入式开发和工业控制中有广泛的应用,例如:传感器数据采集:将传感器采集的数据通过串口传输到主控板进行处理,再通过WiFi等上传至云端三、串口通信的实际应用工业控制:在工业自动化系统中,串口通信用于连接PLC、传感器和执行器串口通信在嵌入式开发和工业控制中有广泛的应用,例如:智能家居:智能设备通过串口通信与网关进行数据交换结语电子世界的‘传送带’串口把数据比作包裹简单的线路秘密对话结语串口通信作为一种经典的通信方式了解串口通信的原理与实现掌握设备间的数据传输机制成功的要素波特率一致电平匹配线路连通结语设备间的波特率必须相同学习与工作需以严谨、细致的态度对待每一个技术细节结语把控精准技术逻辑以技术之力服务社会在未来的工程实践中认知CC2530串口通信单片机技术与应用
串口是物联网设备的丨拥有两套完整的串口通信系统能通过串口与传感器
上位机实现沟通嘴巴耳朵CC2530广泛应用实践意义一、CC2530串口通信基础集成了两套独立的串行通信接口
USART0和USART1可以工作在异步UART模式或同步SPI模式CC2530的串口通信基于其内置的USART模块实现两个USART接口功能相同一、CC2530串口通信基础TX(发送线)和RX(接收线)UART模式下设备间的异步数据传输成本低、抗干扰能力强适合物联网设备间的通信二、CC2530串口通信机制UART模式:用于异步通信CC2530的USART模块支持两种工作模式:1.双工作模式无时钟信号,双方需约定波特率,发送方发出数据后,不等接收方发回响应,接着发送下一个数据包适合设备间的数据交互二、CC2530串口通信机制SPI模式:用于同步通信CC2530的USART模块支持两种工作模式:1.双工作模式通过时钟信号协调收发,发送方发出数据后,等待接收方发回响应后才发送下一个数据包)适合连接外围设备二、CC2530串口通信机制2.灵活的引脚映射PERCFG(外设控制寄存器)的配置USART接口引脚映射灵活性二、CC2530串口通信机制发送中断和接收中断设计了两个独立的中断通道4.智能中断机制发送中断在数据缓冲器准备接收新数据时触发接收中断则在完整数据帧到达时触发数据传输的高效性和实时性三、CC2530串口通信初始化CC2530一般需分四步初始化(配置)串口1.端口配置:通过寄存器完成端口引脚功能选择与引脚映射配置2.UART配置:通过寄存器完成UART模式选择和数据位
校验位
停止位3.波特率设置:根据所需波特率计算,通过寄存器配置串口工作的波特率4.中断配置:开启通信中断使能四、CC2530串口通信原理1.发送过程通过TX线逐位传输发送端数据按帧电平信号数据写入发送缓冲区自动生成C语言的特性2.接收过程丨接收端检测起始位按波特率定时采样RX线电平,将数据位拼接为完整字节,存入接收缓冲区。若校验位错误,则丢弃数据五、CC2530串口通信功能CC2530的串口通信功能强大,主要体现在以下方面:1.设备间数据交互:在UART模式下,CC2530可以通过TX和RX引脚实现设备间的全双工通信,适合需要实时交互的物联网场景2.连接外围设备:在SPI模式下,CC2530可以通过同步时钟信号连接Flash存储器、传感器等外围设备,实现高速数据传输3.设备调试:在开发过程中,通过USB转串口工具连接CC2530的调试接口,可以实时查看设备运行日志,快速定位和解决问题,提升开发效率六、CC2530串口通信应用场景物联网领域的典型应用场景CC2530串口通信在智慧农业监测系统中,CC2530通过UART模式连接土壤温湿度传感器,以9600bps的速率持续采集环境数据。当数据异常时,立即通过另一路USART连接的LoRa模块向控制中心发送预警信息在工业自动化场景中,CC2530通过串口通信实时实现设备间的指令传输和数据交换在智能家居系统中,CC2530通过串口与Wi-Fi模块通信,实现设备间的无线控制和数据传输结语通过特定的协议和配置,实现设备间高效、可靠的数据传输CC2530串口通信利用其内置的硬件模块展现了其在物联网领域的强大能力结语秉持严谨的态度技术研发中串口通信需要精确的规则创新驱动发展技术赋能社会实现PC机与CC2530的串口通信任务分析单片机技术与应用CC2530作为核心通信模块需与PC机进行数据交互通过串口通信实现双向数据传输为无线组网奠定基础任务要求本次任务是通过CC2530芯片的串口模块实现与PC机的数据通信,具体来说,就是CC2530接收来自上位机(PC机)串口调试助手发送来的数据
后,反向向PC机发送字符串
,
并显示在串口调试助手的数据接收区TOM#Hi,TOM本任务采用串口0(USART0)进行通信任务要求任务完成需要配备一条公母串口线或USB转串口线连接(如图所示)上位机与开发板(本实验采用USB转串口,需提前安装好驱动后确定端口号)任务要求并在串口调试助手的(如图所示)串口配置区,选择对应端口号,设置115200波特率、无校验位、8个数据位、1个停止位等信息;然后点击“打开串口”按钮打开串口,在发送区发送数据,并在接收区查看CC2530回传的数据。任务要求数据发送接收机制数据帧这一任务不仅涉及串口的相关配置与操作基础知识CC2530串口通信基础要点通信设备在串口通信中:CC2530作为下位机执行PC机的控制指令或回传信息PC机作为上位机负责发送指令、接收下位机的数据并分析显示结果二者通过UART协议实现高效协同结构原理串口通信采用串行传输,数据按位顺序通过TX(发送)、RX(接收)引脚逐位传输,支持全双工模式(收发同步进行)。基础知识参数配置停止位:帧结束标识(1/2位)数据位:每帧数据位数(7/8位)波特率:传输速率(bps),需收发双方完全一致校验位:奇偶校验或无校验,用于错误检测基础知识数据交互方式中断驱动:数据到达时触发中断,由中断服务程序处理轮询:定期查询串口状态,检测数据到达基础知识帧格式与同步协议帧含起始位(标识帧开始)、数据位、校验位(错误检测)、停止位(帧结束)帧同步机制确保收发端对齐,校验位或CRC校验保障数据完整性错误校验与重传可采用奇偶校验检测数据传输错误,接收端校验失败时反馈重传请求,提升通信准确性基础知识硬件连接CC2530与PC机的串口连接,使用RS232、USB转串口线等物理介质,匹配电气标准(如TTL电平)和机械接口规范软件实现依赖串口调试助手,为PC机配置好与CC2530一致的波特率、帧结构等参数;并为CC2530编程,控制CC2530与PC机的串口数据收发基础知识任务所需关键寄存器系统时钟初始化所需寄存器CLKCONSTA:反映时钟状态CLKCONCMD:选择主时钟源和主频基础知识P2DIR:确保UART0优先使用P0口P0SEL:设P0.2/P0.3引脚为外设模式(RXD/TXD)PERCFG:UART0映射到P0口串口0初始化所需寄存器或位基础知识IEN0:配置总中断使能和接收中断使能U0GCR和U0BAUD:配置波特率U0CSR:配置UART模式,允许接收串口0初始化所需寄存器或位基础知识UTX0IF和URX0IF:用于TX和RX的中断标志位设置U0DBUF:USART0用于接收/发送数据缓存,一次收发一个字节数据发送与接收所需寄存器或位任务目标通过完成任务全面认知串口通信的硬件架构理解串口通信的基本原理,熟练掌握串口通信的参数配置和编程提升硬件与软件协同工作的能力,提升嵌入式系统开发的综合能力为后续复杂项目奠定基础硬件连接要点解析CC2530与PC机串口连接拓扑结构硬件连接要点解析
PC端接口:通常为USB或RS-232串口(老式PC机)电平转换模块:用于匹配TTL(CC2530)与RS-232/CMOS(PC机)电平标准,常见方案包括:CC2530开发板:核心控制单元,需配置串口引脚与供电USB转TTL模块(如CH340、CP2102、FT232)RS-232转TTL模块(如MAX3232芯片)硬件连接要点解析串口通信连接原理CC2530使用的电平为TTL电平,而PC机使用的是CMOS电平,所以在与PC机进行串口通信时,需要电平转换电路来匹配逻辑电平。本实验使用串口转USB接口电路来匹配逻辑电平,同时使得CC2530与PC机之间的硬件连接更加方便。硬件连接要点解析TXD:发送端→连接CC2530的RXD(P0.2)RXD:接收端→连接CC2530的TXD(P0.3)TXD:与开发板共地任务实现原理分析硬件架构使用USB转串口线连接PC机与CC2530开发板,并下载安装USB转串口的驱动,最终能在“计算机管理”的“设备管理器”中看到安装好的端口即可。任务实现原理分析硬件架构CC2530引脚映射:使用USART0进行串口通信,默认使用P0.2(RX)、P0.3(TX)准备CC2530仿真器,用于将任务程序下载至CC2530开发板,为实现PC机与CC2530的串口数据收发作准备任务实现原理分析通过相关时钟寄存器配置32MHZ系统时钟,以便确定波特率等通过相关寄存器初始化串口UART0,配置引脚、UART模式、波特率,使能中断等CC2530的程序控制进入主循环,等待PC机发送来的数据“TOM#”,当检测到有效数据包时,就将数据包内容陆续存入接收缓冲区数组,直到检测到“#”这个数据结束符,就禁止接收,转而向PC机发送“Hi,TOM”。此轮收发结束后,打开接收,继续不断循环以上收发流程。采用接收中断驱动模式实时响应数据到达事件,相比轮询方式,显著降低CPU占用率,提升系统响应速度。任务实现原理分析打开串口调试助手,在串口配置区,选择端口号,并设置波特率、校验位、数据、停止位等信息,注意以上信息需要与CC2530的串口设置要完全一致,以便定义标准帧格式(起始位+数据+校验+停止位),保障协议兼容性。PC机的软件配置任务实现原理分析在助手的发送区,输入“TOM#”,点击自动发送或手动发送。如果两方配置均正确的情况下,就会在接收区看到CC2530传来的“Hi,TOM”。PC机的软件配置任务实现原理分析CC2530串口数据收发机制接收端:RX引脚持续监测,接收到完整帧后触发读取操作发送端:数据写入TX引脚后,串口模块自动按帧发送实现PC机与CC2530高效稳定的串口通信单片机技术与应用掌握了串口通信的关键技术提升了解决实际问题的能力精益求精,不断追求卓越用科技的力量为实现中国梦贡献智慧和力量实现PC机与CC2530的串口通信程序设计分析连接PC机与CC2530的串口程序设计总流程通过USB转串口线PC机串口收发信息逻辑在PC机上打开串口调试助手与CC2530串口配置一致的通信参数在串口调试助手发送区自动发送“TOM#”在串口调试助手接收区显示“Hi,TOM”CC2530串口配置初始化程序设计总流程主时钟初始化CC2530串口编程控制数据收发逻辑等待PC传过来数据“TOM#”给PC机串口回传信息“Hi,TOM”程序设计总流程需要了解基本电路连接掌握串口配置与工作原理分析任务实现的过程设计出任务实现的程序流程图根据程序流程图进行程序编写最终在开发板上实现此任务任务实验设计思路
硬件准备CC2530黑色开发板、仿真器、PC机、USB转串口线任务实验设计思路
仿真器用于给CC2530下载控制程序PC机向CC2530发送数据并显示CC2530回传的指定格式数据USB转串口线联接PC机与CC2530开发板任务实验设计思路编写系统时钟初始化函数通过CLKCONCMD寄存器用于配置32MHZ晶振时钟源与时钟主频32MHZ通过CLKCONSTA寄存器等待时钟状态的稳定任务实验设计思路(1)PERCFG寄存器,设置UART0映射到P0端口位置1引脚(2)P0SEL寄存器,将默认位置1的P0_2、P0_3引脚配置为外设I/O功能,以对应串口RX、TX(3)P2DIR寄存器,控件UART0使用P0口的优先级(4)U0CSR寄存器,允许UART模式接收(5)U0GCR寄存器
与U0BAUD寄存器,设置指定波特率(6)URX0IF清零接收中断标志(7)IEN0寄存器使能总中断和UART0接收中断任务实验设计思路
编写CC2530串口收发机制编写数据发送函
数写入UART0发送缓冲区硬件自动按帧发送任务实验设计思路接收数据采用的是中断驱动方式,当UART0接收到每一个完整数据帧时,触发接收中断,在中断服务程序中将单字节数据(即单字符)从接收缓冲区(U0DBUF寄存器)中读取并存储到临时变量中,以便到时存入到数组中统一处理任务实验设计思路编写主函数在主函数中:分别调用系统时钟与串口初始化函数完成初始化设置进入主循环后准备好下一轮的接收等待接收PC机传过来的字符并存入缓存数组接收到“#”就停止接收按格式回传数据给PC机任务实验设计思路编程实现目标
编程语言使用C语言,熟练使用C语言的语法和函数,编写控制程序。
编写清晰、易读的代码,以便于后期的调试和维护。
确保编写的整个程序在运行过程中的稳定可靠,无异常现象。任务实验设计思路优化与调试
代码结构需优化,将各功能模块代码封装为函数,提高程序的可读性和可维护性,方便在其他项目中复用。检查并调试程序的执行流程,观察程序是否能够实时、正确地实现PC机与CC2530之间的数据交流。可根据实际需求,调整波特率、数据位、停止位等参数,优化通信效率和稳定性。例如,增加波特率可以提高数据传输速度,但需确保硬件支持。实验设计流程图应用扩展基于上述设计流程,我们还可以进一步利用CC2530的其他功能,实现更复杂的物联网应用。例如:
利用ADC模块采集传感器数据,并通过串口将数据发送到PC机进行实时监控。数据类型结语实现PC机与CC2530的串口通信
硬件连接、软件设计、编程实现、调试优化串口相关寄存器配置串口通信基本原理串口通信UART(异步收发)模块串口通信基本原理数据发送数据接收波特率控制UART模块的核心功能串口相关寄存器配置时钟控制命令寄存器CLKCONCMD和时钟控制状态寄存器CLKCONSTACLKCONCMD:动态配置系统时钟源、分频系数及定时器时钟参数。CLKCONSTA:只读属性,实时反映当前生效的时钟配置状态,用于验证
CLKCONCMD
写入后的硬件同步结果。串口通信基本原理配置示例CLKCONCMD&=~0x40;while(CLKCONSTA&0X40);CLKCONCMD&=~0x07;串口相关寄存器配置示例说明注意:写入此位后,硬件需要时间切换时钟源。通过&与~的运算,将CLKCONCMD寄存器的第6位(OSC位)设置为0,选择32MHz外部晶振的系统时钟源。CLKCONCMD&=~0x40;串口相关寄存器配置while(CLKCONSTA&0X40);达到等待晶振稳定的目的:时钟源的改变首先在CLKCONSTA.OSC位与CLKCONCMD.OSC位相等的时候才生效,系统才稳定。示例说明串口相关寄存器配置while(CLKCONSTA&0X40);通过循环,等待CLKCONSTA寄存器的第6位(OSC位)置0,确保系统主时钟源完成从16MHzRC振荡器
切换至
32MHz的外部晶体振荡器且稳定。示例说明串口相关寄存器配置示例说明CLKCONCMD&=~0x07;先切换时钟源,再设置系统时钟频率,确保时钟的稳定性与可靠性。UART等外设依赖于主时钟,未稳定的时钟会导致通信乱码。完成时钟源切换后,再调整分频系数,通过&与~的运算,设置CLKCONCMD寄存器第2-0位(CLKSPD位)=000,选择系统主频32MHz。作用:
外设控制寄存器—PERCFG
选择串口USARTx的引脚位置功能CC2530芯片USART0USART1
异步模式(UART)
同步模式(SPI)外设控制寄存器—PERCFGPERCFG寄存器主要用于配置外设的I/O引脚映射位置,其位1-0分别是USART1和USART0的配置位,如置0则USART1和USART0的I/O引脚映射位置是选择备用位置1,如置1则选择备用位置2。外设控制寄存器—PERCFGUSART0和USART1两个串口备用位置1与2的I/O引脚映射对比外设控制寄存器—PERCFGUSART0串口引脚位置位置1USART1串口引脚位置使用P0_2(RX)、P0_3(TX)位置2使用P1_4(RX)、P1_5(TX)位置1使用P0_5(RX)、P0_4(TX)位置2使用P1_7(RX)、P1_6(TX)外设控制寄存器—PERCFG配置示例:PERCFG=0x00;示例说明:设置USART1和USART0的串口引脚位置均选择默认位置1,即USART0串口引脚位置:P0_2(RX)、P0_3(TX);USART1串口引脚位置:P0_5(RX)、P0_4(TX)作用:选择串口引脚的具体位置Px端口功能选择寄存器—PxSEL功能:将Px端口对应位引脚配置为外设I/O功能(非GPIO)示例说明:0x3C的二进制00111100通过将P0SEL位5-2置1配置引脚P0_2至P0_5为外设I/O功能(串口通信)其中P0_2、P0_3分别作为串口RX、TX配置示例:P0SEL|=0x3C;作用:配置Px端口引脚的I/O功能。端口2方向和端口0外设优先级控制寄存器—P2DIR功能:可控制端口0外设优先级示例说明:~0xC0的二进制是00111111通过&与~的运算位7-6配置为00确保UART0优先使用P0口配置示例:P2DIR&=~0xC0;作用:若多个外设共用同一端口0时,可通过P2DIR寄存器设置优先级;也可设置P2.4到P2.0的I/O方向。串口x控制和状态寄存器—UxCSR
配置USARTx的模式和状态功能UART模式SPI模式MODE位使能接收RE位外设控制寄存器—PERCFG配置示例:U0CSR|=0XC0;0xC0的二进制为11000000:U0CSR的位7(MODE位)是串口模式选择位置1启用USART通信模式为UART模式,置0为SPI模式;位6(RE位)操作UART接收器使能,置0为关闭接收,置1为允许接收。此代码最终配置串口0启用UART模式,使能UART接收器作用:串口x工作启用模式设置,为串口通信提供基础。
USARTx通用控制寄存器—UxGCR与
波特率控制寄存器UxBAUDf为系统时钟(如32MHz)波特率计算公式BAUD_M(波特率小数部分)BAUD_E(波特率指数)
由设置小数部分的UxBAUD和设置指数部分的UxGCR联合设置。USARTx通用控制寄存器—UxGCR与
波特率控制寄存器UxBAUD基于32MHz系统时钟,若时钟不同(即16MHz)需重新计算波特率USARTx通用控制寄存器—UxGCR与
波特率控制寄存器UxBAUD配置示例:U0BAUD=216;U0GCR=11;示例说明:U0BAUD=216;:是将U0BAUD的位7-0(位BAUD_M)设置为216。作用:配置串口通信波特率U0GCR=11;:是将U0GCR的位4-0(位BAUD_E)设置为11。以上设置对应波特率为115200。UARTx控制寄存器—UxUCR功能:清空缓冲区,避免数据冲突,并设置通信时的参数如流控制、校验位、传送。配置示例:U0UCR|=0x80作用:用于配置串口UART的附加功能。主体设置位7(FLUSH位)为1,清空缓冲区,其他通信参数默认。示例说明:TX中断标志位—UTX0IF位/UTX1IF位功能:此位为0时串口的TX(发送)无中断未决,为1则有中断未决。配置示例:UTX0IF=0;作用:用于设置串口的TX中断标志位。清零UART0的TX中断标志。示例说明:TX中断标志位—UTX0IF位/UTX1IF位功能:此位为0时串口的RX(接收)无中断未决,为1则有中断未决。配置示例:URX0IF=0;作用:用于设置串口RX中断标志位。清零UART0的RX中断标志。示例说明:中断使能0寄存器—IEN0功能:配置总中断使能和接收中断使能。配置示例:IEN0=0X84;作用:使能各中断,为中断响应提供基础1)IEN0的位7(EA位)置1,使能总中断示例说明:2)IEN0的位2(URX0IE)置1,使能接收中断USARTx接收/传送数据缓存寄存器—UxDBUF以串口0为例发送数据:将待发送的字节写入U0DBUF后,硬件自动启动串行传输,数据通过TXD引脚逐位输出。当前一字节已发送完成时,UTX0IF会被自动置1,表示可以发送新数据。当新数据字节写入U0DBUF时,硬件会自动清零UTX0IF(避免重复中断)。如连续发送,需等待UTX0IF置1后再写入下一个字节。接收数据:当RXD引脚检测到完整字节时,硬件自动将数据存入U0DBUF,并置1接收完成标志位URX0IF。程序需先检查URX0IF是否为1,确认数据有效后读取U0DBUF,读取完成后必须手动清除URX0IF标志位以准备下一次接收。USARTx接收/传送数据缓存寄存器—UxDBUF发送数据:将待发送的字节写入U0DBUF后,硬件自动启动串行传输,数据通过TXD引脚逐位输出。当前一字节已发送完成时,UTX0IF会被自动置1,表示可以发送新数据。当新数据字节写入U0DBUF时,硬件会自动清零UTX0IF(避免重复中断)。如连续发送,需等待UTX0IF置1后再写入下一个字节。接收数据:当RXD引脚检测到完整字节时,硬件自动将数据存入U0DBUF,并置1接收完成标志位URX0IF。程序需先检查URX0IF是否为1,确认数据有效后读取U0DBUF,读取完成后必须手动清除URX0IF标志位以准备下一次接收。以串口0为例USARTx接收/传送数据缓存寄存器—UxDBUF接收数据:当RXD引脚检测到完整字节时,硬件自动将数据存入U0DBUF,并置1接收完成标志位URX0IF。程序需先检查URX0IF是否为1,确认数据有效后读取U0DBUF,读取完成后必须手动清除URX0IF标志位以准备下一次接收。物理特性:8位寄存器,直接映射到USART硬件模块,支持单字节操作。以串口0为例USARTx接收/传送数据缓存寄存器—UxDBUF示例说明:U0DBUF=*data_tx++;:将数据写入U0DBUF功能:作为数据发送和接收的缓冲区,实现数据的物理层收发操作。temp=U0DBUF;:读出U0DBUF的值赋予变量temp配置示例U0DBUF=*data_tx++;temp=U0DBUF;应用扩展通过掌握串口通信的基本原理和寄存器配置方法,可以进一步扩展CC2530的应用场景。1.通过串口通信,将温湿度传感器、光照传感器采集的数据传输到PC机或云端,实现环境监测。2.通过串口通信,结合无线模块(如Wi-Fi、LoRa),实现远程设备的控制和监控,应用于智能家居、工业自动化等领域。了解嵌入式C语言与普通C语言的联系与区别
技术是为人类服务的将所学知识应用到实际项目
以严谨的态度和创新的精神实现PC机与CC2530的串口通信代码分析数据类型编写“实现PC机与CC2530串口通信”任务代码的逻辑思路串口的基本配置方式数据类型#include<ioCC2530.h>charname_string[20];unsignedchartemp,RX_flag,count=0;//*****************************时钟初始化函数********************************voidSysClock_Init(){CLKCONCMD&=~0x40;//选择32MHz晶振
while(CLKCONSTA&0x40);//等待时钟稳定CLKCONCMD&=~0x07;//32MHz主时钟}//*******************************延时函数*************************************voiddelay(unsignedinti){unsignedintj,k;for(k=0;k<i;k++){for(j=0;j<500;j++);}}//*****************************串口初始化函数********************************voidinitial_usart(){PERCFG=0X00;//usart0使用备用位置1TX-P0.3RX-P0.2P0SEL|=0X3C;//P0.2P0.3P0.4P0.5用于外设功能
P2DIR&=~0xC0;//P0优先作为UART方式
U0CSR|=0XC0;//uart模式
允许接收
U0GCR=11;U0BAUD=216;//波特率设为115200URX0IF=0;//uart0RX中断标志位清零
IEN0=0X84;//接收中断使能
总中断使能
}//******************************串口发送函数********************************voiduart_tx_string(char*data_tx,intlen){unsignedintj;for(j=0;j<len;j++){U0DBUF=*data_tx++;while(UTX0IF==0);UTX0IF=0;}}//*************************串口接收中断服务函数*****************************#pragmavector=URX0_VECTOR__interruptvoidUART0_RX_ISR(void){URX0IF=0;temp=U0DBUF;RX_flag=1;}//**********************************主函数************************************voidmain(void){SysClock_Init();//调用时钟初始化函数initial_usart();//调用UART初始化函数
while(1){if(RX_flag==1){RX_flag=0;if(temp!='#'){name_string[count++]=temp;//存储接收数据:名字+#
}else{U0CSR&=~0X40;//禁止接收
//名字接收结束,发送Hi+空格
uart_tx_string("Hi,",sizeof("Hi,"));delay(1000);//发送名字字符串uart_tx_string(name_string,sizeof(name_string));count=0;U0CSR|=0X40;//允许接收
}}}}包含头文件ioCC2530.hCC2530开发的专用头文件硬件抽象层的核心组成部分#include"ioCC2530.h"包含头文件寄存器映射位定义中断向量表为开发者定义全局变量charname_string[20];unsignedchartemp,RX_flag,count=0;charname_string[20];定义字符型数组:name_string用于存储通过串口接收到的从PC发送的用户名字符序列,直到遇到结束符
#(即保存发送来的“TOM#”中的T、O、M),以便后续处理回传。数组大小:20实际有效存储长度为19字符定义全局变量定义三个无符号的字符型变量:tempRX_flagcountcharname_string[20];unsignedchartemp,RX_flag,count=0;定义全局变量定义三个无符号的字符型变量:tempCC2530每次接收到新字符时,硬件触发中断,进入串口接收中断服务函数(UART0_RX_ISR)中,会读取U0DBUF中接收的单个字符,存入temp。再将temp传递给主循环处理,根据temp值是否为“#”决定存储或结束接收。temp是中断与主循环间的数据传递桥梁。RX_flagcountcharname_string[20];unsignedchartemp,RX_flag,count=0;定义全局变量定义三个无符号的字符型变量:temp接收完成标志,用于通知主循环有新的字符需要处理。在接收中断服务函数(UART0_RX_ISR)中会被置1(即接收到字符)。在主循环中通过
if(RX_flag==1)
进入处理逻辑后清0,实现中断与主程序间的通信,是同步中断和主程序的关键标志。RX_flagcountcharname_string[20];unsignedchartemp,RX_flag,count=0;定义全局变量定义三个无符号的字符型变量:temp数据name_string的索引,初始化为0,每接收一个字符,count递增,直到遇到“#”时复位为0。RX_flagcountcharname_string[20];unsignedchartemp,RX_flag,count=0;系统时钟初始化函数SysClock_Init()voidSysClock_Init(){CLKCONCMD&=~0x40;while(CLKCONSTA&0x40);CLKCONCMD&=~0x07;}CLKCONCMD&=~0x40;:清零CLKCONCMD.OSC位系统时钟从所选的主系统时钟源获的选择32MHz外部晶振时钟源系统时钟初始化函数SysClock_Init()voidSysClock_Init(){CLKCONCMD&=~0x40;while(CLKCONSTA&0x40);CLKCONCMD&=~0x07;}while(CLKCONSTA&0x40);:
等待时钟状态稳定(直到OSC位变为0)时钟源的改变在CLKCONSTA.OSC=CLKCONCMD.OSC的时候生效系统时钟初始化函数SysClock_Init()voidSysClock_Init(){CLKCONCMD&=~0x40;while(CLKCONSTA&0x40);CLKCONCMD&=~0x07;}CLKCONCMD&=~0x07;:设置CLKCONCMD.CLKSPD为000系统主时钟频率=32MHz系统时钟初始化函数SysClock_Init()选择晶振等待稳定设置主频时钟配置顺序必须遵循系统时钟初始化函数SysClock_Init()CLKCONCMD配置CLKCONSTA状态读取延时函数delay()voiddelay(unsignedinti){unsignedintj,k;for(k=0;k<i;k++){for(j=0;j<500;j++);}}延时函数:内层循环约消耗1ms(在32MHz下)而外层循环控制总延时次数延时函数delay()voiddelay(unsignedinti){unsignedintj,k;for(k=0;k<i;k++){for(j=0;j<500;j++);}}延时函数:延时函数精度低,受编译器优化影响。建议改用定时器精确延时。串口初始化函数initial_usart()voidinitial_usart(){PERCFG=0X00;P0SEL|=0X3C;P2DIR&=\~0xC0;U0CSR|=0XC0;U0GCR=11;U0BAUD=216;URX0IF=0;IEN0=0X84;}PERCFG=0X00;:外设控制,设置UART0映射到P0口,选择默认位置1。P0SEL|=0X3C;:将P0端口对应位引脚配置为外设I/O功能,P0_2、P0_3分别对应串口RX、TX。P2DIR&=\~0xC0;:确保UART0优先使用P0口。串口初始化函数initial_usart()voidinitial_usart(){PERCFG=0X00;P0SEL|=0X3C;P2DIR&=\~0xC0;U0CSR|=0XC0;U0GCR=11;U0BAUD=216;URX0IF=0;IEN0=0X84;}U0CSR|=0XC0;:使能UART模式(0x80)且使能接收(0x40)。U0GCR=11;与U0BAUD=216;:合作设置波特率参数115200bps。URX0IF=0;:清零接收中断标志。IEN0=0X84;:使能总中断(0x80)和UART0接收中断(0x04)。串口发送函数uart_tx_string()voiduart_tx_string(char*data_tx,intlen){unsignedintj;for(j=0;j<len;j++){U0DBUF=*data_tx++;//写入发送缓冲区while(UTX0IF==0);//等待发送完成(UTX0IF置1)UTX0IF=0;}}unsignedintj;:定义无符号整形变量j,用于控制循环次数。串口发送函数uart_tx_string()voiduart_tx_string(char*data_tx,intlen){unsignedintj;for(j=0;j<len;j++){U0DBUF=*data_tx++;//写入发送缓冲区while(UTX0IF==0);//等待发送完成(UTX0IF置1)UTX0IF=0;}}for循环:通过循环,完成陆续将按单字符传发送缓冲区U0DBUF,并发送出去。串口发送函数uart_tx_string()voiduart_tx_string(char*data_tx,intlen){unsignedintj;for(j=0;j<len;j++){U0DBUF=*data_tx++;//写入发送缓冲区while(UTX0IF==0);//等待发送完成(UTX0IF置1)UTX0IF=0;}}U0DBUF=*data_tx++;:将单字节数据(字符)写入发送缓冲区U0DBUF。串口发送函数uart_tx_string()voiduart_tx_string(char*data_tx,intlen){unsignedintj;for(j=0;j<len;j++){U0DBUF=*data_tx++;//写入发送缓冲区while(UTX0IF==0);//等待发送完成(UTX0IF置1)UTX0IF=0;}}while(UTX0IF==0):等待U0DBUF中的单字符发送完成,UTX0IF会自动置1。串口发送函数uart_tx_string()voiduart_tx_string(char*data_tx,intlen){unsignedintj;for(j=0;j<len;j++){U0DBUF=*data_tx++;//写入发送缓冲区while(UTX0IF==0);//等待发送完成(UTX0IF置1)UTX0IF=0;}}UTX0IF=0;:在发送函数中显式清零UTX0IF,可避免运行机制差异的不确定性,以适配所有硬件状态。串口接收中断服务函数UART0_RX_ISR()#pragmavector=URX0_VECTOR__interruptvoidUART0_RX_ISR(void){URX0IF=0;temp=U0DBUF;RX_flag=1;}#pragmavector=URX0_VECTOR:#pragmavector:IAR编译器特有的预处理指令,用于指定中断服务函数(ISR)与中断向量地址的绑定关系。#pragmavector=URX0_VECTOR:URX0_VECTOR:预定义的宏,表示UART0接收中断的向量地址(在ioCC2530.h中定义为0x13)。__interruptvoidUART0_RX_ISR(void){}:__interrupt关键字:告知编译器该函数UART0_RX_ISR()是中断服务程序。串口接收中断服务函数UART0_RX_ISR()#pragmavector=URX0_VECTOR__interruptvoidUART0_RX_ISR(void){URX0IF=0;temp=U0DBUF;RX_flag=1;}URX0IF=0;:清零RX接收中断标志:中断触发后立即清除标志,可避免重复中断。temp=U0DBUF;:清零RX接收中断标志:读取接收缓冲区U0DBUF的单字节数据到临时变量tempRX_flag=1;:置位接收完成标志:以便通知主程序(见主循环代码)主函数main()voidmain(void){SysClock_Init();initial_usart();while(1){if(RX_flag==1){RX_flag=0;if(temp!='#'){name_string[count++]=temp;}
else{U0CSR&=~0X40;uart_tx_string("Hi,",sizeof("Hi,"));delay(1000);uart_tx_string(name_string,sizeof(name_string));count=0;U0CSR|=0X40;}}}}主函数main()功能:可控制端口0外设优先级initial_usart();:调用函数initial_usart()初始化串口0SysClock_Init();:调用函数SysClock_Init()初始化系统时钟while(1){}:主循环,用于重复收发主函数main()if外分支结构的判断逻辑1)当检测接收完成标志RX_flag为1时,先清零RX_flag接下来,进入if内分支检测temp内的字符,如为非结束符'#'时,则按顺序存储进数组name_string。否则(即接收到结束符'#,代表名字字符已接收完毕),通过配置U0CSR暂时关闭接收。开始转向发送,先通过uart_tx_string()函数发送"Hi,",延时一会儿,再通过uart_tx_string()函数发送整个名字数组name_string。最后计数变量count清零,以便重新计数数组元素,最后通过配置U0CSR重新开发接收,进入下一轮收发操作。单片机技术与应用通过直接操作寄存器嵌入式开发的灵活性高效实现了硬件控制实现PC机与CC2530的串口通信实施展示实验准备硬件资源:CC2530开发实验板:板上已有核心控制单元CC2530芯片,并有串口接口,支持串口通信功能。公母串口线或USB转串口线(本实验使用U转串):用于连接PC机与CC2530开发板,实现串口通信。PC机:作为上位机,用于向串口发送数据和显示接收的串口数据。用于连接CC2530开发板与PC机的下载仿真器CCDebugger。IAREmbeddedWorkbenchfor8051:作为开发环境,支持代码编写、编译、下载、调试。实验准备软件资源:串口调试助手:用于PC机与CC2530之间的串口数据收发测试。使用IAR开发环境创建项目CC2530开发板PC机仿真器CCDebugger实验总结注意事项:确保仿真器与开发板连接正确,避免程序无法下载运行;确保所有硬件连接正确无误,避免短路或接触不良。如果使用USB转串口线连接PC机与CC2530开发板,必须为USB转串口线下载驱动,完成驱动安装后,要先在PC机的“设备管理器”中查看串口端口号,以便在串口调试助手中进行正确的端口号配置。但如果使用公母串口线进行连接,一般可以即插即用,并且串口端口号为“COM1”。因为代码原始设定的数组大小为20,在PC机输入的用户名字符元素个数应不超过19个(需预留1字节存放字符串终止符
\0),这点应特别注意,否则会导致错误。如果系统报错,需仔细检查语法或配置问题;项目创建与配置过程需正确,否则项目无法创建有效的可执行程序。count未限制在name_string定义的长度内若接收超过19个字符(不含#)会导致溢出。需增加name_string的溢出保护,以避免数组越界。拓展思考任务代码应进一步优化:原代码中的使用了延时函数进行延时,但精度不够,可否改成定时器进行延时?单片机技术与应用串口调试助手完整展示数据通信单片机技术与应用技术服务于社会贡献智慧与力量秉承严谨求实的科学态度C语言编程基础回顾数据类型嵌入式系统中传感器采集到的往往是模拟信号而微控制器只会处理数字信号转换为离散数字信号单片机技术与应用其内置的A-D转换器A-D转换电信号形式与ADC
信号是信息的载体发送接收变换模拟信号和数字信号电信号形式与ADC模拟信号也称为连续信号,是指用连续变化的物理量所表达的信息,如温度、压力等。电信号形式与ADC数字信号是离散的,是用0和1表示物理状态。电信号形式与ADC模拟/数字转换打开IAREmbedd打开IAREmbeddedWorkbenchfor8051的开发环境,新建一个项目,首先,点击“File”菜单,选择“New”,再点击“Workspace”,创建一个新的工作区。然后,点击“Project”菜单,选择“CreateNewProject”。在弹出的对话框中,我们选择“8051”项目类型,这是因为CC2530基于8051内核。接着,设置项目名称,比如“LED_Flash”,并选择合适的保存路径,点击“保存”,这样一个新的项目就创建好了(注意同步保存工作区)。edWorkbenchfor8051的开发环境,新建一个项目,首先,点击“File”菜单,选择“New”,再点击“Workspace”,创建一个新的工作区。然后,点击“Project”菜单,选择“CreateNewProject”。在弹出的对话框中,我们选择“8051”项目类型,这是因为CC2530基于8051内核。接着,设置项目名称,比如“LED_Flash”,并选择合适的保存路径,点击“保存”,这样一个新的项目就创建好了(注意同步保存工作区)。将输入的模拟信号转换为数字信号。传感器将采集到的连续物理量转换成与之相对应的连续的电压模拟信号。而要处理这些信号的单片机只能接收数字信号0和1,因此要有专门的ADC(数模转换器)将时间和幅值连续的模拟量(电压信号)转化为时间和幅值离散的一串数字量,然后再送到微处理器中进一步处理。ADC的转换过程A-D转换一般要经过采样、保持、量化和编码4个过程。ADC的转换过程在ADC的最前端是一个模拟电压输入,模拟电压是一个连续的信号。首先,我们通过采样将这个连续的电压信号变成一系列离散的点。然后对这些点的电压进行保持,这样就形成了一个阶梯状的信号。在电压保持的期间,我们完成量化和编码,将电压对应的数字量转换出来,并送给单片机进行进一步处理。CC2530的ADC模块支持最高14位二进制的模拟数字转换,具有12位的有效数据位(ENOB);12位分辨率能将0-3.3V电压分为212=4096级(最小精度达3.3/4096≈0.8mV);一个模拟多路转换器,可选择多达8个独立的可配置通道,如AIN0至AIN7,可复用P0口引脚;内置参考电压发生器。CC2530的ADC模块主要特征(1)可选取的抽取率,设置分辨率(7位~12位)(2)8路12位的独立外部模拟电压输入通道,可接收单端或差分信号(3)参考电压为内部单端、外部单端、外部差分或AVDD5(4)单通道转换结束可产生中断请求(5)序列转换结束可发出DMA触发(6)可将片内温度传感器作为输入(7)电池电压测量功能CC2530的ADC关键概念序列ADC转换不需要CPU参与DMA传送到存储器多通道的ADC转换单通道ADC转换单通道ADC转换ADCCON3寄存器参考电压内部生成的电压AVDD5引脚适用于AIN7输入引脚的外部电压一旦寄存器被写入转换立即开始适用AIN6~AIN7输入引脚的差分电压CC2530的ADC关键概念转换结果差分配置可是负数单端结果总是正的以2的补码形式表示当ADCCON1.EOC设置为1时数字转换结果可以获得结果总是驻留在ADCH和ADCL寄存器组合的MSB段中中断请求触发一个单通道转换完成时
将产生一个中断完成一个序列转换时
是不产生中断的每完成一个序列转换ADC将产生一个DMA触发CC2530的ADC使用步骤ADC使用步骤打开IAREmbedd打开IAREmbeddedWorkbenchfor8051的开发环境,新建一个项目,首先,点击“File”菜单,选择“New”,再点击“Workspace”,创建一个新的工作区。然后,点击“Project”菜单,选择“CreateNewProject”。在弹出的对话框中,我们选择“8051”项目类型,这是因为CC2530基于8051内核。接着,设置项目名称,比如“LED_Flash”,并选择合适的保存路径,点击“保存”,这样一个新的项目就创建好了(注意同步保存工作区)。edWorkbenchfor8051的开发环境,新建一个项目,首先,点击“File”菜单,选择“New”,再点击“Workspace”,创建一个新的工作区。然后,点击“Project”菜单,选择“CreateNewProject”。在弹出的对话框中,我们选择“8051”项目类型,这是因为CC2530基于8051内核。接着,设置项目名称,比如“LED_Flash”,并选择合适的保存路径,点击“保存”,这样一个新的项目就创建好了(注意同步保存工作区)。首先,配置I/O口外设输入,启动模拟I/O使能,完成ADC初始化。其次,配置ADC控制寄存器ADCCON3,选择参考电压、采样通道、采样抽取率等参数,然后启动A-D转换。最后,等待ADC转换完成标志位ADCCON1.EOC置1,读取转换结果寄存器ADCH和ADCL,得到数字信号结果:
注意,在实际应用中,要根据项目需求选择合适的采样通道和分辨率,以满足不同的传感器数据采集要求。应用实例CC2530的A-D转换功能通过连接温度传感器,CC2530可定期采集温度模拟信号,经A-D转换后得到数字温度值,再通过无线网络上传至服务器或通过PC机的串口助手显示A-D转换结果,实现温度监测功能。单片机技术与应用总结
A-D转换的基本原理、转换过程及其在
CC2530
中的实现模拟信号到数字信号的转换,是电子技术的重要环节实现CC2530片内温度展示任务分析单片机技术与应用CC2530内部集成了多种功能模块传感器是信息收集的关键部件其中就包括一个片内温度传感器通过这个温度传感器可以方便地实现对温度的实时监测具有重要使用价值片内温度展示基础知识任务的重点:如何利用ADC模块将温度传感器采集到的模拟信号转换为数字信号并进行相应处理,实时准确地反映环境温度的变化。片内温度传感器实现对温度的
采集则点亮D5灯以示警告温度值≥25℃片内温度展示基础知识ADC模块结构温度传感器CC2530内置温度传感器也是其中一个转换通道一种能够将温度变化转换为模拟电信号的器件ADC具有多个转换通道可以同时读取多个模拟信号片内温度展示基础知识ADC控制寄存器3:用于参考电压、抽取率、通道选择设置。任务所需关键寄存器ADC控制寄存器1:用于启动模式选择(手动/自动触发)、启动转换、转换状态检测。ADC数据高位寄存器与ADC数据低位寄存器:两者分别存储转换结果高8位与低6位。测试寄存器0:连接温度传感器到ADC模块。模拟测试控制寄存器:用于使能温度传感器。任务目标通过完成任务了解数字信号处理的基本概念掌握CC2530ADC模块工作的具体配置和使用理解模拟信号与数字信号的转换过程培养硬件与软件协同工作能力提升嵌入式系统开发的综合能力通过编程掌握信号阈值与LED灯控关系为后续复杂项目奠定基础硬件连接电路分析根据本任务所使用CC2530开发板的电路图,需要认知本任务的电路情况如图所示可以配置为输出控制D5的亮灭P1_3是通用I/O引脚
连接
D5灯硬件连接电路分析CC2530的ADC模块,如图所示,片内温度传感器也是其中一路输入通道任务实现原理分析GPIO引脚初始化配置通过设置P1SEL、P1DIR寄存器将P1_3配置为通用I/O的输出口,用于控制D5灯,并先设置D5灯熄灭。ADC初始化设置根据任务要求,ADC需要进行对应初始化通过相关寄存器(TR0、ATEST、ADCCON3、ADCCON1)的配置,设置ADC的片内温度传感器工作模式,确保其能够正常采集片内温度。任务实现原理分析采样温度处理开启ADC转换后,等待ADC转化完成后读取寄存器ADCL和ADCH内的值,完成数据处理后,再根据计算公式,计算出实际的温度值。温度值展示判断采集到的温度值如果高于指定阈值,就点亮D5灯以示警告,否则就熄灭D5灯。单片机技术与应用可实现对温度的实时采集和展示了解物联网数据采集的核心技术这不仅为我们开发项目奠定基础为物联网技术的发展贡献力量实现CC2530片内温度展示程序设计分析单片机技术与应用温度值的展示温度数据的读取处理ADC模块初始化如何通过片内温度传感器和I/O端口实现温度数据的采集与展示初始化ADC模块程序设计总流程初始化I/O端口将片上温度传感器的输出作为ADC的输入
启动AD转化读取ADC转化数据判断展示D5灯的亮灭温度值延时
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年化工评估分销代理协议
- 2026年AI合作运维服务合同
- 村小学办公室工作制度
- 村慈善工作站工作制度
- 预防接种护士工作制度
- 领导班子一线工作制度
- 风险监控预警工作制度
- 黔南州博物馆工作制度
- 淮南市凤台县2025-2026学年第二学期四年级语文第七单元测试卷(部编版含答案)
- 九江市庐山区2025-2026学年第二学期三年级语文期末考试卷(部编版含答案)
- 急危重症患者的病情评估和护理
- 2026中国牛肉干行业销售动态及消费趋势预测报告
- 技师承诺不涉黄协议书
- 人才公寓物业服务方案
- (2025年)粮油保管员中级试题及答案
- 2025广东深圳市公安局第十三批招聘警务辅助人员2356人考试笔试备考题库及答案解析
- 《建设强大国内市场 加快构建新发展格局》课件
- 浅谈供电企业的人力资源管理
- 地黄课件教学课件
- 2025年河北中烟工业有限责任公司招聘考试笔试试卷附答案
- 2024人教版七年级地理下学期期末质量检测试卷(含答案)
评论
0/150
提交评论