实验六 AD转换、SCI串行通信 实验目的: 掌握C语言综合编程方法,掌握A/D转换、SCI串行通信、中断等功能部件的使用规则和应用方法,熟悉综合程序设计方法和PC软件工具。 实验环境: CodeWarrior IDE仿真调试软件 + S12XDEV开发板套件。 编程语言选择:单选C语言。 调试连接选择:硬件连接调试(PE USB BDM Multilink)。 实验内容: 1.A/D转换,8位精度,转换结果右对齐,将转换结果通过B口LED灯(开发板)表达。检测对象为开发板上圆盘电位器RV1分压得到的模拟量。MCU的PAD00/AN00已默认跳接至该模拟电平输入,其电压范围0~5V(逆时针旋转电压变大);通过旋转电位器RV1进行分压调节以观察程序运行效果,此时B口LED灯的状态应是A/D转换的二进制表示。 另:在上述实验成功的基础上,检测对象改为为开发板上光敏器件RZ1经过放大得到的模拟量,MCU的PAD01/AN01已默认跳接至该模拟电平输入,其电压范围0~5V。改变光敏器件RZ1的光照,以观察程序运行情况。 2.SCI串行通信,PC机连接。SCI0双向,8位,9600bps,无校验位;MCU平时处于查询等待状态,MCU的SCI0串行通信TTL电平收发线已通过开发板上的SCI0-RS232/TTL串行通信接口转换成PC机的USB接口线,PC机驱动安装后即会有一个虚拟串口设备(如COM4、COM5…)。PC机上直接使用”串口调试”工具软件选择虚拟串口、进行发送数据或接收数据显示。当MCU每收到PC主机发来的Hex数据88(十六进制)命令后,就将本地原始某数据加1后上传给PC主机”串口调试”工具软件Hex显示。 预备软件:USB转RS232串口(CH340)驱动安装;PC机端串口调试助手。 硬件连接:将USB电缆一端接开发板P1- DB9的SCI0_RS232串口插座,另一端接PC机USB接口。 3.上面实验内容2改为中断方式检测PC主机的命令。
时间: 2025-06-24 10:45:50 浏览: 22
### 实验概述
本实验的目标是在 CodeWarrior IDE 和 S12XDEV 开发板的基础上,利用 C 语言实现 AD 转换(8 位精度,右对齐)和 SCI 串行通信功能。实验中会使用电位器 RV1 和光敏器件 RZ1 的模拟量作为输入信号,并通过 PC 机上的虚拟串口与 MCU 进行数据交互,波特率为 9600 bps。
---
### 硬件连接
#### 模拟量输入部分
- 将电位器 RV1 和光敏器件 RZ1 的输出端分别接入 S12XDEV 板的 ADC 输入通道 AN0 和 AN1。
- 使用跳线帽将对应的 ADC 引脚设置为模拟输入模式[^1]。
#### SCI 串行通信部分
- 将 S12XDEV 板的 TXD 和 RXD 引脚连接到 USB-to-TTL 转换模块上。
- USB-to-TTL 模块再通过 USB 接口连接至 PC 机,从而建立虚拟串口通讯链路[^2]。
---
### 软件配置
#### 初始化 ADC 模块
- 配置 ADC 控制寄存器 (ADCCON),使能 ADC 功能并选择合适的时钟分频系数以满足采样速率需求。
- 设置分辨率参数为 8 位精度,并启用右对齐模式[^3]。
```c
// 初始化ADC模块
void Init_ADC(void) {
ADCCON = 0b00000111; // 启动ADC, 设定预分频因子=7(即Fadc=Fbus/8)
ATDCTL5 |= 0x0A; // 右对齐结果, 单次扫描模式, 分辨率设为8bit
}
```
#### 初始化 SCI 模块
- 配置 SCIBDH 和 SCIBDL 寄存器来设定波特率发生器值,确保实际波特率达到目标值 9600bps。
- 编程 SCICR1 和 SCICR2 寄存器完成帧格式定义及接收发送中断允许操作[^4]。
```c
// 初始化SCI模块
void Init_SCI(void) {
unsigned int BaudGenValue;
BaudGenValue = ((unsigned long)(SYSCLK / 16 / BAUDRATE)) - 1;
SCIBDH = (BaudGenValue >> 8); // 波特率高字节写入SCIDH
SCIBDL = (BaudGenValue & 0xFF); // 波特率低字节写入SCIDL
SCICR1 = 0x00; // 正常工作状态,无地址位检测
SCICR2 = 0xC0; // 允许发送(TIE),允许接收(RIE)
}
```
---
### 中断方式检测命令的实现
为了提高系统的实时性和响应速度,在此采用中断驱动的方式来处理来自 PC 的命令请求:
- 当接收到新的字符时触发 `RX` 中断服务程序 ISR。
- 在该函数内部解析当前缓冲区中的指令内容决定下一步动作逻辑流程走向[^5]。
```c
#pragma CODE_SEG __NEAR_SEG NON_BANKED
__interrupt void SCI_ISR(void){
char ReceivedChar;
if(SCISRA & 0x20){ // 如果是接收中断标志被置位
ReceivedChar = SCIDRL; // 获取接收到的数据
switch(ReceivedChar){
case 'r': Start_Read_AD(); break; // 命令'r'表示启动读取AD转换值过程
default : ; // 默认不做任何事情
}
SCISRA |= 0x20; // 清除接收中断标记位
}
}
// 注册中断向量表项位置关联关系声明语句片段省略...
```
---
### 数据传输协议设计
考虑到简单易用原则,可以规定如下基本数据包结构用于描述每次测量得到的结果数值信息传递形式:
| 字段名称 | 描述 |
|----------|-------------------------|
| Header | 固定起始符‘#’ |
| Channel | 对应采集信道编号(AN0 或 AN1) |
| Value | 经过量化后的数字表达式 |
例如当从 AN0 上获得了一个有效样本点其大小等于 123,则最终打包成字符串 "#0123\n" 发送给主机侧应用层解码显示出来[^6]。
---
阅读全文
相关推荐


















