板子是51单片机学习板,,,下面代码中如果使用注释掉的第一种方法,,用串口助手以十六进制发送一个0xfe,数码管只能显示 e,但是用没有注释掉的那段代码数码管就能显示出 fe(求原因,,)#include <reg52.h>
#define unchar unsigned char
#define unint unsigned int
sbit wei = P2^7; sbit duan = P2^6;
unchar number = 0;
unchar leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄灭
0x00 //自定义
};
void UART_init()
{
TMOD = 0x20;//定时器1 选择8位重装模式
TH1 = 0xfa;
TL1 = 0xfa; //比特率4800bps
TR1 = 1;//开始计时
SM0 = 0;
SM1 = 1; //串口通讯模式1 10位异步通讯
REN = 1; //接受指令开启
}
void delay(unchar n)
{
unchar x,y;
for(x = 0; x < n; x++)
for(y = 0; y < 115; y++);
}
void display()
{
unchar shi,ge;
shi = number/16;
ge = number%16;
P0 = 0xff;
wei = 1;
P0 = 0xfe;
wei = 0;
duan = 1;
P0 = leddata[shi];
duan = 0;
delay(1);
P0 = 0xff;
wei = 1;
P0 = 0xfd;
wei = 0;
duan = 1;
P0 = leddata[ge];
duan = 0;
delay(1);
}
void main ()
{
UART_init();
while(1)
{
/* while(!RI);
number = SBUF;
RI = 0; */
//这两种写法有什么样的区别,,为什么执行出来的效果不一样
while(RI)
{
number = SBUF;
RI = 0;
}
display();
// delay(1000);
}
}
本帖最后由 huyu 于 2017-8-10 09:46 编辑
这个程序是将 串口收到的数据传到P0 在向电脑发送一次收到的数据
你参考下 如有帮助请标记解决
#include <REGX52.H>
#define uchar unsigned char
#define uint unsigned int
void schul1(char sx);
void main()
{
PCON=0X00;
EA=1;/*****这俩开中断*****/
ES=1;
SCON=0X50;/*******这句是设置串口设置模式一****/
TMOD=0X20;/******这四个设置波特率******/
TL1=0XFD;
TH1=0XFD;
TR1=1;
while(1)
{
;/*****这里等着数据来****/
}
}
/********收到数据进入中断*******/
void schul0(void)interrupt 4
{
char sx;
ES=0;
sx=SBUF;
schul1(sx);
ES=1;
}
/*******把收到的数据再给发回去******/
void schul1(char sx)
{
SBUF=P0;
while(!TI);
TI=0;
RI=0;
}
|