久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1626|回復: 4
打印 上一主題 下一主題
收起左側

單片機2個定時器開啟,串口中斷進不了是哪里占用了?

[復制鏈接]
跳轉到指定樓層
樓主
ID:302293 發表于 2023-7-13 10:48 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
/********************************************************************
* 文件名  : 獨立按鍵.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>
#include"lop.h"
#define uchar unsigned char
#define uint  unsigned int
#define u8 unsigned char
#define u16 unsigned int
typedef u8 a;
sbit KEY1 = P1^2;   
sbit KEY2 = P1^3;
sbit KEY3 = P1^4;
sbit LED1 = P0^0;
sbit LED2 = P0^1;
sbit LED3 = P0^2;
sbit LED5 = P1^0;
sfr P4 =0Xe8;
sbit P4_0 = P4^0;
static u16        count;  
char cost;        
bit lixc=1;
sfr WDT_CONTR=0xe1;         //1110 0001
//extern enu;
u8 cmd;
void KEY();

typedef struct
{

u8 i;
u8 *p;


}enu;

enu number;


/********************************************************************
* 名稱 : 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()
{
         
          a i;
         number.i=0;
//        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秒再進行下次按鍵的檢測
           if(cost>=3)
                {
                   lixc=0;        P4_0=1;
                }
           else
                 lixc=1;
        
        }        
}

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

    SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
//              // TMOD: timer 1, mode 2, 8-bit 重裝
    TMOD |= 0x21;
        TH1   = 0xFD;               // TH1:  重裝值 9600 波特率 晶振 11.0592MHz  
    TL1 = 0xFD;      //波特率
        TR1   = 1;                  // TR1:  timer 1 打開                        
    IE |= 0x92;      //開啟中斷
        EA    = 1;                  //打開總中斷
    ES    = 1;                  //打開串口中斷
//  SM0=0;
//        SM1=1;      //串口方式1         
//    REN=1;      //允許接收   
//    PCON=0x00;  //關倍頻





}                           
void Init_Timer1(void)
{
// TMOD |= 0x01;          //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
// TH0=0x0c;              //給定初值,這里使用定時器最大值從0開始計數一直到65535溢出
// TL0=0x0c;
// ET0=1;           //定時器中斷打開
// TR0=1;           //定時器開關打開
// EA=1;            //總中斷打開

    TMOD &= 0xf0;                        //定時器0
    TMOD |= 0x01;
    TH0  = (65536-2000)/256; //2ms溢出
    TL0  = (65536-2000)%256;
}
void Init_Timer2(void)
{
// TMOD=0x21;  //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
TH1=(65536-50000)/256; //給TH1和初初值,由15536開始計數,到65535溢出
TL1=(65536-50000)%256; //外部晶振為12MHz,對應的延時時間為50ms
ET1=1;           //定時器中斷打開
TR1=1;           //定時器開關打開
EA=1;            //總中斷打開

}
void timer0(void) interrupt 1
  {

//     TH0=0x00;                  //重新賦值
//     TL0=0x00;                  
         TH0 = 0xDC; //10MS
          TL0 = 0x00;
     if(count>100&&lixc==1)
         {
         
            count=0;
                  P4_0 =!P4_0 ;
         }
count++;

//  if(count>=15)
//    {
//           count=0;
//           WDT_CONTR|=0x10;                  //         00010000  || 1110 0001
//        }
}
void timer1(void) interrupt 3 using 1
{
//        TH1=(65536-50000)/256; //給TH1和初初值,由15536開始計數,到65535溢出
//    TL1=(65536-50000)%256; //外部晶振為12MHz,對應的延時時間為50ms
        TH1 = 0xDC; //10MS
        TL1 = 0x00;
     if(cmd>150)
         {
         
            cmd=0;
                   LED5  =!LED5 ;
         }
cmd++;



}

void ET0_init()//定時器0初始化            
{   
    EA=1;         //打開總中斷
        TR0=1;         //打開定時器0中斷
        ET0=1;         //啟動定時器0中斷
        TH0=(65536-50000)/256;//無腦賦值 相當于50毫秒進入一次中斷函數,20次就是1秒
        TL0=(65536-50000)%256; //無腦賦值
        TMOD= 0x01;//設置定時器t0的工作方式
}
void UartInit()        //串口定時器1初始化
{
     EA=1; //打開總中斷

    TMOD|=0x21;  //設置定時器1工作方式為方式2   
          TR1=1;      //啟動定時器1  
    TH1=0xfd;            //波特率9600
    TL1=0xfd;  
    SCON=0X50;      //允許接收   
//         ES=0;
}               




void USART_IRQ(void) interrupt 4
{
          unsigned char Temp;          //定義臨時變量

   if(RI)                        //判斷是接收中斷產生
     {
          RI=0;                      //標志位清零
          Temp=SBUF;                 //讀入緩沖區的值
//          P1=Temp;                   //把值輸出到P1口,用于觀察
      SBUF=Temp;                 //把接收到的值再發回電腦端
         }
   if(TI)                        //如果是發送標志位,清零
     TI=0;
        
}
/********************************************************************
* 名稱 : Main()
* 功TMOD=0x11,轉為二進制就是00010001,即T0和T1的最低兩位均為01,工作方式為方式1--16位定時器或計數器。第三位為0,
設定T0,T1為定時器,對內部脈沖進行計數,用來折算時間。第四位也是0,說明不參考INTx引腳電平,
由內部寄存器來控制定時器的啟停。能 : 實現按鍵控制LED的亮滅
* 輸入 : 無
* 輸出 : 無

***********************************************************************/
void Main(void)
{
//        Init_Timer1();        
//        Init_Timer2();
//        InitUART();
   ET0_init();        
   UartInit();                                       
   WDT_CONTR = 0x24;
while(1)
        {
                 KEY();           
//                 WDT_CONTR = 0x24;        

        WDT_CONTR|=0x10;
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:57657 發表于 2023-7-13 22:13 | 只看該作者
ES    = 1;                  //打開串口中斷
PS =1;     //串口中斷高優先級
//  SM0=0;
回復

使用道具 舉報

板凳
ID:1085441 發表于 2023-7-14 00:20 | 只看該作者
盡量避免同時開幾個中斷,否則會出一些莫名其妙的問題。建議中庸一個定時器中斷,其他用查詢。
回復

使用道具 舉報

地板
ID:213173 發表于 2023-7-14 06:13 | 只看該作者
定時器1用做串口波特率發生器后不可以同時再用作定時器1中斷!
回復

使用道具 舉報

5#
ID:636210 發表于 2023-7-14 07:58 | 只看該作者
串口與定時1在時間上重疊上,都用定時器1。這個定時中斷沒處理好,再好好研究串口與定時1同時用可能造成的時序問題。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美在线视频不卡 | 国产福利精品一区 | 免费看a | 最新中文字幕在线播放 | 国产精品综合视频 | 91久久国产综合久久 | 国产九九精品 | 久久精品一区 | av中文字幕在线播放 | 亚洲精品免费在线观看 | 欧美a v在线 | 国产91精品久久久久久久网曝门 | 欧美成人激情 | 国产精品福利在线观看 | 热久色| 精品国产一区二区在线 | 99久热 | 亚洲成av人影片在线观看 | 亚洲免费在线观看 | 日韩久久综合网 | 国产精品欧美精品日韩精品 | 欧美h版 | 三级视频国产 | 欧美色成人 | 国产精品一区久久久 | 视频一区二区中文字幕日韩 | 欧美成年人视频在线观看 | 日韩在线一区二区三区 | 天天天操| 中文字幕在线精品 | 欧美视频在线免费 | www国产成人免费观看视频 | 婷婷色综合 | 日韩av中文 | 一级片av| 国产激情一区二区三区 | 日韩亚洲一区二区 | 在线观看 亚洲 | 久久av网 | 中文字幕91 | 精品一区二区av |