接收程序:串行输入16个字符,存入片内RAM的50H起始单元,串行口波特率为2400(设晶振为11.0592MHz)。 RECS: MOV SCON,#50H ;串行口模式1允许接收 MOV TMOD,#20H ;T1模式2定时 MOV TL1,#0F4H ;写入T1时间常数 MOV TH1,#0F4H SETB TR1 ;启动T1 MOV R0,#50H ;设数据指针 MOV R7,#10H ;接收数据长度 WAIT: JBC RI,NEXT ;等待串行口接收 SJMP WAIT NEXT: MOV A,SBUF ;读取接收字符 MOV @R0,A ;保存一个字符 INC R0 ;修改指针 DJNZ R7,WAIT ;全部字符接收完? RET 将此汇编语言转换成C语言
时间: 2023-06-08 10:09:22 浏览: 343
#01H ;设置串行口为接收模式
MOV DPTR,#0050H ;设置数据指针DPTR指向RAM的50H起始单元
CLR RI ;清除接收中断标志位
SETB TI ;设置发送中断标志位
RECS_LOOP:
JNB RI,RECS_LOOP ;等待接收中断
CLR RI ;清除接收中断标志位
MOV A,SBUF ;将接收到的数据读取到累加器A中
MOVX @DPTR,A ;将累加器中的数据存储到RAM的指定地址中
INC DPTR ;指针自增1,指向下一个RAM单元
SJMP RECS_LOOP ;继续接收数据
相关问题
用c语言实现串行输入16个字符,存入片内RAM的50H起始单 元,串行口波特率为2400(设晶振为11.0592MHz)。(采用方式1)
可以使用以下代码实现:
```c
#include <reg51.h>
void main() {
unsigned char i;
TMOD = 0x20; // 定时器1作为8位自动重装载计数器,模式2
TH1 = 0xfd; // 波特率2400,晶振11.0592MHz
SCON = 0x50; // 串行口工作方式1,允许接收
TR1 = 1; // 启动定时器
for (i = 0; i < 16; i++) {
while (!RI); // 等待接收到数据
RI = 0; // 清除接收标志位
P0 = SBUF; // 将接收到的数据存入P0口
*(unsigned char xdata *) (0x50 + i) = P0; // 存入片内RAM中
while (!TI); // 等待发送完成
TI = 0; // 清除发送标志位
}
while (1); // 程序结束
}
```
串行口的工作方式1是指8位数据,无校验位,1位停止位。在本程序中,波特率的计算公式为:
波特率 = 晶振频率 / (32 * (256 - TH1))
因为定时器模式为模式2,所以定时器1的初值为256-TH1,计满后会自动重新从256-TH1开始计数。
程序将接收到的数据存入P0口,再将其存入片内RAM中。P0口是一个8位I/O端口,用于输入输出数据。片内RAM的50H起始单元是一个外部扩展存储器的地址,通过变量指针的方式存取。
程序最后进入死循环,等待结束。
用C语言编译一个发送程序:将片内RAM50H起始单元的16个数由串行口 发送。要求发送波特率为系统时钟的32分频,并进行奇偶校验。
您想问如何用C语言编译一个发送程序,将片内RAM50H起始单元的16个数通过串行口发送,要求发送波特率为系统时钟的32分频,并进行奇偶校验。是吗?
是的,您可以用C语言编译一个发送程序实现这个功能。以下是伪代码示例:
```c
void send_data() {
// 设置波特率
baudrate = sysclk / (32 * desired_baudrate) - 1;
set_baudrate(baudrate);
// 从RAM50H读取16个数
uint8_t data[16];
for (int i = 0; i < 16; i++) {
data[i] = RAM50H[i];
}
// 发送数据
for (int i = 0; i < 16; i++) {
// 对数据进行奇偶校验
uint8_t parity = 0;
for (int j = 0; j < 8; j++) {
parity ^= ((data[i] >> j) & 1);
}
data[i] |= (parity << 7);
// 发送数据
send_byte(data[i]);
}
}
```
这是一个基本的发送函数,它使用系统时钟的32分频来设置波特率,并对16个从RAM50H读取的数据进行奇偶校验,然后通过串行口发送数据。
请注意,这只是一个伪代码示例,具体实现取决于您在哪个平台上运行程序以及使用哪种串行口协议。
阅读全文