找回密码
 立即注册

QQ登录

只需一步,快速开始

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

大家帮帮我看一下单片机串口通讯乱码问题?有点搞不懂了

[复制链接]
跳转到指定楼层
楼主
ID:999123 发表于 2022-1-8 21:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的开发板晶振是12MHZ的,第一个是别人写的,在2400波特率下可以正常通讯,第二个我的,在任何波特率下都是乱码,大家帮我看下哪里不同了,谢谢大家了。                                                         
                                                                                                                /**************************************************************************************
实验名称:串口通信实验
接线说明:        
实验现象:下载程序后,当串口助手发送数据给单片机,单片机原封不动转发给串口助手显示
注意事项:使用黄色跳线帽将CH340旁的P5端子的UTX和P30短接,URX和P31短接,出厂默认已短接好                                                                                                                                                                  
***************************************************************************************/
#include "reg52.h"

typedef unsigned int u16;        //对系统默认数据类型进行重定义
typedef unsigned char u8;


/*******************************************************************************
* 函 数 名       : uart_init
* 函数功能                 : 串口通信中断配置函数,通过设置TH和TL即可确定定时时间
* 输    入       : baud:波特率对应的TH、TL装载值
* 输    出             : 无
*******************************************************************************/
void uart_init(u8 baud)
{
        TMOD|=0X20;        //设置计数器工作方式2
        SCON=0X50;        //设置为工作方式1
        PCON=0X80;        //波特率加倍
        TH1=0xe6;        //计数器初始值设置
        TL1=0xe6;
        ES=1;                //打开接收中断
        EA=1;                //打开总中断
        TR1=1;                //打开计数器               
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{        
        uart_init(0XFA);//波特率为2400

        while(1)
        {                        
                                                        
        }               
}

void uart() interrupt 4 //串口通信中断函数
{
        u8 rec_data;

        RI = 0;                        //清除接收中断标志位
        rec_data=SBUF;        //存储接收到的数据
        SBUF=rec_data;        //将接收到的数据放入到发送寄存器
        while(!TI);                //等待发送数据完成
        TI=0;                        //清除发送完成标志位                                

}   

这是我的

  #include<reg52.h>
        #define uchar unsigned char
        #define uint unsigned int
        unsigned char flag, a, i;
        uchar code table[]="i get";
        void init()
        {
          TMOD=0x20;
          SCON=0x50;
         PCON=0x80;
         
          TH1=0xe6;
          TL1=0xe6;
          TR1=1;
           EA=1;
           ES=1;
         }

         void main()
         {
                   init();
                   while(1)
          {
         if(flag==1)
           {
                  ES=0;
                  for(i=0;i<6;i++)
           {
                        SBUF=table[ i];
                        while(!TI);
                         TI=0;

          }
                  SBUF=a;
                  while(!TI);
                  TI=0;
                  ES=1;
                  flag=0;
          }
          }

          }
          void ser() interrupt 4

          {
                 RI=0;
                   a=SBUF;
                   flag=1;
          }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:624769 发表于 2022-1-8 23:10 | 只看该作者
串口中断里面放while……
  你想不乱码……
只能  在上位机 一个字符一个字符 的发……
回复

使用道具 举报

板凳
ID:287575 发表于 2022-1-9 14:19 | 只看该作者
过程错误,肯定是乱发的,中断接到一个数,你在中断发了一个数,也不管它发完了,程序到主程序又开始发送,中断里的数肯定没发完,主程序发了一数后,又进中断了,中断又发,中断不让主程序过好日子,主程序也不让中断过好日子,你发不完,我就发,总之大家都没好日子过!
回复

使用道具 举报

地板
ID:287575 发表于 2022-1-9 14:25 | 只看该作者
我看错了,中断不是发,主程序也禁止串口中断了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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