鱼C论坛

 找回密码
 立即注册
查看: 4446|回复: 9

[已解决]关于51单片机串口通信的问题(刚刚开始学习的小白)

[复制链接]
发表于 2016-2-12 17:25:32 | 显示全部楼层 |阅读模式
5鱼币
板子是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); 
            
   }        
}
最佳答案
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;
}

最佳答案

查看完整内容

这个程序是将 串口收到的数据传到P0 在向电脑发送一次收到的数据 你参考下 如有帮助请标记解决 #include #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) { ;/*****这 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-2-12 19:48:09 | 显示全部楼层
判断的标志位结果不一样,你没看到whlie里 接受中断标志RI前面有个 '!' 吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

看到了,,可是第一个while后面不是还有一个分号的吗??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-2-12 22:15:19 | 显示全部楼层
淫令天下 发表于 2016-2-12 21:54
看到了,,可是第一个while后面不是还有一个分号的吗??

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

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
淫令天下 + 1 + 1 感谢你的用心回答!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

真的很感谢你的用心回答,,可我还是想知道为什么用串口助手输入一个十六进制的fe 第一种方法数码管上面只出现了e,而第二种方法就出现了fe;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

如果想让数码管显示正常 最好用定时器 不间断的扫描 才可以(每3ms左右扫描显示一次)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-8-10 09:32:24 | 显示全部楼层
有电路图么? 没电路图 不好看代码的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-8-10 09:33:04 | 显示全部楼层
这个好弄 给个图我给你编一个你看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-6 17:15:13 | 显示全部楼层
huyu 发表于 2016-2-12 17:25
这个程序是将 串口收到的数据传到P0  在向电脑发送一次收到的数据
你参考下  如有帮助请标记解决

谢谢!!很久没上来了,,抱歉!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 14:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表