找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3312|回复: 3
打印 上一主题 下一主题
收起左侧

新手请教一下单片机串口PC通信控制灯的问题

[复制链接]
跳转到指定楼层
楼主
ID:210889 发表于 2017-6-18 00:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
新手自学到串口通信那部分,用了教程里面的发送a数据的串口通信程序例子,串口调试助手可以显示数据a。然后我自己尝试写了,当a = 0x01 led亮,但是串口调试助手有显示接收到的数据,可是开发板的灯却没亮。 下面是程序,先谢谢论坛中的为我解答的人
  1. #include <reg52.h>         
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. //#define LED P1
  6. uchar dat,num = 0,a=0;
  7. uchar ON = 0;
  8. uchar OFF = 1;
  9. sbit led1 = P1^0;
  10. void initial_com();
  11. void delay(unsigned int z);   // 忽略这延时,本来还想用串口通信实现呼吸流水之类的,现在连灯亮都不行
  12. void delay2(unsigned int t);


  13. void  initial_com(void)
  14. { SCON = 0x50;
  15.   TMOD|= 0x20;   //设置波特率 9600
  16.   TH1 = 0xfd;
  17.   TL1 = 0xfd;
  18.   TR1 = 1;
  19.   REN = 1;           //串口初始化
  20.   SM0 = 0;
  21.   SM1 = 1;
  22.   EA = 1;
  23.   ES = 0;           //串口中断开启位  
  24. SBUF = 0x01;  //开发板开关开启接收到,01 FF数据
  25.   while(!TI);
  26.   TI = 0;
  27.   ES = 1;
  28. }

  29. void main()
  30. {        
  31.         initial_com();
  32.         while(1)
  33.         {        
  34.                 if(num==1)
  35.                 {
  36.                      ES = 0;
  37.                          num = 0;
  38.                          SBUF = a;   //
  39.                          while(!TI);
  40.                          TI = 0;
  41.                          ES = 1;
  42.                         
  43.                 }
  44.                
  45.         }        
  46. }
  47. void ser() interrupt 4
  48. {
  49.         RI=0;
  50.         a = SBUF;
  51. //        ES=0;                                    //关闭串口中断
  52.         num=1;
  53. /*在调试助手上确实可以显示接收到 0x01 ,但是灯没亮*/
  54.          if(a == 0x01)      
  55.          {
  56.            led1 = 0;
  57.                 }
  58.          if(a == 0x02)
  59.          {
  60.             led1 = 1;
  61.                 }
  62.                     

  63. }
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:164602 发表于 2017-6-18 09:27 | 只看该作者
我用你的程序,在我的板子上试验了一下,完全是正确的。输入HEX的数据1,可以开灯,输入HEX的数据2,可以关灯。
可能你的问题是:
我读你程序时,特别注意了你的判断用的数据类型——HEX十六进制数据类型,所以,串口通讯实验时,我特地将输入的选项,设置为HEX,所以是成功的。
如果你输入的数据类型是字符型,输入、输出看起来都是1,但单片机可不那么想,‘1’和0x01是不同的。
你注意一下,返回的是01,则说明输入的1是十六进制数据,若返回的是1,就是输入的字符数据。
切切!数据类型在串口通讯中控制时,重要!!!

评分

参与人数 1黑币 +5 收起 理由
LIPPPP + 5 赞一个!

查看全部评分

回复

使用道具 举报

板凳
ID:210889 发表于 2017-6-18 21:51 | 只看该作者
HC6800-ES-V2.0 发表于 2017-6-18 09:27
我用你的程序,在我的板子上试验了一下,完全是正确的。输入HEX的数据1,可以开灯,输入HEX的数据2,可以关 ...

原来如此!!! 我搞了好久不知道哪里出错。我这 新手确实好多小细节都没弄懂,学习学习了。
回复

使用道具 举报

地板
ID:123289 发表于 2017-6-18 23:19 | 只看该作者
执行“SBUF = 0x01;  //开发板开关开启接收到,01 FF数据”,是向串口发送一个01,发完后会产生一个中断,程序转入中断服务去。
在中断服务程序中你:“a = SBUF;” -----由于SBUF中原来没有一个确定的数据(发送的SBUF与接收的SBUF是不同的,请你认真仔细读单片机手册),所以a不知道是等于什么,=01的可能性为1/256。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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