基于51单片机的进制转换器
时间: 2023-12-12 22:03:28 浏览: 42
基于51单片机的进制转换器可以实现十进制带负数、带小数点的加减乘除,同一进制之间的加减乘,以及不同进制之间的转换。具体实现思路如下:
1. 按键输入数字和运算符,LCD屏幕显示输入的数字和运算符。
2. 当输入完毕后,按下“=”键,单片机开始计算。
3. 对于同一进制之间的加减乘,直接进行运算即可。
4. 对于十进制带负数、带小数点的加减乘除,可以将其转化为整数进行运算,最后再转化为带小数点的结果输出。
5. 对于不同进制之间的转换,可以先将输入的数转化为十进制,再将十进制转化为目标进制输出。
以下是一个基于51单片机的进制转换器的代码示例:
```c
#include <reg51.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LCD_DB P0
sbit RS = P2^6;
sbit RW = P2^5;
sbit EN = P2^7;
void delay(unsigned int i)
{
while(i--);
}
void write_com(unsigned char com)
{
RS = 0;
RW = 0;
LCD_DB = com;
EN = 1;
delay(10);
EN = 0;
}
void write_data(unsigned char dat)
{
RS = 1;
RW = 0;
LCD_DB = dat;
EN = 1;
delay(10);
EN = 0;
}
void init_lcd()
{
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void display(unsigned char *s)
{
while(*s)
{
write_data(*s++);
}
}
void clear_lcd()
{
write_com(0x01);
}
void main()
{
unsigned char num[16] = {0};
unsigned char op = 0;
unsigned char result[16] = {0};
unsigned char buf[16] = {0};
unsigned char i = 0;
unsigned char j = 0;
unsigned char k = 0;
unsigned char len = 0;
unsigned char flag = 0;
unsigned char base = 10;
float fnum = 0;
float fresult = 0;
float fbuf = 0;
init_lcd();
display("Input:");
while(1)
{
if(P3 != 0xff)
{
delay(1000);
if(P3 != 0xff)
{
if(P3 == 0xfe) // 数字0
{
num[i++] = '0';
display("0");
}
else if(P3 == 0xfd) // 数字1
{
num[i++] = '1';
display("1");
}
else if(P3 == 0xfb) // 数字2
{
num[i++] = '2';
display("2");
}
else if(P3 == 0xf7) // 数字3
{
num[i++] = '3';
display("3");
}
else if(P3 == 0xef) // 数字4
{
num[i++] = '4';
display("4");
}
else if(P3 == 0xdf) // 数字5
{
num[i++] = '5';
display("5");
}
else if(P3 == 0xbf) // 数字6
{
num[i++] = '6';
display("6");
}
else if(P3 == 0x7f) // 数字7
{
num[i++] = '7';
display("7");
}
else if(P3 == 0xfe) // 数字8
{
num[i++] = '8';
display("8");
}
else if(P3 == 0xfd) // 数字9
{
num[i++] = '9';
display("9");
}
else if(P3 == 0xfb) // 小数点
{
num[i++] = '.';
display(".");
}
else if(P3 == 0xf7) // 加号
{
op = '+';
display("+");
}
else if(P3 == 0xef) // 减号
{
op = '-';
display("-");
}
else if(P3 == 0xdf) // 乘号
{
op = '*';
display("*");
}
else if(P3 == 0xbf) // 除号
{
op = '/';
display("/");
}
else if(P3 == 0x7f) // 等号
{
flag = 1;
display("=");
}
}
}
if(flag)
{
flag = 0;
len = strlen(num);
for(j = 0; j < len; j++)
{
if(num[j] == '.')
{
fnum = atof(num);
break;
}
}
if(j == len)
{
fnum = atoi(num);
}
if(op == '+')
{
fresult += fnum;
}
else if(op == '-')
{
fresult -= fnum;
}
else if(op == '*')
{
fresult *= fnum;
}
else if(op == '/')
{
fresult /= fnum;
}
if(base == 10)
{
sprintf(buf, "%.2f", fresult);
display(buf);
}
else if(base == 2)
{
itoa((int)fresult, buf, 2);
display(buf);
}
else if(base == 8)
{
itoa((int)fresult, buf, 8);
display(buf);
}
else if(base == 16)
{
itoa((int)fresult, buf, 16);
display(buf);
}
memset(num, 0, sizeof(num));
i = 0;
op = 0;
memset(result, 0, sizeof(result));
memset(buf, 0, sizeof(buf));
fnum = 0;
fresult = 0;
fbuf = 0;
}
}
}
--相关问题--: