打印
[51单片机]

51串口初始化程序活见鬼,请帮分析

[复制链接]
1794|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hualiming025|  楼主 | 2015-7-7 22:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    且看下面这个最简单的51串口发送程序。单片机是AT89S51,留意其中红色字体那一句。现象是如果屏蔽了这一句,单片机就会不闪灯,不发数据,什么反应也没有。如果不屏蔽这一句,单片机就会正常闪灯且发送数据。但不管ET1        =1还是ET1=0,单片机都能正常,是不是很奇怪啊?此外,这个ET1是控制TIMER1中断的,和串口有什么关系啊?凭什么屏蔽了,串口就不好使了?


#include<reg51.h>
#include<intrins.h>

sbit        LED                =P2^7;

void delay(unsigned int n)
{
        while(n)
        {
                n--;       
        }               
}
void uart_init()
{
        TMOD        = 0x20;                                  //定时器1定时方式2,自动重装
        TH1         = 0XFD;                                        //定时器初值。11.0592M,波特率9600
        TL1         = 0XFD;
        TR1         = 1;                                         //定时器开始计时
       
        SCON         = 0x50;                                  //串口方式1,允许接收
        //PCON         = 0x80;                                 //波特率加倍控制,SMOD=1,加倍速率

          RI                = 0;                                      //清接收中断标志
          TI                 = 0;                                      //清发送中断标志

        EA                =1;                                           //开总中断
        ES                =1;                                           //开启串口中断
//        ET1                =1;        //就这句有鬼的,如果这句屏蔽,就会灯不闪,串口不发送数据,反之不屏蔽就既闪灯又发数据
}
void uart_send_byte(unsigned char dt)
{  
    SBUF        =dt;                             //发送数据
        while(!TI);
    TI                =0;                                         //清零,TI为发送中断标志
}
void com_interrupt(void) interrupt 4 using 3
{
          RI                = 0;                                      //清接收中断标志
          TI                 = 0;                                      //清发送中断标志

}
void main()
{

        uart_init();


        while(1)
        {
                delay(1000);
                LED=1;
                delay(50000);
                uart_send_byte(0x55);
                LED=0;
        }
}

相关帖子

沙发
dirtwillfly| | 2015-7-7 22:58 | 只看该作者
et1是定时器1中断使能位吧

使用特权

评论回复
板凳
阿南| | 2015-7-7 23:02 | 只看该作者
看一反汇编代码,有时可能是编译器的原因。
现在波特率是由定时器1产生,而ET1是定时器1溢出中断屏蔽位,不知是否有影响。
可以用keil软件仿真下

使用特权

评论回复
地板
ayb_ice| | 2015-7-8 07:58 | 只看该作者
这有什么奇怪

既然全能了T1中断,当然要有相应的中断服务程序,

T1当波特率发生器根本不需要中断,那个中断频率也很高的

使用特权

评论回复
5
hualiming025|  楼主 | 2015-7-8 08:43 | 只看该作者
ayb_ice 发表于 2015-7-8 07:58
这有什么奇怪

既然全能了T1中断,当然要有相应的中断服务程序,

说的有道理,但是ET1=x这句如果去掉,单片机就好像掉入陷阱一样不工作,什么反应都没有。如果添上这句,不管ET1=0,还是ET1=1,都能正常闪灯发数据。为什么啊?

使用特权

评论回复
6
yhn1973| | 2015-7-8 08:44 | 只看该作者
当你TI用程序判断时,中断程序中就不要再处理它,否则会冲突,导致死循环

使用特权

评论回复
7
ningling_21| | 2015-7-8 09:09 | 只看该作者
hualiming025 发表于 2015-7-8 08:43
说的有道理,但是ET1=x这句如果去掉,单片机就好像掉入陷阱一样不工作,什么反应都没有。如果添上这句, ...

ET1是0还是1 ,跟串口发数据没关系

使用特权

评论回复
8
ayb_ice| | 2015-7-8 09:21 | 只看该作者
hualiming025 发表于 2015-7-8 08:43
说的有道理,但是ET1=x这句如果去掉,单片机就好像掉入陷阱一样不工作,什么反应都没有。如果添上这句, ...

类似的问题又犯了

既然打开了串口中断,说明是通过中断方式处理,发送数据的时候又使用查询方式,能不乱套吗

修改如下
#pragma disable
void uart_send_byte(unsigned char dt)
{  
    SBUF        =dt;                             //发送数据
        while(!TI);
    TI                =0;                                         //清零,TI为发送中断标志
}

使用特权

评论回复
9
hualiming025|  楼主 | 2015-7-8 09:35 | 只看该作者
ayb_ice 发表于 2015-7-8 09:21
类似的问题又犯了

既然打开了串口中断,说明是通过中断方式处理,发送数据的时候又使用查询方式,能不乱 ...

有道理,很有帮助,马上试试看

使用特权

评论回复
10
hualiming025|  楼主 | 2015-7-8 09:42 | 只看该作者
ayb_ice 发表于 2015-7-8 09:21
类似的问题又犯了

既然打开了串口中断,说明是通过中断方式处理,发送数据的时候又使用查询方式,能不乱 ...

但为什么添加一句ET1=x,就可以工作了呢?什么道理?

使用特权

评论回复
11
ningling_21| | 2015-7-8 09:51 | 只看该作者
hualiming025 发表于 2015-7-8 09:42
但为什么添加一句ET1=x,就可以工作了呢?什么道理?

都是程序逻辑混乱惹的祸

发送程序该成如下,就和ET1 无关了

void uart_send_byte(unsigned char dt)
{  
        ES=0;
    SBUF        =dt;                             //发送数据
        while(!TI);
    TI                =0;   
        ES=1;                                      //清零,TI为发送中断标志
}

使用特权

评论回复
12
ayb_ice| | 2015-7-8 09:59 | 只看该作者
hualiming025 发表于 2015-7-8 09:42
但为什么添加一句ET1=x,就可以工作了呢?什么道理?

正确的结果只有一个,
错误的现象千千万,我没有时间分析这些错误的原因

使用特权

评论回复
13
gx_huang| | 2015-7-8 13:03 | 只看该作者
错误太多,中断是怎么运行的,估计LZ都不明白,不见鬼才见鬼了。

使用特权

评论回复
14
cxsgo| | 2015-7-8 13:45 | 只看该作者
应该是少一个定时器的中断程序吧,定时器中断使能了,到哪里去处理中断程序呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

114

帖子

2

粉丝