找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机串口自发自收程序有问题,有没有大佬帮解决

[复制链接]
跳转到指定楼层
楼主
#include<reg51.h>                                          
code unsigned char LEDMAP[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
// 八段管显示码 0-F  8段数码管为共阴极接发
unsigned int i = 0 ;
void delay(time)
{
        unsigned int j;
        unsigned int k;
        for(j=0;j<time;j++)
                for(k=0;k<time;k++)
                {;}

}
void main()
{
SCON = 0X50; //工作方式1 ,接收允许,八位数据
PCON = 0X00; //波特率加倍
TMOD = 0x20; //定时器T1 工作方式2 自动装填八位定时器
TH1 = 0XF4;
TL1 = 0XF4; //          波特率2400 设置初值
TR1 = 1;     // 打开定时器T1
EA = 1;         //开总中断
ES = 1;         //开接收中断
P0 = 0xFC;         //后两个数码管打开
while(1)                                                                                                                        
{        
         if(i<10)        
           {
          SBUF = LEDMAP[ i];  //数据送入寄存器
          while(TI==0) ;   //等待数据发送完
          TI = 0;                   //发完 TI清零
          i++ ;
          delay(500);
          }
}
}
void receive() interrupt 4
{
        int temp;
        if(RI==1)
        {
        RI = 0;  
        temp =  SBUF;  //接收串口数据
        P1 = temp;
        delay(500);     
        }               
        if(TI)
         {TI=0;}
}


屏幕截图 2022-11-14 222652.jpg (198.49 KB, 下载次数: 56)

屏幕截图 2022-11-14 222652.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:68189 发表于 2022-11-15 06:49 | 只看该作者
检查:
while(TI==0) ;   //等待数据发送完   
回复

使用道具 举报

板凳
ID:161164 发表于 2022-11-15 08:59 | 只看该作者

回复

使用道具 举报

地板
ID:1051991 发表于 2022-11-15 09:01 | 只看该作者
wpppmlah 发表于 2022-11-15 06:49
检查:
while(TI==0) ;   //等待数据发送完

什么意思?我不太会
回复

使用道具 举报

5#
ID:1051991 发表于 2022-11-15 09:07 | 只看该作者
还是不行啊,proteus运行之后 只能显示88
回复

使用道具 举报

6#
ID:1051991 发表于 2022-11-15 09:10 | 只看该作者

还是不行啊,运行proteus 只能显示88,他好像没发送数据一样
回复

使用道具 举报

7#
ID:123289 发表于 2022-11-15 09:21 | 只看该作者
发送:SBUF=数字后,发送就开始了,一切由硬件完成,发完之后,硬件会产生一个中断标记TI,并引发下一个中断。
你要做的是,待发送中断,中断后,先清除TI。再发送下一个字节,就可以退出了,不用DELAY,也不用再做其它事。
接收:也同样,过程是由硬件完成的,串入组装好一个字节后,硬件会产生一个中断标记RI,并引发一个中断。
你要做的是,待接收中断,中断后,先清除RI,将SBUF中的数据,收藏到某个地方,就可以退出了,不用DELAY,也不用再做其它事。


回复

使用道具 举报

8#
ID:1051991 发表于 2022-11-15 09:38 | 只看该作者
谢谢各位大佬,我这可能是proteus的问题,在我自己电脑上就不好使,在别人电脑上就行,挺奇怪的
回复

使用道具 举报

9#
ID:161164 发表于 2022-11-15 09:56 | 只看该作者
ExploreX 发表于 2022-11-15 09:38
谢谢各位大佬,我这可能是proteus的问题,在我自己电脑上就不好使,在别人电脑上就行,挺奇怪的

是版本问题
从别人的电脑上寻找MCS8051.dll
复制到你的电脑的相同位置就可以了(旧MSC8051.dll先改名)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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