找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求PC与89C51单片机之间的串行通信(PC发送,单片机接收,,接收数值)

[复制链接]
跳转到指定楼层
楼主
接收数值要赋给一个变量,这个变量时用来控制舵机pwm波占空比的,求大佬们解答这段串口通信程序怎么编?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:485190 发表于 2019-4-9 20:39 | 只看该作者
控制双舵机,所以需要输入两个变量0.0,我觉得应该和一个变量差不多吧
回复

使用道具 举报

板凳
ID:213173 发表于 2019-4-10 06:27 | 只看该作者
a838036398 发表于 2019-4-9 20:39
控制双舵机,所以需要输入两个变量0.0,我觉得应该和一个变量差不多吧

串口每次只能传输1个字节,如果没有使用自定义协议传输数据串,只是用简单的单字节传输两个变量,可以用一个字节的高4位和低4位各表示一个变量。如收到0xab,高4位分解为x=0xab>>4; 低4位分解为 y=0xab&0x0f;
回复

使用道具 举报

地板
ID:485190 发表于 2019-4-10 13:19 | 只看该作者
wulin 发表于 2019-4-10 06:27
串口每次只能传输1个字节,如果没有使用自定义协议传输数据串,只是用简单的单字节传输两个变量,可以用 ...

大佬,具体应该怎么写呢?怎么定义这个变量,“uchar (随机写)=0xab”吗?然后在主函数里提取x=。。。y=。。。这样吗?不好意思,小白给大佬添麻烦了
回复

使用道具 举报

5#
ID:485190 发表于 2019-4-10 13:22 | 只看该作者
wulin 发表于 2019-4-10 06:27
串口每次只能传输1个字节,如果没有使用自定义协议传输数据串,只是用简单的单字节传输两个变量,可以用 ...

大佬那具体怎么写呢,是uchar 。。=0xab,然后再主函数中用你说的x=。。y=。。。提取高四位第四位这样吗?小白给大佬添麻烦了
回复

使用道具 举报

6#
ID:213173 发表于 2019-4-11 08:12 | 只看该作者
a838036398 发表于 2019-4-10 13:22
大佬那具体怎么写呢,是uchar 。。=0xab,然后再主函数中用你说的x=。。y=。。。提取高四位第四位 ...

给你写一个示例程序,两种数据解析方案任选一种。输出端口可以自行重新定义。


  1. #include <AT89X52.H>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. sbit LED1=P1^0;
  5. sbit LED2=P1^1;

  6. bit flag;                                //接收完成标志,
  7. uchar num,num1,num2;        //接收/分解的变量

  8. void main()                                                       
  9. {
  10.         PCON &= 0x7F;                //波特率不倍速
  11.         SCON = 0x50;                //8位数据,可变波特率
  12.         TMOD|= 0x20;                //设定定时器1为8位自动重装方式
  13.         TL1 = 0xFD;                        //设定定时初值
  14.         TH1 = 0xFD;                        //设定定时器重装值
  15.         TR1 = 1;                        //启动定时器1
  16.         ET1 = 0;                        //禁止定时器1中断
  17.         EA = 1;                                //开总中断
  18.         ES = 1;                                //开串口中断
  19.         while(1)
  20.         {
  21.                 if(flag==1)                //接收完成标志为1
  22.                 {
  23.                         ES=0;                //关串口中断
  24.                         flag=0;                //接收完成标志清0
  25.                         SBUF=num;        //返回PC收到的数据
  26.                         while(!TI);        //等待发送中断请求标志位为1
  27.                         TI=0;                //发送中断请求标志位清0
  28.                         ES=1;                //开串口中断
  29.         /*************数据解析方案一************/
  30.                         num1=num&0xf0;
  31.                         num2=num&0x0f;
  32.                         if(num1==0xa0)LED1=0;
  33.                         if(num1==0xb0)LED1=1;
  34.                         if(num2==0x0a)LED2=0;
  35.                         if(num2==0x0b)LED2=1;
  36.         /*************数据解析方案二************/
  37. /*                        num1=num>>4;
  38.                         num2=num&0x0f;
  39.                         if(num1==0x0a)LED1=0;
  40.                         if(num1==0x0b)LED1=1;
  41.                         if(num2==0x0a)LED2=0;
  42.                         if(num2==0x0b)LED2=1;
  43. */
  44.                 }
  45.         }
  46. }

  47. void ser() interrupt 4
  48. {                                //当接收完成发生中断请求RI由硬件置1
  49.         RI=0;                //接收中断请求标志位必须软件清0
  50.         num=SBUF;        //获取SBUF接收到的数据
  51.         flag=1;                //接收完成标志置1
  52. }
复制代码



回复

使用道具 举报

7#
ID:230559 发表于 2019-4-11 10:25 | 只看该作者
按串口的协议持续将变量写入舵机
回复

使用道具 举报

8#
ID:485190 发表于 2019-4-11 10:26 | 只看该作者
wulin 发表于 2019-4-11 08:12
给你写一个示例程序,两种数据解析方案任选一种。输出端口可以自行重新定义。

非常感激,谢谢带佬
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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