版主和各位大蝦來幫我解決下:
我想實現的功能是:再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;
}
}
歡迎光臨 (http://m.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |