写一段51单片机计算器通过串口输入的C语言代码
时间: 2023-08-15 19:06:45 浏览: 105
以下是一个简单的51单片机计算器通过串口输入的C语言代码,可以通过串口接收输入的计算表达式,并将计算结果通过串口发送回电脑:
```c
#include <reg51.h>
#include <stdio.h>
#define BAUD_RATE 9600 // 串口波特率
#define FOSC 11059200L // 单片机振荡频率
#define TIMER_1MS (65536 - FOSC/12/1000) // 1ms定时器计数值
sbit LED = P1^0; // 控制LED灯
char buffer[20]; // 保存输入的字符
unsigned char index = 0; // 字符串索引
void initUART()
{
SCON = 0x50; // 8位数据, 无校验位, 1位停止位
TMOD &= 0x0F;
TMOD |= 0x20; // 设置定时器1为模式2
TH1 = TL1 = TIMER_1MS; // 设置波特率
TR1 = 1; // 启动定时器1
ES = 1; // 允许串口中断
EA = 1; // 开启总中断
}
void sendByte(unsigned char dat)
{
SBUF = dat; // 发送数据
while(!TI); // 等待发送完成
TI = 0; // 清除发送标志位
}
void calculate()
{
float result = 0;
char operator = '+';
char *ptr = buffer;
while(*ptr)
{
if(*ptr >= '0' && *ptr <= '9')
{
if(operator == '+')
{
result += (*ptr - '0');
}
else if(operator == '-')
{
result -= (*ptr - '0');
}
else if(operator == '*')
{
result *= (*ptr - '0');
}
else if(operator == '/')
{
result /= (*ptr - '0');
}
}
else if(*ptr == '+')
{
operator = '+';
}
else if(*ptr == '-')
{
operator = '-';
}
else if(*ptr == '*')
{
operator = '*';
}
else if(*ptr == '/')
{
operator = '/';
}
ptr++;
}
sprintf(buffer, "%.2f", result);
}
void main()
{
initUART(); // 初始化串口
while(1)
{
LED = ~LED; // 控制LED灯翻转
if(index > 0 && buffer[index - 1] == '\r')
{
calculate(); // 计算表达式
sendByte('\n'); // 发送回车换行符
for(unsigned char i = 0; i < index; i++)
{
sendByte(buffer[i]); // 发送原始表达式
}
sendByte(' '); // 发送空格
for(unsigned char i = 0; buffer[i]; i++)
{
sendByte(buffer[i]); // 发送计算结果
}
sendByte('\n'); // 发送回车换行符
index = 0; // 复位字符串索引
buffer[0] = '\0'; // 清空缓存
}
}
}
void UART_ISR() interrupt 4
{
if(RI)
{
RI = 0; // 清除接收标志位
buffer[index] = SBUF; // 保存输入字符
index++;
}
if(TI)
{
TI = 0; // 清除发送标志位
}
}
```
在上述代码中,我们通过串口接收输入的计算表达式,然后通过计算函数将其计算结果保存到缓存区,并发送回电脑。同时,我们还为串口中断函数设置了中断服务程序,以处理串口数据的接收和发送。
阅读全文