版主和各位大虾来帮我解决下:
我想实现的功能是:再PC机端输入任意一个数n(0-99之间),然后通过串口往下传,当单片机接收到这个N以后,做运算m=n*2,并把m再通过串口上传至PC机端。(本来想的很简单直接*2,不过PC端到单片机端的数据存在着“字符”ASCII码和数值之间的转换,使得问题变的有点麻烦...)望版主和各位大侠赐教!(程序是基于KEILC写的、硬件是基于C51单片机的、串口调试的PC端是用串口调试助手的,所以数值每次只能一个一个上下串...)
程序附上,问题应该不少,望斑竹或大虾帮帮忙,谢谢!
#include <REG52.H> #include <stdio.h> #include <string.h>
unsigned char flag=0; /*主程序*/ void main (void) {
SCON = 0x50; /* SCON: 模式 1, 8-bit UART, 使能接收 */ TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */ TH1 = 0xFD; /* TH1: reload value for 9600 baud @ 11.0592MHz */ TR1 = 1; /* TR1: timer 1 run */ EA = 1; /*打开总中断*/ ES = 1; /*打开串口中断*/
while (1) /*主循环不做任何动作*/ { } }
void timer0_int(void) interrupt 1 //定时器定时5ms { TH0=0xee; TL0=0x00; while(TF0!=1); {flag=1; //设置标志位,当标志位为1时表示数据已经接收完毕,否者标志位为初始值0 TF0=0;} }
void UART_SER (void) interrupt 4 //串行中断服务程序 { unsigned char a,b; //定义临时变量 //unsigned char Temp; int i; unsigned char SendTemp[3]=""; unsigned char SendNumb;
if(RI) //判断是接收中断产生 { RI=0; //标志位清零
timer0_int(); //这里出错了,错误提示不能调用一个中断功能
if(flag==1) //当标志位==1时,表示数据接收完毕 { SendTemp[0]=SBUF; //此时把SBUF内的值放入SendTemp[0] SendNumb=1;} else //当标志位==0时,表示数据没有接收完 {SendTemp[SendNumb]=SBUF;//此时把SBUF内的值放入SendTemp[1] SendNumb++;}
a=(SendTemp[0]-48)+(SendTemp[1]-48)*10; //把2个数进行ASCII码到数值的转换,并组成由PC输入的实际的数值,赋予a b=a*2; //令b=2倍a SendTemp[0]=a%10+48; //拆解数值b,并转喊道ASCII码形式,准备上传至PC端 SendTemp[1]=a/10+48; for(i=0;i<3;i++) { SBUF=SendTemp; if(TI) //如果是发送标志位,清零 TI=0; } }
|