找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

单片机数码管应该显示一样数字结果却不同,我认为是进制赋值给SBUF的问题?

查看数: 1659 | 评论数: 6 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2022-4-11 14:35

正文摘要:

如何改正请指点 发送程序 /**************************************************************************************                 &nbs ...

回复

ID:161164 发表于 2022-4-13 11:20
machaore130 发表于 2022-4-13 11:05
这样啊。您是想让我用中断方式(发送或接受完毕触发串行口中断)代替查询方式(查询RI和TI)以免因为whil ...

我改的代码也是查询RI啊~
ID:849316 发表于 2022-4-13 11:05
lkc8210 发表于 2022-4-12 00:04
不是~
你要把v的赋值动作放到while(1)里
放到while(1)之前只会赋值一次

这样啊。您是想让我用中断方式(发送或接受完毕触发串行口中断)代替查询方式(查询RI和TI)以免因为while函数的缺陷卡在不必要的地方是吗?我一直在纠结如何发送大于255的数实现多字节发送没有关注到这一问题。
ID:161164 发表于 2022-4-12 00:04
machaore130 发表于 2022-4-11 16:23
感谢您的解答。我能理解您的意思,您是想表明先给v赋值判断v赋值完成后再进行显示,这样程序会更加严谨。 ...

不是~
你要把v的赋值动作放到while(1)里
放到while(1)之前只会赋值一次

而Receive()里有while(RI==0)
有机会死循环
所以改成回贴那样
ID:213173 发表于 2022-4-11 21:22
machaore130 发表于 2022-4-11 16:23
感谢您的解答。我能理解您的意思,您是想表明先给v赋值判断v赋值完成后再进行显示,这样程序会更加严谨。 ...

串口每次只能发送1个字节,如果V大于1个字节(255)就要按字节数量拆分,分多次传输。假设V=0x012c. 拆分V1=0x012c>>8;V2=0x012c;(高8位溢出,V2实际=0x2c),接收端再把两个字节合并还原:V=V1<<8|V2;
ID:849316 发表于 2022-4-11 16:23

感谢您的解答。我能理解您的意思,您是想表明先给v赋值判断v赋值完成后再进行显示,这样程序会更加严谨。但因为我不够专业,程序可能存在问题较大。在改正后,仍不能将使得两个数码管显示一样的数字。说明发送函数和接收函数有问题。可能是因为SBUF仅有一个字节无法满足要求也许我需要学习用多个字节按位表示一个数逐位发送才会达到要求。再次感谢您的帮助。
ID:161164 发表于 2022-4-11 15:29
  1. void main()
  2.     {   
  3.     TMOD=0X20;       //定时器1工作于方式2
  4.     SCON=0X50;       //定时器串口工作方式1允许接收
  5.     PCON=0x00;       //波特率9600
  6.     TH1=0XFD;       //根据规定给定时器T1赋值
  7.     TL1=0XFD;       //根据规定给定时器T1赋值
  8.     TR1=1;           //启动定时器T1
  9.     REN=1;           //允许接收
  10. //v=Receive();
  11.     while(1)                        
  12.     {    k3=0;                    //抬杆落下
  13. if(RI)
  14. {
  15. RI=0;
  16. v=(unsigned int)SUBF;
  17. }
  18.         display();                //显示函数
  19.     }   
  20.     }
复制代码


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

Powered by 单片机教程网

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