找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1512|回复: 11
收起左侧

51单片机定时器0,串口中断中断有冲突咋办?

[复制链接]
ID:302293 发表于 2023-6-13 16:04 | 显示全部楼层 |阅读模式
   51开启定时器0,串口中断,有冲突,怎么解决?
回复

使用道具 举报

ID:789121 发表于 2023-6-13 16:12 | 显示全部楼层
我记得是有优先级的吧
回复

使用道具 举报

ID:94031 发表于 2023-6-13 16:24 | 显示全部楼层
具体要看什么冲突,中断处理时间要短,不然会影响响应别的中断。
回复

使用道具 举报

ID:1080935 发表于 2023-6-13 16:30 | 显示全部楼层
有优先级的,串口自然优先级最低,可以通过寄存器设置变高,根据需要设置优先级。另外中断中处理的程序尽可能的少。
回复

使用道具 举报

ID:302293 发表于 2023-6-13 16:44 | 显示全部楼层
LaoYuTou 发表于 2023-6-13 16:30
有优先级的,串口自然优先级最低,可以通过寄存器设置变高,根据需要设置优先级。另外中断中处理的程序尽可 ...

定时亮灭LED,串口发射数据,按键按下定时器就停止了,是什么问题?
回复

使用道具 举报

ID:155507 发表于 2023-6-13 16:59 | 显示全部楼层
sr861126 发表于 2023-6-13 16:44
定时亮灭LED,串口发射数据,按键按下定时器就停止了,是什么问题?

你的程序有问题。

把你的代码、错误或提示发上来,大家才能帮你,不然就是你猜我猜大家猜了。。。
回复

使用道具 举报

ID:1083855 发表于 2023-6-13 18:03 | 显示全部楼层
看看优先级和外部是否有统计程序进行
回复

使用道具 举报

ID:517951 发表于 2023-6-14 07:46 | 显示全部楼层
串口的波特率降低一点, 不要那么快进串口中断. time0的中断优先级高于串口中断,优先处理定时器的任务.
回复

使用道具 举报

ID:302293 发表于 2023-6-14 07:47 | 显示全部楼层
angmall 发表于 2023-6-13 16:59
你的程序有问题。

把你的代码、错误或提示发上来,大家才能帮你,不然就是你猜我猜大家猜了。。。

/********************************************************************
* 文件名  : 独立按键.c
* 描述    :  该程序实现独立按键去控制 LED灯 的亮灭,并讲诉了对按键的处理方法。
                         独立按键相应的IO口平时为高电平,一旦按键按下,单片机便检测到低电平。
                         按下P3.2,P0.0口对应的LED亮灭交替变化。
                         按下P3.3,P0.1口对应的LED亮灭交替变化。
                         按下P3.4,P0.2口对应的LED亮灭交替变化。
* 创建人  : 东流,2009年8月27日
* 版本号  : 1.0
***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
#define u8 unsigned char
#define u16 unsigned int
sbit KEY1 = P1^2;   
sbit KEY2 = P1^3;
sbit KEY3 = P1^4;
sbit LED1 = P0^0;
sbit LED2 = P0^1;
sbit LED3 = P0^2;
sfr P4 =0Xe8;
sbit P4_0 = P4^0;
static u16        count;  
char cost;       


void KEY();
/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 10ms * del
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uint del)
{
        uint i,j;
        for(i=0; i<del; i++)
        for(j=0; j<1827; j++);   

}

/********************************************************************
* 名称 : Delay()
* 功能 : 实现按键功能,当按键按下时,相应的LED亮灭交替
* 输入 : 无
* 输出 : 无
***********************************************************************/
void KEY()
{

//        Delay(2);         
        if(KEY1==0 || KEY2==0 || KEY3==0)       
        {
                Delay(5);                            //20毫秒软件防抖
                if(KEY1 == 0)
                {
                Delay(5);
               
//        while(!KEY1);       
                 P4_0  = 0 ;                //LED显示取反
                         Delay(1);           
                 ++cost;             SBUF= cost;       
        while(!TI);TI=0;
       
                }
                       

if(KEY2 == 0)
                {                       
                P4_0 = 1;
                --cost;
                         SBUF= cost;
                           while(!TI);TI=0;
                }
                else
                {                       
                        LED3 = !LED3;
                }
                Delay(50);                        //延时0.5秒再进行下次按键的检测
        }       
}

/*------------------------------------------------
                    串口初始化
------------------------------------------------*/
void InitUART  (void)
{

    SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
//              // TMOD: timer 1, mode 2, 8-bit 重装
    TMOD |= 0x21;    //T1方式2、T0方式1
        TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
    TL1 = 0xFD;      //波特率
        TR1   = 1;                  // TR1:  timer 1 打开                        
    IE |= 0x92;      //开启中断
        EA    = 1;                  //打开总中断
    ES    = 1;                  //打开串口中断
}                           
void Init_Timer1(void)
{
TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=0x0c;              //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
TL0=0x0c;
ET0=1;           //定时器中断打开
TR0=1;           //定时器开关打开
EA=1;            //总中断打开
}
void timer1(void) interrupt 1
  {
   
     TH0=0x00;                  //重新赋值
     TL0=0x00;                  

     if(count>10)
         {
         
            count=0;
                  P4_0 =!P4_0 ;
         }
count++;


}


/********************************************************************
* 名称 : Main()
* 功能 : 实现按键控制LED的亮灭
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
        Init_Timer1();
        InitUART();
        while(1)
        {
                 KEY();
        }
}
回复

使用道具 举报

ID:87000 发表于 2023-6-14 09:04 | 显示全部楼层
void timer1(void) interrupt 1
  {
   
     TH0=0x00;                  //重新赋值
     TL0=0x00;                  

     if(count>10)
         {
         
            count=0;
                  P4_0 =!P4_0 ;
         }
count++;


}
你确定重新赋值为0???
回复

使用道具 举报

ID:123289 发表于 2023-6-14 16:10 | 显示全部楼层
当你有了时序观念,并且真正地理解中断及其响应条件、方式后,就不会问这个问题了。
回复

使用道具 举报

ID:624769 发表于 2023-6-14 19:42 | 显示全部楼层
sr861126 发表于 2023-6-14 07:47
/********************************************************************
* 文件名  : 独立按键.c
*  ...

你串口的中断函数呢?? 开了中断,没有函数,不跑飞就是奇迹。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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