关于51单片机串口通信的问题(刚刚开始学习的小白)
板子是51单片机学习板,,,下面代码中如果使用注释掉的第一种方法,,用串口助手以十六进制发送一个0xfe,数码管只能显示e,但是用没有注释掉的那段代码数码管就能显示出 fe(求原因,,)#include <reg52.h>
#define unchar unsigned char
#define unintunsigned 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; //串口通讯模式110位异步通讯
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;
duan = 0;
delay(1);
P0 = 0xff;
wei = 1;
P0 = 0xfd;
wei = 0;
duan = 1;
P0 = leddata;
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;
} 判断的标志位结果不一样,你没看到whlie里 接受中断标志RI前面有个 '!' 吗? 自古天道酬勤 发表于 2016-2-12 19:48
判断的标志位结果不一样,你没看到whlie里 接受中断标志RI前面有个 '!' 吗?
看到了,,可是第一个while后面不是还有一个分号的吗?? 淫令天下 发表于 2016-2-12 21:54
看到了,,可是第一个while后面不是还有一个分号的吗??
第一种写法相当于把程序卡在那,中断来了就响应。
第二种写法相当于让程序一直跑,中断来了就响应。
本质上都是逆用polling去查询中断。 但是第一种方法会造成程序一段时间停止工作. 自古天道酬勤 发表于 2016-2-12 22:15
第一种写法相当于把程序卡在那,中断来了就响应。
第二种写法相当于让程序一直跑,中断来了就响应。
本 ...
真的很感谢你的用心回答,,可我还是想知道为什么用串口助手输入一个十六进制的fe 第一种方法数码管上面只出现了e,而第二种方法就出现了fe; 第一种方法数码管上面只出现了e
由于 while(!RI); 程序在这里等待 使数码管没有 一直扫描 使你看不到前面的F而已 其实F是有的
第二种方法就出现了fe
是由于 程序一直在循环 使数码管也是一直在扫描显示 (实现了数码管动态扫描)所以可以看到FE
如果想让数码管显示正常 最好用定时器 不间断的扫描 才可以(每3ms左右扫描显示一次) 有电路图么? 没电路图 不好看代码的 这个好弄 给个图我给你编一个你看看 huyu 发表于 2016-2-12 17:25
这个程序是将 串口收到的数据传到P0在向电脑发送一次收到的数据
你参考下如有帮助请标记解决
谢谢!!很久没上来了,,抱歉!
页:
[1]