找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[已解决]单片机串口程序调试问题

[复制链接]
跳转到指定楼层
楼主
最近调试51单片机程序,编译下载后运行得不到意料的回复A的结果,程序如下:

#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=baud;        //计数器初始值设置
        TL1=baud;
        ES=1;                //打开接收中断
        EA=1;                //打开总中断
        TR1=1;                //打开计数器               
}

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

        while(1)
        {                        
                                                        
        }               
}

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

        RI = 0;                        //清除接收中断标志位
        rec_data=SBUF;        //存储接收到的数据
        SBUF=0x41;        //收到回复A
        while(!TI);                //等待发送数据完成
        TI=0;                        //清除发送完成标志位                                
}

用串口助手,输入一个字符,得到16进制的A1。把原程序写成输出B,得到输出结果是A2。把原程序写成输出C,得到输出结果是A3。不知道为什么?

2022-05-16_183403.jpg (102.15 KB, 下载次数: 35)

2022-05-16_183403.jpg

2022-05-16_182739.jpg (102.06 KB, 下载次数: 46)

程序结果2

程序结果2

2022-05-16_182452.jpg (109.95 KB, 下载次数: 32)

程序结果1

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

使用道具 举报

沙发
ID:1026496 发表于 2022-5-16 23:18 | 只看该作者
你的晶振是多少,估计是 波特率不对所以显示的不对,建议你算下初值 百度上有 51单片机11.0592M晶振波特率初值表
回复

使用道具 举报

板凳
ID:390416 发表于 2022-5-16 23:40 | 只看该作者
http://www.51hei.com/bbs/dpj-214747-1.html  单片机发送到串口助手,以及串口助手显示到LCD1602
回复

使用道具 举报

地板
ID:776619 发表于 2022-5-17 06:35 | 只看该作者
yaoyao2022 发表于 2022-5-16 23:18
你的晶振是多少,估计是 波特率不对所以显示的不对,建议你算下初值 百度上有 51单片机11.0592M晶振波特率初 ...

12M,串口可以改波特率来适应实验板的啊,改了作用不大。
回复

使用道具 举报

5#
ID:776619 发表于 2022-5-17 06:42 | 只看该作者
本来程序是接收原样返回的,返回的是乱码,就改成固定返回一个值。试过在P3.1接一个外部的另一个串口信号发送,单针刚一接上电脑就正常显示外部串口的值了,排除了P3.1到电脑线路问题,同时能正常下载程序运行说明实验板能正常接收串口数据。
回复

使用道具 举报

6#
ID:161164 发表于 2022-5-17 09:36 | 只看该作者
9600@12Mhz的误差有点大啊~

回复

使用道具 举报

7#
ID:776619 发表于 2022-5-17 10:34 | 只看该作者
lkc8210 发表于 2022-5-17 09:36
9600@12Mhz的误差有点大啊~

谢谢你们,换了个11.0592的晶振果然好了,那以后要用的串口程序的必须得用11.0592的晶振啰!!!这样好了我的GPS模块程序也可以了。用GPS信号做时钟来对时,已通过,就是数组太大了,影响12864显示,不知编译时DATA,XDATA之类的选择怎样才最优化,现在对时功能做到了,可能数组地址空间有冲突,显示有干扰,现在只能对时结束后把串口关了,中断1也关断。完美显示时间、温度、日期等。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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