用c语言实现:将片内RAM 50H起始单元的16个数由串行口发送。
时间: 2024-04-29 16:26:20 浏览: 190
好的,这个问题很简单。以下是使用C语言将片内RAM 50H起始单元的16个数由串行口发送的代码:
```c
#include <reg52.h>
void main() {
unsigned char i;
unsigned char *p = 0x50; // RAM 50H起始单元地址
TMOD = 0x20; // 设置定时器1为方式2,8位自动重载
TH1 = 0xFD; // 波特率9600
SCON = 0x50; // 使能串口
TR1 = 1; // 启动定时器1
for (i = 0; i < 16; i++) {
SBUF = *p; // 发送数据
while (!TI); // 等待发送完毕
TI = 0; // 清除发送标志
p++; // 指向下一个地址
}
}
```
这段代码使用了8051系列微处理器的寄存器,以实现将RAM 50H起始单元的16个数通过串口发送出去的功能。
相关问题
用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起始单元是一个外部扩展存储器的地址,通过变量指针的方式存取。
程序最后进入死循环,等待结束。
接收程序:串行输入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语言
#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 ;继续接收数据
阅读全文