版主和各位大蝦來(lái)幫我解決下:
我想實(shí)現(xiàn)的功能是:再PC機(jī)端輸入任意一個(gè)數(shù)n(0-99之間),然后通過(guò)串口往下傳,當(dāng)單片機(jī)接收到這個(gè)N以后,做運(yùn)算m=n*2,并把m再通過(guò)串口上傳至PC機(jī)端。(本來(lái)想的很簡(jiǎn)單直接*2,不過(guò)PC端到單片機(jī)端的數(shù)據(jù)存在著“字符”ASCII碼和數(shù)值之間的轉(zhuǎn)換,使得問(wèn)題變的有點(diǎn)麻煩...)望版主和各位大俠賜教!(程序是基于KEILC寫(xiě)的、硬件是基于C51單片機(jī)的、串口調(diào)試的PC端是用串口調(diào)試助手的,所以數(shù)值每次只能一個(gè)一個(gè)上下串...)
程序附上,問(wèn)題應(yīng)該不少,望斑竹或大蝦幫幫忙,謝謝!
#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; /*打開(kāi)總中斷*/ ES = 1; /*打開(kāi)串口中斷*/
while (1) /*主循環(huán)不做任何動(dòng)作*/ { } }
void timer0_int(void) interrupt 1 //定時(shí)器定時(shí)5ms { TH0=0xee; TL0=0x00; while(TF0!=1); {flag=1; //設(shè)置標(biāo)志位,當(dāng)標(biāo)志位為1時(shí)表示數(shù)據(jù)已經(jīng)接收完畢,否者標(biāo)志位為初始值0 TF0=0;} }
void UART_SER (void) interrupt 4 //串行中斷服務(wù)程序 { unsigned char a,b; //定義臨時(shí)變量 //unsigned char Temp; int i; unsigned char SendTemp[3]=""; unsigned char SendNumb;
if(RI) //判斷是接收中斷產(chǎn)生 { RI=0; //標(biāo)志位清零
timer0_int(); //這里出錯(cuò)了,錯(cuò)誤提示不能調(diào)用一個(gè)中斷功能
if(flag==1) //當(dāng)標(biāo)志位==1時(shí),表示數(shù)據(jù)接收完畢 { SendTemp[0]=SBUF; //此時(shí)把SBUF內(nèi)的值放入SendTemp[0] SendNumb=1;} else //當(dāng)標(biāo)志位==0時(shí),表示數(shù)據(jù)沒(méi)有接收完 {SendTemp[SendNumb]=SBUF;//此時(shí)把SBUF內(nèi)的值放入SendTemp[1] SendNumb++;}
a=(SendTemp[0]-48)+(SendTemp[1]-48)*10; //把2個(gè)數(shù)進(jìn)行ASCII碼到數(shù)值的轉(zhuǎn)換,并組成由PC輸入的實(shí)際的數(shù)值,賦予a b=a*2; //令b=2倍a SendTemp[0]=a%10+48; //拆解數(shù)值b,并轉(zhuǎn)喊道ASCII碼形式,準(zhǔn)備上傳至PC端 SendTemp[1]=a/10+48; for(i=0;i<3;i++) { SBUF=SendTemp; if(TI) //如果是發(fā)送標(biāo)志位,清零 TI=0; } }
|