6620|3

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

51单片机串口中断与定时中断同时开启,只有定时中断好用,串口无法通讯 [复制链接]

只能实现定时器中断,无法实现串口中断发送数据,但屏蔽掉定时器中断服务子程序后串口中断就好用,求大神帮忙看看哪里出了问题。

发送端程序

#include //通用89C52头文件

sbit bz = P2^4 ; //端口定义

bit  send_ed = 1 ;

sbit LED = P1^7 ;

char fe;

//发送

/***************************************************************************/
void init()
{
                PS=1;
            TMOD=0x21;            //定时器1和2工作方式2(8位定时/计数)

            PCON=0x00;     //SMOD=0,不加倍

            SCON=0x50;     //串口工作方式1,允许接收        

            TH1=0xfd;     //定时器1设置初值,波特率9600bit/s,

            TL1=0xfd;

            TR1=1;              //启动定时器T1

            EA=1;        //打开总中断

            ES=1;        //打开串口中断
            TH0 =(65536 - 5000) / 256;  
        TL0 = (65536 - 5000)% 256;     
        ET0 = 1;  
        TR0 = 1;  
}

void fasong()
{
                        if(bz==0)
                        {
                        fe = 0;
                        }
                        else
                        {
                        fe = 1;
                        }
                        if(send_ed == 1)
                        {
                        ES=1;
                SBUF = fe;        //发送数据
                send_ed = 0;
                        ES=0;
                        }
}

void main(void)//主函数

{
          
        init();

            while(1)        //主循环

            {

        fasong();

            }

}

void ser() interrupt 4//串口发送,中断方式

{
            EA = 0;
        if(TI == 1);        //等待发送完成

            TI=0;        //清空发送标志位

                send_ed = 1;
                EA = 1;
}

        void timer0() interrupt 1  
        {  
       
        TH1 = (65536 - 5000) / 256;  
        TL1 = (65536 - 5000) % 256;  
        LED = !LED;   
        }

接收端程序

#include //通用89C52头文件


sbit bz = P1^0 ;  
char fe;
bit new_rec = 0;
sbit LED = P1^7 ;
/***************************************************************************/
void init()
{
                PS=1;
            TMOD=0x21;            //定时器1和2工作方式2(8位定时/计数)

            PCON=0x00;     //SMOD=0,不加倍

            SCON=0x50;     //串口工作方式1,允许接收        

            TH1=0xfd;     //定时器1设置初值,波特率9600bit/s,

            TL1=0xfd;

            TR1=1;              //启动定时器T1

            EA=1;        //打开总中断

//            ES=1;        //打开串口中断
            TH0 =(65536 - 5000) / 256;  
        TL0 = (65536 - 5000)% 256;     
        ET0 = 1;  
        TR0 = 1;  
}

void jieshou()
{

                   if(new_rec == 1)
                ES=1;
            fe=SBUF;        //接收数据

        new_rec = 0;
                ES=0;
                if(fe == 1)  bz = 0;
                          
        if(fe == 0)  bz = 1;

}

void main(void)//主函数

{

                init();

            while(1)        //主循环

            {
                        jieshou();

            }

}

/***************************************************************************/

void ser() interrupt 4//串口接收,中断方式

{
                EA = 0;
                if(RI == 1) //如果收到.
                  
        RI = 0;      //清除标志.
                  
            new_rec = 1;
                EA = 1;
}

/***************************************************************************/

void timer0() interrupt 1  
{  

    TH1 = (65536 - 5000) / 256;  
    TL1 = (65536 - 5000) % 256;  
    LED = !LED;        
}


此帖出自51单片机论坛

最新回复

看不懂C语言~~~~~~~~~~~~  详情 回复 发表于 2017-6-19 00:15
点赞 关注
 

回复
举报

1万

帖子

139

TA的资源

版主

沙发
 
注意中断优先级设置,同时要尽量简化中断服务程序。
此帖出自51单片机论坛
 
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 

回复

4008

帖子

0

TA的资源

版主

板凳
 
                   if(new_rec == 1)
                ES=1;
            fe=SBUF;        //接收数据
这里应该有括号

另外这里               
if(fe == 1)  bz = 0;                          
if(fe == 0)  bz = 1;
也没看明白,直接做SBUF的逻辑就行了,没必要倒来倒去。
此帖出自51单片机论坛
 
 
 

回复

54

帖子

0

TA的资源

一粒金砂(中级)

4
 
看不懂C语言~~~~~~~~~~~~
此帖出自51单片机论坛
 
个人签名qq:87401614
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表