淫令天下 发表于 2016-2-12 17:25:32

关于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 发表于 2016-2-12 17:25:33

本帖最后由 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;
}

自古天道酬勤 发表于 2016-2-12 19:48:09

判断的标志位结果不一样,你没看到whlie里 接受中断标志RI前面有个 '!' 吗?

淫令天下 发表于 2016-2-12 21:54:23

自古天道酬勤 发表于 2016-2-12 19:48
判断的标志位结果不一样,你没看到whlie里 接受中断标志RI前面有个 '!' 吗?

看到了,,可是第一个while后面不是还有一个分号的吗??

自古天道酬勤 发表于 2016-2-12 22:15:19

淫令天下 发表于 2016-2-12 21:54
看到了,,可是第一个while后面不是还有一个分号的吗??

第一种写法相当于把程序卡在那,中断来了就响应。
第二种写法相当于让程序一直跑,中断来了就响应。
本质上都是逆用polling去查询中断。 但是第一种方法会造成程序一段时间停止工作.

淫令天下 发表于 2016-2-12 23:24:31

自古天道酬勤 发表于 2016-2-12 22:15
第一种写法相当于把程序卡在那,中断来了就响应。
第二种写法相当于让程序一直跑,中断来了就响应。
本 ...

真的很感谢你的用心回答,,可我还是想知道为什么用串口助手输入一个十六进制的fe 第一种方法数码管上面只出现了e,而第二种方法就出现了fe;

过眼_云烟_ 发表于 2017-1-22 18:51:48

第一种方法数码管上面只出现了e
由于 while(!RI); 程序在这里等待 使数码管没有 一直扫描 使你看不到前面的F而已 其实F是有的
第二种方法就出现了fe
是由于 程序一直在循环 使数码管也是一直在扫描显示 (实现了数码管动态扫描)所以可以看到FE

如果想让数码管显示正常 最好用定时器 不间断的扫描 才可以(每3ms左右扫描显示一次)

huyu 发表于 2017-8-10 09:32:24

有电路图么? 没电路图 不好看代码的

huyu 发表于 2017-8-10 09:33:04

这个好弄 给个图我给你编一个你看看

淫令天下 发表于 2018-3-6 17:15:13

huyu 发表于 2016-2-12 17:25
这个程序是将 串口收到的数据传到P0在向电脑发送一次收到的数据
你参考下如有帮助请标记解决



谢谢!!很久没上来了,,抱歉!
页: [1]
查看完整版本: 关于51单片机串口通信的问题(刚刚开始学习的小白)