|
我设计了和借鉴了一个基于51单片机的程序,目前只能做到用手机控制一个led的亮灭,我想加一点程序,让51单片机开发板上的数码管记录亮灭次数,不过改了很多次都不成功,...哪位大神教一下,我才学单片机1个月![]() ,新手都算不上。
#include
#include
unsigned char tmp;
unsigned int c=0;
typedef unsigned char u8;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
sbit led1=P2^0; //指示灯0
void init(); //串口初始化
void send(unsigned char a); //单字节发送函数
void ctrl(); //接收处理函数
void main()
{
init();
while(1)
{
if(RI==1) //是否有数据到来
{
RI = 0;
tmp = SBUF; //暂存接收到的数据
ctrl();
}
}
}
void display(void)
{
}
void init() //串口初始化
{
ES=0; //关中断
SCON = 0x50; // REN=1允许串行接受状态,串口工作模式1,
TMOD = 0x20; //定时器1工作于方式2,8位自动重载模式,用于产生波特率
TH1=TL1=0xFD; //波特率9600 (本次测试采用晶振为11.0592)
PCON &= 0x7f; //波特率不倍增
TR1 = 1; //定时器1开始工作,产生波特率
TI=0; //接收标志位置0
RI=0;
ES=1;
P1=~smgduan[0];
led1=0;
//初始化设置3个指示灯全灭
}
void send(unsigned char a) //单字节数据发送
{ //注意:若单片机TXD(P3.1)无上拉能力,必须在P3.1端接上拉电阻。本次测试需要接上拉电阻
TI=0;
SBUF=a;
while(TI==0);
TI=0;
}
void ctrl() //接收处理函数
{ switch(tmp)
{
case '1':
led1=1; //收到字符1,指示灯0灭
send(tmp);
P1=~smgduan[1];
break;
case 'A':
led1=0; //收到字符1,指示灯0灭
send(tmp);
P1=~smgduan[2];
break;
case '2':
led1=1; //收到字符1,指示灯0灭
send(tmp);
P1=~smgduan[3];
break;
case 'B':
led1=0; //收到字符1,指示灯0灭
send(tmp);
P1=~smgduan[4];
break;
case '3':
led1=1; //收到字符1,指示灯0灭
send(tmp);
P1=~smgduan[5];
break;
case 'C':
led1=0; //收到字符1,指示灯0灭
send(tmp);
P1=~smgduan[6];
break;
case '4':
led1=1; //收到字符1,指示灯0灭
send(tmp);
P1=~smgduan[7];
break;
case 'D':
led1=0; //收到字符1,指示灯0灭
send(tmp);
P1=~smgduan[8];
break;
case '5':
led1=1; //收到字符1,指示灯0灭
send(tmp);
P1=~smgduan[9];
break;
}
}
|
-
-
串口.c
3.67 KB, 下载次数: 3
|