找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机串行通信问题

[复制链接]
跳转到指定楼层
楼主
我想实现按键传送,可是出现了问题

发送
#include<reg52.h>
char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit q=P3^6;
int num=0;
scon=0x50;
int ge;
                void delay(){
                int i,j=0;
                for(i=500;i<0;i--)
                        for(;j<100;j++);
                                        }
main(){
while(1){
        if(q==0)
        delay();
        if(q==0)
        {
        num++;
            if(num>9)num=0;
                SBUF=num;
                while(TI==0);
                TI=0;
                while(RI==0);
                RI=0;
                if(SBUF==num){
                ge=num%10;
                P1=tab[ge];
                delay();
                }
                while(q==0);
                }       
        }
}


接收

#include<reg52.h>
char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int num=0;
scon=0x50;
char receive;
int ge;
                void delay(){
                int i,j=0;
                for(i=500;i<0;i--)
                        for(;j<100;j++);
                                        }
main(){
while(1){
                while(RI==0){
                RI=0;
                receive=SBUF;
                SBUF=receive;
                while(TI==0);
                TI=0;
                P1=tab[receive%10];
                }
                delay();
                }       
        }





1.jpg (78.72 KB, 下载次数: 35)

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

使用道具 举报

沙发
ID:245521 发表于 2017-11-29 20:01 | 只看该作者
是延时不够长的问题吗?
回复

使用道具 举报

板凳
ID:123289 发表于 2017-11-29 21:04 | 只看该作者
如果RI=1时,则表示收到了一个字节。所以必须在RI=1后才可以取数字。
同样,当发送了一个字节后TI被置1。所以必须在TI=1之后才能续发下一个字节。
回复

使用道具 举报

地板
ID:222948 发表于 2017-11-29 21:58 | 只看该作者
兄弟用到串口怎么没有串口的程序
回复

使用道具 举报

5#
ID:222948 发表于 2017-11-29 22:15 | 只看该作者
  1. //注意我的是p3^7,你的是p3^6
  2. //发送
  3. #include<reg52.h>
  4. char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  5. sbit q=P3^7;
  6. int num=0;
  7. //scon=0x50;
  8. int ge;
  9.                 void delay(){
  10.                 int i,j=0;
  11.                 for(i=500;i<0;i--)
  12.                         for(;j<100;j++);
  13.                                         }
  14. void main(){
  15.         SCON = 0x50;   // ′®¿ú1¤×÷·½ê½1
  16.         TMOD = 0x20;   // T11¤×÷·½ê½2
  17.         PCON = 0x00;   //SMOD=0
  18.         TH1  = 0xfd;    //×°èë3õÖ죬2¨ìØÂê9600
  19.         TL1  = 0xfd;
  20.         TI   = 0;            //±ê־λ3õê¼»ˉ
  21.         RI   = 0;
  22.         TR1  = 1;           //Æô¶ˉ¶¨ê±Æ÷T1
  23.         EA=1;           //CPU¿aÖD¶Ï
  24.     ES=1;   
  25. while(1){
  26.         if(q==0)
  27.         delay();
  28.         if(q==0)
  29.         {
  30.         num++;
  31.             if(num>9)num=0;
  32.                 SBUF=num;
  33.                 while(TI==0);
  34.                 TI=0;
  35.                 while(RI==0);
  36.                 RI=0;
  37.                 if(SBUF==num){
  38.                 ge=num%10;
  39.                 P1=tab[ge];
  40.                 delay();
  41.                 }
  42.                 while(q==0);
  43.                 }        
  44.         }
  45. }

  46. void Serial() interrupt 4        //????
  47. {
  48.         if(RI==1)                    //??????
  49.         {
  50.                  RI = 0;       
  51.                 P1= tab[SBUF];  //????????       
  52.         }
  53. }

  54. //接收
  55. #include<reg52.h>
  56. char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  57. int num=0;
  58. //scon=0x50;
  59. char receive;
  60. int ge;
  61.                 void delay(){
  62.                 int i,j=0;
  63.                 for(i=500;i<0;i--)
  64.                         for(;j<100;j++);
  65.                                         }
  66. void main(){
  67.         P1= tab[0];     // ????
  68.         SCON = 0x50;         // ??????1,????
  69.         TMOD = 0x20;        // T1????2
  70.         PCON = 0x00;        //SMOD=0
  71.         TH1  = 0xfd;         //????,???9600
  72.         TL1  = 0xfd;
  73.         TI   = 0;       //?????
  74.         RI   = 0;
  75.         TR1  = 1;       //?????T1
  76.         EA=1;           //CPU???
  77.     ES=1;
  78. while(1)
  79.         {
  80.                 while(RI==0){
  81.                 RI=0;
  82.                 receive=SBUF;
  83.                 SBUF=receive;
  84.                 while(TI==0);
  85.                 TI=0;
  86.                 P1=tab[receive%10];
  87.                 }
  88.                 delay();
  89.                 }        
  90.         }

  91.                                 void Serial() interrupt 4        //????
  92. {
  93.         if(RI==1)                    //??????
  94.         {
  95.                  RI = 0;       
  96.                 P1= tab[SBUF];  //????????       
  97.         }
  98. }
复制代码

回复

使用道具 举报

6#
ID:222948 发表于 2017-11-29 22:19 | 只看该作者
Doc1.docx (34.39 KB, 下载次数: 6)
回复

使用道具 举报

7#
ID:245521 发表于 2017-11-29 22:26 | 只看该作者
yzwzfyz 发表于 2017-11-29 21:04
如果RI=1时,则表示收到了一个字节。所以必须在RI=1后才可以取数字。
同样,当发送了一个字节后TI被置1。 ...

还是不太理解,我是在RI、TI都发生改变才有动作
回复

使用道具 举报

8#
ID:245521 发表于 2017-11-29 22:54 | 只看该作者
我是借鉴这个

P71129-225347.jpg (1.31 MB, 下载次数: 40)

P71129-225347.jpg

P71129-225352.jpg (1.31 MB, 下载次数: 27)

P71129-225352.jpg
回复

使用道具 举报

9#
ID:245521 发表于 2017-11-29 23:02 | 只看该作者
999333 发表于 2017-11-29 21:58
兄弟用到串口怎么没有串口的程序

我没打算用串口中断啊
回复

使用道具 举报

10#
ID:245521 发表于 2017-11-29 23:03 | 只看该作者

老铁你看我下面发的图,没有打算用串行中断呢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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