先按按键 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.mcuzx.net/) 详细文章请参考:
http://www.mcuzx.net/thread-1428-1-1.html