先按按鍵 k1 就沒事 助手出現Hello what do you want to do?
怎么我 L1 后再按按鍵就不顯示 正常了 前面第一個Hello 的H就變成1了
發L2前面L就變2了 L3 L4 m1 m2 m3 m4 也一樣
是SBUF里的數據沒被清除嗎

付protuse
/************************************************************************
說明:本程序主要完成上位機發送字符給單片機控制外圍器件的任務
時間:2011.7.30
*************************************************************************/
//頭文件
#include <regx52.h>
//宏定義
#define uchar unsigned char
#define uint unsigned int
sbit k1 = P3 ^ 2; //按鍵1
sbit speaker = P1 ^ 4; // 蜂鳴器
uchar rev[]={""}; //接收到的字符
uchar ser_text[]="Hello, What do you want to do?";
//-----------------------------------------------------------------------
//函數聲明
void System_Init(); //初始化
void Key_Scan(); //按鍵掃描函數
void Delay_1ms(uint z); //延時1ms函數
void Delay_1us(uint time_us); //延時1us函數
void Serial_Txd(uchar *p); //串口發送函數
void beer();
//-----------------------------------------------------------------------
/************************************************************************
主函數
*************************************************************************/
void main()
{
System_Init();
while(1)
{
Key_Scan();
}
}
/***********************************************************************************
延時1ms函數
***********************************************************************************/
void Delay_1ms(uint z)
{
uint x,y;
for(x = z;x > 0;x--)
for(y = 110;y >0;y--);
}
/***********************************************************************************
延時1us函數
***********************************************************************************/
void Delay_1us(uint time_us)
{
while(--time_us);
}
/************************************************************************
初始化函數
*************************************************************************/
void System_Init()
{
SCON = 0X50;
PCON = 0X00;
TMOD = 0X20;
TH1 = 0XFD;
TL1 = 0XFD;
EA = 1;
ES = 1;
TR1 = 1;
}
/************************************************************************
串口中斷函數
*************************************************************************/
void Serial_Rxd() interrupt 4
{
ES=0;
if(RI)
{
rev[0] = SBUF;
RI = 0;
if(rev[0] == 'm') //如果第一個字符是m
{
while(!RI);
rev[1] = SBUF;
RI = 0;
switch(rev[1]) //判斷第二個字符
{
case '1':P2 = 0; P0 = 0xff; break; //是1 第一個數碼管亮
case '2':P2 = 1; P0 = 0xff; break; //是2 第二個數碼管亮
case '3':P2 = 2; P0 = 0xff; break; //是3 第三個數碼管亮
case '4':P2 = 3; P0 = 0xff; break; //是4 第四個數碼管亮
}
}
if(rev[0] == 'L') //如果第一個字符是m
{
while(!RI);
rev[1] = SBUF;
RI = 0;
switch(rev[1]) //判斷第二個字符
{
case '1':P1 = 0XFE; break; //是1 第一個LED亮
case '2':P1 = 0XFD; break; //是2 第二個LED亮
case '3':P1 = 0XFB; break; //是3 第三個LED亮
case '4':P1 = 0XF7; break; //是4 第四個LED亮
}
}
if(rev[0] == 'b') //判斷第一個字符是不是b
{
while(!RI);
rev[1] = SBUF;
RI = 0;
if(rev[1] == 'e') //判斷第二個字符是不是e
{
while(!RI);
rev[2] = SBUF;
RI = 0;
if(rev[2] == 'e') //判斷第三個字符是不是e
{
while(!RI);
rev[3] = SBUF;
RI = 0;
if(rev[3] == 'r') //判斷第四個字符是不是r
{
beer(); //全部是蜂鳴器響
}
}
}
}
}
ES=1;
}
/***********************************************************************************
按鍵掃描函數
***********************************************************************************/
void Key_Scan()
{
if(k1 == 0) //如果按鍵1被按下
{
Delay_1ms(21); //延時20ms
if(k1 == 0) //按鍵1確實被按下
{
Serial_Txd(ser_text); //串口發送函數
while(!k1) //松手檢測
Delay_1ms(21);
while(!k1);
}
}
}
/************************************************************************
串口發送函數
*************************************************************************/
void Serial_Txd(uchar *p)
{
uint i;
Delay_1ms(1);
for(i = 0;i < 30;i++)
{
SBUF = *p++;
while(!TI);
TI = 0;
}
}
/************************************************************************
蜂鳴器函數
*************************************************************************/
void beer()
{
uint i;
for(i = 0;i < 1600;i++) //大概時間是1s
{
speaker = !speaker;
Delay_1us(70); //控制發聲頻率
}
}
/************************************************************************
說明:本程序主要完成上位機發送字符給單片機控制外圍器件的任務
時間:2011.7.30
*************************************************************************/
//頭文件
#include <regx52.h>
//宏定義
#define uchar unsigned char
#define uint unsigned int
sbit k1 = P3 ^ 2; //按鍵1
sbit speaker = P1 ^ 4; // 蜂鳴器
uchar rev[]={""}; //接收到的字符
uchar ser_text[]="Hello, What do you want to do?";
//-----------------------------------------------------------------------
//函數聲明
void System_Init(); //初始化
void Key_Scan(); //按鍵掃描函數
void Delay_1ms(uint z); //延時1ms函數
void Delay_1us(uint time_us); //延時1us函數
void Serial_Txd(uchar *p); //串口發送函數
void beer();
//-----------------------------------------------------------------------
/************************************************************************
主函數
*************************************************************************/
void main()
{
System_Init();
while(1)
{
Key_Scan();
}
}
/***********************************************************************************
延時1ms函數
***********************************************************************************/
void Delay_1ms(uint z)
{
uint x,y;
for(x = z;x > 0;x--)
for(y = 110;y >0;y--);
}
/***********************************************************************************
延時1us函數
***********************************************************************************/
void Delay_1us(uint time_us)
{
while(--time_us);
}
/************************************************************************
初始化函數
*************************************************************************/
void System_Init()
{
SCON = 0X50;
PCON = 0X00;
TMOD = 0X20;
TH1 = 0XFD;
TL1 = 0XFD;
EA = 1;
ES = 1;
TR1 = 1;
}
/************************************************************************
串口中斷函數
*************************************************************************/
void Serial_Rxd() interrupt 4
{
ES=0;
if(RI)
{
rev[0] = SBUF;
RI = 0;
if(rev[0] == 'm') //如果第一個字符是m
{
while(!RI);
rev[1] = SBUF;
RI = 0;
switch(rev[1]) //判斷第二個字符
{
case '1':P2 = 0; P0 = 0xff; break; //是1 第一個數碼管亮
case '2':P2 = 1; P0 = 0xff; break; //是2 第二個數碼管亮
case '3':P2 = 2; P0 = 0xff; break; //是3 第三個數碼管亮
case '4':P2 = 3; P0 = 0xff; break; //是4 第四個數碼管亮
}
}else if(rev[0] == 'L') //如果第一個字符是L
{
while(!RI);
rev[1] = SBUF;
RI = 0;
switch(rev[1]) //判斷第二個字符
{
case '1':P1 = 0XFE; break; //是1 第一個LED亮
case '2':P1 = 0XFD; break; //是2 第二個LED亮
case '3':P1 = 0XFB; break; //是3 第三個LED亮
case '4':P1 = 0XF7; break; //是4 第四個LED亮
}
}else if(rev[0] == 'b') //判斷第一個字符是不是b
{
while(!RI);
rev[1] = SBUF;
RI = 0;
if(rev[1] == 'e') //判斷第二個字符是不是e
{
while(!RI);
rev[2] = SBUF;
RI = 0;
if(rev[2] == 'e') //判斷第三個字符是不是e
{
while(!RI);
rev[3] = SBUF;
RI = 0;
if(rev[3] == 'r') //判斷第四個字符是不是r
{
beer(); //全部是蜂鳴器響
}
}
}
}
}
ES=1;
}
/***********************************************************************************
按鍵掃描函數
***********************************************************************************/
void Key_Scan()
{
if(k1 == 0) //如果按鍵1被按下
{
Delay_1ms(21); //延時20ms
if(k1 == 0) //按鍵1確實被按下
{
Serial_Txd(ser_text); //串口發送函數
while(!k1) //松手檢測
Delay_1ms(21);
while(!k1);
}
}
}
/************************************************************************
串口發送函數
*************************************************************************/
void Serial_Txd(uchar *p)
{
uint i;
Delay_1ms(1);
for(i = 0;i < 30;i++)
{
SBUF = *p++;
while(!TI);
TI = 0;
}
}
/************************************************************************
蜂鳴器函數
*************************************************************************/
void beer()
{
uint i;
for(i = 0;i < 1600;i++) //大概時間是1s
{
speaker = !speaker;
Delay_1us(70); //控制發聲頻率
}
}
- 本文內容摘錄自:MCU資訊論壇(
http://www.www.9936d.com/) 詳細文章請參考:
http://www.www.9936d.com/thread-1428-1-1.html