找回密码
 立即注册

QQ登录

只需一步,快速开始

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

问一个单片机串口中断程序调试问题

[复制链接]
跳转到指定楼层
楼主
我的问题是:
①在初始化函数InitUART()中SCON设置为了01010000,TI和RI都被设置为0,所以不能向单片机申请中断,然后在初始化函数InitUART()之后又紧接着设置发送一串字符,发送函数中有 while(!TI);TI=0;这么两行,但是因为TI最开始就设为0了,而且串口中断ES是在后面打开的,那么理论上TI就是一直为0,while(!TI)就是个死循环啊,为什么还会传出数据?

②为什么用通用的串口调试工具就能发送汉字,而用德飞莱(我买的单片机牌子)自己的串口调试工具就能发送汉字呢?




/*****************************下面是单片机代码********************************************/
#include <reg52.h>

typedef unsigned char uchar;
typedef unsigned int uint;

void SendStr(uchar *s);
void InitUART();//初始化通用异步收发传输器

void main()
{
        InitUART();
        SendStr("UART test,dmc");
        ES = 1;//串口中断允许位,ES=1允许
        while(1)
        {
        }
}

void SendByte(uchar dat)
{
        SBUF = dat;
        while(!TI);
        TI=0;
}

void SendStr(uchar *s)
{
        while(*s != '\0')
        {
                SendByte(*s);
                s++;
        }               
}

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

void UART_SER() interrupt 4
{
        uchar temp;
        if(RI)
        {
                RI = 0;
                temp = SBUF;
                P1 = temp;
                SBUF = temp;
        }
        if(TI)
        {
                TI = 0;
        }
}


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

使用道具 举报

来自 3#
ID:123289 发表于 2019-5-20 08:29 | 只看该作者
本帖最后由 yzwzfyz 于 2019-5-20 12:00 编辑

ES只是控制中断是否允许,但它不能控制串口是否工作,只要串口是工作的(这是硬件决定的),则TI就会在工作过程中被置1,它与ES无关。
但TI=1 之后是会否引起中断却受控于ES。
回复

使用道具 举报

来自 6#
ID:517466 发表于 2019-5-30 19:55 | 只看该作者
第一个串口调试软件接受不了汉字,估计是这个程序本身就没有考虑接受的数据中包含汉字数据。对串口而言,收发的都是单纯的16进制数据,他并不知道这个数据是指令、数据;还是字母、汉字。需要两边的程序代码解析。加入解析功能的,自然会显示汉字。这就好比有些没有汉字字库的LCD12864,你发给它汉字,因为不能识别,是显示不了的。有汉字字库的,收到特殊数据的,汉字的两个字节数据,16进制值>255,根据编码值,去字库里找匹配的点阵数据,显示到液晶上。也就是说,液晶上显示的字符,都是通过计算编码值,找到对应的点阵数据,Bit位上有值的,那个点就显示,所有该现实的点都显示出来,就形成了字母、数字,汉字。

评分

参与人数 1黑币 +60 收起 理由
admin + 60 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

沙发
ID:328014 发表于 2019-5-20 01:51 | 只看该作者
汉字其实就是2个字节的数据而已
回复

使用道具 举报

地板
ID:523537 发表于 2019-5-30 15:51 | 只看该作者
yzwzfyz 发表于 2019-5-20 08:29
ES只是控制中断是否允许,但它不能控制串口是否工作,只要串口是工作的(这是硬件决定的),则TI就会在工作 ...

好的,我明白了。还有就是汉字为什么第一个串口调试软件发送不了呢?
回复

使用道具 举报

5#
ID:517466 发表于 2019-5-30 19:47 | 只看该作者
TI是数据发送完成后产生的标志,对51单片机,当你向SBUF发送完一字节数据,单片机会自动通过TX管脚向外发送数据,发送完成后,SBUF数据清空,同时使TI=1,表示数据发送完成,好让你继续发送下一个字节。
回复

使用道具 举报

7#
ID:523537 发表于 2019-6-7 05:51 | 只看该作者
suncat0504 发表于 2019-5-30 19:55
第一个串口调试软件接受不了汉字,估计是这个程序本身就没有考虑接受的数据中包含汉字数据。对串口而言,收 ...

哦哦,好的我明白了,多谢大佬指点
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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