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

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