找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机串口程序问题

[复制链接]
跳转到指定楼层
楼主
ID:876099 发表于 2021-6-3 16:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想问一下怎么写单片机的串口才能让打开串口一瞬间就可以接收到数据,大牛见笑了
  1. /**************************************************************************************
  2. *                              串口通信实验                                                                                                  *
  3. 实现现象:下载程序后打开串口调试助手,将波特率设置为4800,选择发送的数据就可以显示
  4.                         在串口助手上。
  5. 注意事项:无。                                                                                                                                                                  
  6. ***************************************************************************************/

  7. #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

  8. typedef unsigned int u16;          //对数据类型进行声明定义
  9. typedef unsigned char u8;


  10. /*******************************************************************************
  11. * 函数名         :UsartInit()
  12. * 函数功能                   :设置串口
  13. * 输入           : 无
  14. * 输出                  : 无
  15. *******************************************************************************/
  16. void UsartInit()
  17. {
  18.         SCON=0X50;                        //设置为工作方式1
  19.         TMOD=0X20;                        //设置计数器工作方式2
  20.         PCON=0X80;                        //波特率加倍
  21.         TH1=0XF3;                                //计数器初始值设置,注意波特率是4800的
  22.         TL1=0XF3;
  23.         ES=1;                                                //打开接收中断
  24.         EA=1;                                                //打开总中断
  25.         TR1=1;                                        //打开计数器
  26. }

  27. /*******************************************************************************
  28. * 函 数 名       : main
  29. * 函数功能                 : 主函数
  30. * 输    入       : 无
  31. * 输    出             : 无
  32. *******************************************************************************/
  33. void main()
  34. {        
  35.         UsartInit();  //        串口初始化
  36.         while(1);               
  37. }

  38. /*******************************************************************************
  39. * 函数名         : Usart() interrupt 4
  40. * 函数功能                  : 串口通信中断函数
  41. * 输入           : 无
  42. * 输出                  : 无
  43. *******************************************************************************/
  44. void Usart() interrupt 4
  45. {
  46. //u8 receiveData;
  47. //receiveData=SBUF;//出去接收到的数据
  48. //RI = 0;//清除接收中断标志位
  49.     SBUF=0xf0;
  50.          while(TI==0);                         //等待发送数据完成
  51.          TI=0;                                                 //清除发送完成标志位
  52. }
复制代码
我这样写的,然后我打开串行助手第一个收到的数据是00,然后就没有了,我随便发送个数据就收到很多f0,
希望大神帮我解答一下谢谢


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

使用道具 举报

沙发
ID:876099 发表于 2021-6-3 17:51 | 只看该作者
有没有大牛帮忙解决一下,感谢感谢,,急急急!!!
回复

使用道具 举报

板凳
ID:241273 发表于 2021-6-3 19:53 | 只看该作者
中断接收函数里  SUBF     就是你中断接收的数据    那个不是用来赋值的       直接弄一个变量接收它的值就行
回复

使用道具 举报

地板
ID:94031 发表于 2021-6-3 20:09 | 只看该作者
接收是硬件缓存器接收完成,发起中断软件在中断里接收,发送你就放在main循环里,你这样子无法发送。
回复

使用道具 举报

5#
ID:876099 发表于 2021-6-3 21:11 | 只看该作者
zjy007 发表于 2021-6-3 19:53
中断接收函数里  SUBF     就是你中断接收的数据    那个不是用来赋值的       直接弄一个变量接收它的值就 ...

好的我去改一下试试
回复

使用道具 举报

6#
ID:876099 发表于 2021-6-3 21:12 | 只看该作者
xuyaqi 发表于 2021-6-3 20:09
接收是硬件缓存器接收完成,发起中断软件在中断里接收,发送你就放在main循环里,你这样子无法发送。

能说的详细一点吗,因为串行通信这块我平时解除的少算是的小白谢谢
回复

使用道具 举报

7#
ID:777356 发表于 2021-6-3 23:01 | 只看该作者
首先,你串口中断里面这一行代码不能注释掉
//RI = 0;//清除接收中断标志位
其次,不推荐你在串口里重新发数据,数据量少还没多大的问题,一旦数据量比较大就问题就比较严重
#include<reg52.h>
#define uchar unsigned char
sbit p=P1^0;

uchar i=0;

void delay(uchar a)
{
        uchar b;
        for(a;a>0;a--)
                for(b=124;b>0;b--);
}

void csh()
{
        SCON =0x50; // SCON: 模式 1, 8-bit UART, 使能接收
        TMOD |= 0x20; // TMOD:timer 1, mode 2, 8-bit 重装
        TH1 =TL1= 0xFD; // TH1: 重装值9600 波特率 晶振 11.0592MHz
        TR1 =1; // TR1: timer 1 打开
        EA = 1; //打开总中断
        ES = 1; //打开串口中断
        PCON=0;
}

void main()
{
        csh();
        while(1);
}

void a() interrupt 4
{
        uchar k=0;
        while(RI==1)
        {
                RI=0;
                k=SBUF;
                i=k;
                SBUF=k;
                while(TI==0);
                TI=0;
                delay(200);               
        }
        if(i=='a')
        p=1;
        else
        p=0;
}
上面是在中断里面发送数据量不大就可以,建议还是放在外面
#include<reg52.h>
#define uchar unsigned char
sbit p=P1^0;

uchar i=0;

void delay(uchar a)
{
        uchar b;
        for(a;a>0;a--)
                for(b=124;b>0;b--);
}

void csh()
{
        SCON =0x50; // SCON: 模式 1, 8-bit UART, 使能接收
        TMOD |= 0x20; // TMOD:timer 1, mode 2, 8-bit 重装
        TH1 =TL1= 0xFD; // TH1: 重装值9600 波特率 晶振 11.0592MHz
        TR1 =1; // TR1: timer 1 打开
        EA = 1; //打开总中断
        ES = 1; //打开串口中断
        PCON=0;
}

void main()
{
        csh();
        while(1)
        {
                if(i == 1)
                {
                        i = 0;
                        SBUF=k;
                        while(TI==0);
                        TI=0;
                }
        }
}

void a() interrupt 4
{
        uchar k=0;
        while(RI==1)
        {
                RI=0;
                i=1;
                k=SBUF;               
        }

}

回复

使用道具 举报

8#
ID:883031 发表于 2021-6-4 12:06 | 只看该作者
这样是没法触发中断的。
回复

使用道具 举报

9#
ID:238019 发表于 2021-6-4 12:51 | 只看该作者
接收放在中断里,接收放在主程序里
回复

使用道具 举报

10#
ID:932412 发表于 2021-6-4 20:45 | 只看该作者
其实如果不是很明白的话,建议:一般官网都有相关例程和对应手册,根据例程先调通,不了解就看手册,手册里有寄存器和时序还有硬件工作原理,这样你可以更快学习。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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