PC传送“数值”字符字符串到单片机,单片机如何转换“数值”

#include<reg51.h>#include<intrins.h>sbitMG=P3^3;//电机电相输入隔离芯片74LS374控制端unsignedcharser... #include <reg51.h>
#include <intrins.h>

sbit MG=P3^3; //电机电相输入隔离芯片74LS374控制端

unsigned char ser[16];
unsigned char Rmotor[]={0xfc,0xf9,0xf3,0xf6}; //步进电机顺时电相 接P0
unsigned char temp,k=0;
unsigned int run;

delay(unsigned int Time) //毫秒级延时函数
{
unsigned int i,j;
for(i=Time;i>0;i--)
for(j=120;j>0;j--);
}

serial_init() //9600bps串行通信协议
{
TMOD=0x20;
TH1=TL1=0xfd;
TR1=1;
SM0=0;
SM1=1;
REN=1;
ES=1;
EA=1;
}

motor_run(unsigned int Run) //步进电机角度顺时针转动函数
{
unsigned int x,y=0;
for(x=0;x<Run;x++)
{
P0=Rmotor[y];
_nop_();
MG=0;
_nop_();
MG=1;
if(x<48)
{delay(5);}
else delay(4);
if(y>3){y=0;}
}
}

run_build() //将从PC接收到的"数值"转换成单片机可处理的int并作为motor_run(unsigned int Run)的参量
{
/* 假如PC传送1234#,则ser[]={'1','2','3','4'},该如何将它转换为变量run=1234 */
/* PC传送的数据长度是不确定的,取值范围从1~4800之间的任意值 */
}

main() //主程序
{
serial_init();
while(1)
{
if(temp=='#')
{
temp=0;
ES=0;
run_build(); //求解出PC指定步进电机需要转动多小"步"
delay(5);
if(run>0)
{
motor_run(run); //执行电机转动
}
ES=1;
k=0;
}
}
}

serial() interrupt 4 //单片机接收PC指令字符串
{
if(RI)
{
RI=0;
temp=SBUF;
if(temp!='#')
{
ser[k]=temp;
k++;
}
}
}
展开
 我来答
休闲居大伟
2014-04-04 · TA获得超过5419个赞
知道大有可为答主
回答量:6865
采纳率:91%
帮助的人:1.1亿
展开全部
int TQ( char n)//将字符转换成数字
{
if(n>=0x30 && n<=0x39) //如果接收的字符在指定的范围内
{
switch(n) //根据不同字符的十六进制码,返回相应的十进制数
{
case 0x30 : { return 0; }
case 0x31 : { return 1; }
case 0x32 : { return 2; }
case 0x33 : { return 3; }
case 0x34 : { return 4; }
case 0x35 : { return 5; }
case 0x36 : { return 6; }
case 0x37 : { return 7; }
case 0x38 : { return 8; }
case 0x39 : { return 9; }
}
}
else{ return 0; } //否则返回数字 0
}

void HB()//数据合并
{
for(j=0;j<4;)
{
if(aa[i]==0x20){ break; } //如果遇到空格,则结束
bb[j]=TQ(aa[i]); //将字符数据转换成数值数据
j++;i++;
}
switch(j)
{
case 4 : { m=bb[0]*1000 + bb[1]*100 + bb[2]*10 + bb[3]*1 ; return m; }
case 3 : { m=bb[0]*100 + bb[1]*10 + bb[2]*1 ; return m; }
case 2 : { m=bb[0]*10 + bb[1]*1 ; return m; }
case 1 : { m=bb[0]*1; return m; }//根据数据的有效位数来计算步数

default : { m=0; return m; }
}

我这是以空格作为结束符号的,你可以改成你自己使用的

如果有不懂或不知道如何使用,可以看我的资料有联络方式
做而论道
高能答主

2014-04-04 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.2亿
展开全部
/* 假如PC传送1234#,则ser[]={'1','2','3','4'},该如何将它转换为变量run=1234 */
/* PC传送的数据长度是不确定的,取值范围从1~4800之间的任意值 */
----
如下即可:

serial() interrupt 4 //单片机接收PC指令字符串
{
if(RI) {
RI = 0;
ser[k] = SBUF;
if(ser[k] == '#') {
run = 0;
for (i = 0; i < k; i++) run = run * 10 + (ser[i] - 48); //run 就是1234
k = 0;
}
else k++;
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
创客万花筒
2014-04-04 · 超过13用户采纳过TA的回答
知道答主
回答量:42
采纳率:0%
帮助的人:33.3万
展开全部
字符比十进制多48,‘0’+48=十进制了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式