|
150黑幣
不知道程序那些地方有問題,不考慮算式優(yōu)先級,發(fā)送順式計(jì)算結(jié)果返回給串口,但是不知道為什么發(fā)送的是亂碼
單片機(jī)源程序如下:
#include<reg52.h>
#include<stdio.h>
unsigned char rec_data[32];
unsigned char op,flag, num[2],n=0;
unsigned int i,j,ansi=0,nm;
void delay_ms(int a)
{
int b,d;
for(b=a;b>0;b--)
for(d=0;d<114;d--);
}
void chuankou_chushihua()//串口初始化程序
{
TMOD|=0X20; //設(shè)置計(jì)數(shù)器1為工作方式 2
SCON=0X50; //設(shè)置串行口為工作方式 1
PCON=0X80; //波特率加倍
TH1=0XFA; //計(jì)數(shù)器初始值設(shè)置9600baud
TL1=0XFA;
ES=1; //打開接收中斷
EA=1; //打開總中斷
TR1=1; //打開計(jì)數(shù)器
}
void uart() interrupt 4 //串口通信中斷函數(shù)
{
RI = 0; //清除接收中斷標(biāo)志位
rec_data[nm]=SBUF; //存儲接收到的數(shù)據(jù)
nm++;
flag=1;//設(shè)立標(biāo)識位
}
void send_data( unsigned char jieguo)
{
SBUF=jieguo;
while(!TI);
TI=0;
}
void panduan_jisuan()
{
if('0'<=rec_data[0]&&rec_data[0]<='9')
{// 將第一個(gè)數(shù)字存入num[0]
num[0] = rec_data[0] - '0';
// 掃描整個(gè)字符數(shù)組,從第二個(gè)字符開始逐一處理
for (i = 1; i < nm; i++)
{
// 如果是運(yùn)算符,則將其存儲到op中,并將下一個(gè)數(shù)字存入num[1]
if (rec_data[ i] == '+' || rec_data[ i] == '-' || rec_data[ i] == '*' ||rec_data[ i] == '/')
{
op = rec_data[ i];
num[1] = rec_data[i + 1] - '0';
// 將指針移位至下一個(gè)數(shù)字
}
// 如果是等號,則運(yùn)算結(jié)果即為第一個(gè)數(shù)字
else if (rec_data[ i] == '=')
{
ansi = num[0];
}
// 如果是數(shù)字,則根據(jù)之前的運(yùn)算符進(jìn)行運(yùn)算
else if('0'<=rec_data[0]&&rec_data[0]<='9')
{
switch (op)
{
case '+':
num[0] = num[0] + (rec_data[ i] - '0');
break;
case '-':
num[0] = num[0] - (rec_data[ i] - '0');
break;
case '*':
num[0] = num[0] * (rec_data[ i] - '0');
break;
case '/':
num[0] = num[0] / (rec_data[ i] - '0');
break;
}
ansi=num[0];
}
}
}
}
void send_int_to_serial_port(int c)
{
char buffer[16];
// 使用 sprintf() 函數(shù)將整型變量轉(zhuǎn)換為字符串
sprintf(buffer, "%d", c);
// 將字符串逐個(gè)發(fā)送到串口
for (i = 0; buffer[ i] != '\0'; i++)
{
send_data(buffer[ i]);
}
}
void main()
{
chuankou_chushihua( );
while(1)
{
if(flag==1)
{
panduan_jisuan();
send_int_to_serial_port(ansi);
}
flag=0;
}
}
|
|