找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机串口仿真(全双工 有中断)

[复制链接]
跳转到指定楼层
楼主
这是一个小的串口仿真。希望可以帮助一下

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg52.h>

  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. void UART() interrupt 4
  5. {       
  6.         if(RI == 1)
  7.         {
  8.                 RI = 0;
  9.                 P1 = SBUF;
  10.         }
  11.                
  12. }
  13. void init_UART()
  14. {
  15.         EA = 1;
  16.         ES = 1;
  17.         TMOD = 0x20;        //模式2 8位自动重载模式 溢出时,将TH1装入TL1
  18.         TH1 = 0xFD;                //波特率:9600
  19.         TL1 = TH1;
  20.         SCON = 0x50;         //方式1(定时器1溢出率)允许接收
  21.         PCON = 0x00;       
  22.         TR1 = 1;
  23. }

  24. void Send_One_Byte(uchar Byte)
  25. {
  26.         SBUF = Byte;
  27.         while(!TI);                //TI == 1 跳出循环
  28.         TI = 0;
  29.        
  30. }
  31. void main()
  32. {
  33.        
  34.         uchar num;
  35.         init_UART();

  36.         while(1)
  37.         {
  38.                 num = P2;
  39.                 Send_One_Byte(num);
  40.         }
  41. }
复制代码

所有资料51hei提供下载:
51单片机串口仿真【全双工 有中断】.rar (43.9 KB, 下载次数: 88)


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

使用道具 举报

沙发
ID:339320 发表于 2019-5-20 19:33 | 只看该作者
void Send_One_Byte(uchar Byte)
{
        
        SBUF = Byte;
        ES=0;
        while(!TI);                //TI == 1 跳出循环
        TI = 0;
        ES=1;
}
要加ES=0;和ES=1;否则在发送数据的时候,容易被中断清除数据。
回复

使用道具 举报

板凳
ID:653072 发表于 2020-4-1 18:41 来自手机 | 只看该作者
找了好久就这帖明白
回复

使用道具 举报

地板
ID:115923 发表于 2022-3-26 21:46 | 只看该作者
aiwenxue999 发表于 2019-5-20 19:33
void Send_One_Byte(uchar Byte)
{
        

瞎说, 我一直也是这样用, 从来没有出现 被中断清除掉数据。

他是发送的时候,进入中断,但是 没有if(TI) TI=0; 所以, 马上就又跳出中断,也就是进中断啥也没有做, 然后再返回 等待 while*!TI)这里执行,也就是等待发送完成,手动清除TI=0;

你不信,可以多测试试一试~

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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