鱼C论坛

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

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

[复制链接]
发表于 2016-2-12 17:25:32 | 显示全部楼层 |阅读模式
5鱼币
板子是51单片机学习板,,,下面代码中如果使用注释掉的第一种方法,,用串口助手以十六进制发送一个0xfe,数码管只能显示  e,但是用没有注释掉的那段代码数码管就能显示出 fe(求原因,,)
  1. #include <reg52.h>

  2. #define unchar unsigned char
  3. #define unint  unsigned int
  4. sbit wei = P2^7; sbit duan = P2^6;
  5. unchar number = 0;
  6. unchar leddata[]={

  7.                 0x3F,  //"0"
  8.                 0x06,  //"1"
  9.                 0x5B,  //"2"
  10.                 0x4F,  //"3"
  11.                 0x66,  //"4"
  12.                 0x6D,  //"5"
  13.                 0x7D,  //"6"
  14.                 0x07,  //"7"
  15.                 0x7F,  //"8"
  16.                 0x6F,  //"9"
  17.                 0x77,  //"A"
  18.                 0x7C,  //"B"
  19.                 0x39,  //"C"
  20.                 0x5E,  //"D"
  21.                 0x79,  //"E"
  22.                 0x71,  //"F"
  23.                 0x76,  //"H"
  24.                 0x38,  //"L"
  25.                 0x37,  //"n"
  26.                 0x3E,  //"u"
  27.                 0x73,  //"P"
  28.                 0x5C,  //"o"
  29.                 0x40,  //"-"
  30.                 0x00,  //熄灭
  31.                 0x00  //自定义

  32.                          };

  33. void UART_init()
  34. {
  35.         TMOD = 0x20;//定时器1 选择8位重装模式
  36.         TH1 = 0xfa;
  37.         TL1 = 0xfa;         //比特率4800bps
  38.         TR1 = 1;//开始计时
  39.         SM0 = 0;
  40.         SM1 = 1; //串口通讯模式1  10位异步通讯
  41.         REN = 1; //接受指令开启
  42. }

  43. void delay(unchar n)
  44. {
  45.         unchar x,y;
  46.         for(x = 0; x < n; x++)
  47.                 for(y = 0; y < 115; y++);
  48. }

  49. void display()
  50. {
  51.         unchar shi,ge;
  52.         shi = number/16;
  53.         ge = number%16;
  54.         P0 = 0xff;
  55.         wei = 1;
  56.         P0 = 0xfe;
  57.         wei = 0;
  58.         duan = 1;
  59.         P0 = leddata[shi];
  60.         duan = 0;
  61.         delay(1);

  62.         P0 = 0xff;
  63.         wei = 1;
  64.         P0 = 0xfd;
  65.         wei = 0;
  66.         duan = 1;
  67.         P0 = leddata[ge];
  68.         duan = 0;
  69.         delay(1);
  70. }

  71. void main ()
  72. {
  73.    UART_init();
  74.    while(1)
  75.    {
  76.            /*        while(!RI);
  77.                 number = SBUF;
  78.                 RI = 0;        */
  79.                 //这两种写法有什么样的区别,,为什么执行出来的效果不一样
  80.                 while(RI)
  81.                 {
  82.                         number = SBUF;
  83.                         RI = 0;
  84.                 }
  85.                
  86.         display();
  87.          //        delay(1000);
  88.             
  89.    }       
  90. }
复制代码
最佳答案
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-3-29 23:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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