4字节16进制转成10进制数 c语言,51单片机把4位16进制数转成10进制数的方法

2位16进制转10进制,用除以10求商跟余数的方法,即可。

4位16进制数呢?DIV指令只可以对2位16进制数进行除法运算啊,那么下面就为大家来解答。

例如把TH1 TL1的数值转成十进制, 分别存入R4 R3 R2 R1 R0。

;------------------------------------------------------------------

下面把这段转换程序,写成子程序的结构,便于网友移植。

;

程序经过仿真调试通过,如下所示:

;------------------------------------------------------------------

;

MOV R0, TH1

MOV R1, TL1

CALL HEX2BCD ;调用子程序把R0 R1中的数字,转换成BCD码,送到R2 R3 R4

;-------下面,把万千百十个位,分别存入R4 R3 R2 R1 R0

MOV A, R4

MOV B, #16

DIV AB ;除以16,目的是分离出高、低四位

MOV R1, A ;存放十位

MOV R0, B ;存放个位

;

MOV A, R2

MOV R4, A ;存放万位

;

MOV A, R3

MOV B, #16

DIV AB

MOV R3, A

MOV R2, B

SJMP $ ;到此,完成了题目要求

;------------------------------------------------------------------

;两个字节的二进制数转换成BCD码的程序如下:

;功能:16位二进制数变换成为 BCD 码;

;入口:R0 R1 中是 16 位二进制数,其中R0中是高 8 位;

;出口:R2 R3 R4 中是 BCD 码,其中R2中是万位,R3中是千、百位,R4中是十、个位。

HEX2BCD:

CLR A

MOV R2, A ;先清零

MOV R3, A

MOV R4, A

MOV R5, #16 ;共转换十六位数

LOOP:

CLR C

MOV A, R1 ;从待转换数的高端移出一位到Cy

RLC A

MOV R1, A

MOV A, R0

RLC A

MOV R0, A

MOV A, R4 ;送到BCD码的低端

ADDC A, R4 ;带进位加。自身相加,相当于左移一位

DA A ;十进制调整,变成BCD码

MOV R4, A

MOV A, R3

ADDC A, R3

DA A

MOV R3, A

MOV A, R2

ADDC A, R2

MOV R2, A

DJNZ R5, LOOP ;共转换十六位数

RET

;------------------------------------------------------------------

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用C语言编写的示例代码,将字字符串换为十六进制,并通过C51单片机的串口将结果发送出去: ```c #include <reg51.h> void UART_Init() { TMOD = 0x20; // 设置定时器1为模式2 TH1 = 0xFD; // 设置波特率为9600 SCON = 0x50; // 设置串口为模式1,允许接收 TR1 = 1; // 启动定时器1 } void UART_SendByte(unsigned char byte) { SBUF = byte; while (!TI); // 等待发送完成 TI = 0; // 清除发送完成标志 } void UART_SendString(char* str) { while (*str) { UART_SendByte(*str); str++; } } void decToHex(char* numStr, char* hexStr) { int decimal = atoi(numStr); sprintf(hexStr, "%X", decimal); } int main() { char numStr[10]; char hexStr[10]; UART_Init(); while (1) { // 接收字字符串 unsigned char i = 0; while (1) { while (!RI); // 等待接收据 numStr[i] = SBUF; UART_SendByte(numStr[i]); // 将接收到的字符回传 if (numStr[i] == '\r') { // 检测到回车符,结束接收 numStr[i] = '\0'; // 在字符串末尾添加结束符 break; } i++; } // 将字字符串换为十六进制字符串 decToHex(numStr, hexStr); // 发送十六进制字符串 UART_SendString(hexStr); } } ``` 在这个示例中,我们首先定义了 `UART_Init` 函,用于初始化C51单片机的串口。然后,我们定义了 `UART_SendByte` 函和 `UART_SendString` 函,用于发送单个字节和字符串到串口。 接下来,我们定义了 `decToHex` 函,该函用于将字字符串换为十六进制字符串,逻辑与之前提供的示例相同。 在 `main` 函中,我们首先调用 `UART_Init` 进行串口初始化。然后,我们进入一个无限循环,在循环中接收字字符串,并将其换为十六进制字符串后发送出去。在接收字字符串时,我们使用 `RI` 标志来检测是否接收到据,并使用 `SBUF` 寄存器读取接收到的据。在发送据时,我们使用 `UART_SendByte` 函发送单个字节,以及 `UART_SendString` 函发送整个字符串。 请注意,此示例假设单片机的串口已正确配置,并且与外部设备连接正常。确保将C51单片机配置为正确的波特率和其他串口参,以确保与外部设备的通信正常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值