找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1906|回復(fù): 7
收起左側(cè)

按鍵按下,單片機(jī)定時器就死了?

[復(fù)制鏈接]
ID:302293 發(fā)表于 2023-6-14 08:23 | 顯示全部樓層 |閱讀模式
/********************************************************************
* 文件名  : 獨立按鍵.c
* 描述    :  該程序?qū)崿F(xiàn)獨立按鍵去控制 LED燈 的亮滅,并講訴了對按鍵的處理方法。
                         獨立按鍵相應(yīng)的IO口平時為高電平,一旦按鍵按下,單片機(jī)便檢測到低電平。
                         按下P3.2,P0.0口對應(yīng)的LED亮滅交替變化。
                         按下P3.3,P0.1口對應(yīng)的LED亮滅交替變化。
                         按下P3.4,P0.2口對應(yīng)的LED亮滅交替變化。
* 創(chuàng)建人  : 東流,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()
* 功能 : 實現(xiàn)按鍵功能,當(dāng)按鍵按下時,相應(yīng)的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秒再進(jìn)行下次按鍵的檢測
        }        
}

/*------------------------------------------------
                    串口初始化
------------------------------------------------*/
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開始計數(shù)一直到65535溢出
TL0=0x0c;
ET0=1;           //定時器中斷打開
TR0=1;           //定時器開關(guān)打開
EA=1;            //總中斷打開
}
void timer1(void) interrupt 1
  {

     TH0=0x00;                  //重新賦值
     TL0=0x00;                  

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


}


/********************************************************************
* 名稱 : Main()
* 功能 : 實現(xiàn)按鍵控制LED的亮滅
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Main(void)
{
        Init_Timer1();
        InitUART();
        while(1)
        {
                 KEY();
        }
}

回復(fù)

使用道具 舉報

ID:1080935 發(fā)表于 2023-6-14 09:02 | 顯示全部樓層
原因是開了串口中斷,解決方法:
1、關(guān)閉串口串口中斷,ES=0;因為你目前沒用到串口中斷。
2、寫個串口中斷函數(shù),可以是空的。void USART_IRQ(void) interrupt 4 { }
回復(fù)

使用道具 舉報

ID:302293 發(fā)表于 2023-6-14 09:11 | 顯示全部樓層
LaoYuTou 發(fā)表于 2023-6-14 09:02
原因是開了串口中斷,解決方法:
1、關(guān)閉串口串口中斷,ES=0;因為你目前沒用到串口中斷。
2、寫個串口中 ...

好的,謝謝
回復(fù)

使用道具 舉報

ID:302293 發(fā)表于 2023-6-14 09:12 | 顯示全部樓層
LaoYuTou 發(fā)表于 2023-6-14 09:02
原因是開了串口中斷,解決方法:
1、關(guān)閉串口串口中斷,ES=0;因為你目前沒用到串口中斷。
2、寫個串口中 ...

   關(guān)閉串口ES,一樣是死機(jī)
回復(fù)

使用道具 舉報

ID:302293 發(fā)表于 2023-6-14 09:18 | 顯示全部樓層
LaoYuTou 發(fā)表于 2023-6-14 09:02
原因是開了串口中斷,解決方法:
1、關(guān)閉串口串口中斷,ES=0;因為你目前沒用到串口中斷。
2、寫個串口中 ...

為什么進(jìn)不了串口中斷就會死機(jī)呢?
回復(fù)

使用道具 舉報

ID:161164 發(fā)表于 2023-6-14 09:42 | 顯示全部樓層
2023-06-14_093900.png
打開了串口中斷,但又沒有串口中斷函數(shù)
于是在按鍵之后,SBUF = ...
程序就跑飛了
182行改為ES = 0;或注釋掉就可以了

回復(fù)

使用道具 舉報

ID:220661 發(fā)表于 2023-6-14 10:25 | 顯示全部樓層
重新賦值都是0?

     TH0=0x00;                  //重新賦值
     TL0=0x00;  
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2023-6-14 12:35 | 顯示全部樓層
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. #define u8 unsigned char
  5. #define u16 unsigned int
  6. sbit KEY1 = P1^2;   
  7. sbit KEY2 = P1^3;
  8. sbit KEY3 = P1^4;
  9. sbit LED1 = P0^0;
  10. sbit LED2 = P0^1;
  11. sbit LED3 = P0^2;
  12. sfr P4 =   0xe8;
  13. sfr AUXR = 0x8E;
  14. sbit P4_0 = P4^0;

  15. u16 count;  
  16. uchar cost;      


  17. void KEY();
  18. /********************************************************************
  19. * 名稱 : Delay()
  20. * 功能 : 延時,延時時間為 1ms * del(1T)
  21. * 輸入 : del
  22. * 輸出 : 無
  23. ***********************************************************************/
  24. void Delay(uint del)
  25. {
  26.         uint i,j;
  27.         for(i=0; i<del; i++)
  28.                 for(j=0; j<1100; j++);   

  29. }

  30. /********************************************************************
  31. * 名稱 : Delay()
  32. * 功能 : 實現(xiàn)按鍵功能,當(dāng)按鍵按下時,相應(yīng)的LED亮滅交替
  33. * 輸入 : 無
  34. * 輸出 : 無
  35. ***********************************************************************/
  36. void KEY()
  37. {        
  38.         if(!KEY1||!KEY2||!KEY3)      
  39.         {
  40.                 Delay(20);  //20毫秒軟件防抖
  41.                 if(!KEY1 || !KEY2 || !KEY3)      
  42.                 {
  43.                         if(!KEY1)
  44.                         {
  45.                                 LED1 = ~LED1;                //LED顯示取反        
  46.                                 ++cost;
  47.                                 SBUF= cost;      
  48.                                 while(!TI);TI=0;
  49.                         }
  50.                         if(!KEY2)
  51.                         {                       
  52.                                 LED2 = ~LED2;
  53.                                 --cost;
  54.                                 SBUF= cost;
  55.                                 while(!TI);TI=0;
  56.                         }
  57.                         if(!KEY3)
  58.                         {                       
  59.                                 LED3 = ~LED3;
  60.                         }
  61.                         while(!KEY1||!KEY2||!KEY3);                        //延時0.5秒再進(jìn)行下次按鍵的檢測
  62.                 }      
  63.         }
  64. }

  65. /*------------------------------------------------
  66.                     串口初始化
  67. ------------------------------------------------*/
  68. void UartInit(void)                //9600bps@11.0592MHz
  69. {
  70.         SCON = 0x50;                //8位數(shù)據(jù),可變波特率
  71.         AUXR &= 0xBF;                //定時器時鐘12T模式
  72.         AUXR &= 0xFE;                //串口1選擇定時器1為波特率發(fā)生器
  73.         TMOD &= 0x0F;                //設(shè)置定時器模式
  74.         TL1 = 0xE8;                //設(shè)置定時初始值
  75.         TH1 = 0xFF;                //設(shè)置定時初始值
  76.         ET1 = 0;                //禁止定時器1中斷
  77.         TR1 = 1;                //定時器1開始計時
  78. }                          
  79. void Timer0Init(void)                //50毫秒@11.0592MHz
  80. {
  81.         AUXR &= 0x7F;                //定時器時鐘12T模式
  82.         TMOD &= 0xF0;                //設(shè)置定時器模式
  83.         TMOD |= 0x01;                //設(shè)置定時器模式
  84.         TL0 = 0x00;                //設(shè)置定時初始值
  85.         TH0 = 0x4C;                //設(shè)置定時初始值
  86.         TF0 = 0;                //清除TF0標(biāo)志
  87.         TR0=1;           //定時器開關(guān)打開
  88.         ET0=1;           //定時器中斷打開
  89.         EA=1;            //總中斷打開
  90. }

  91. void timer1(void) interrupt 1
  92. {
  93.         TH0 = 0x4C;                //重新賦值                  
  94.         TL0 = 0x00;
  95.         count++;
  96.         if(count>=10)
  97.         {
  98.                 count=0;
  99.                 P4_0 =!P4_0;
  100.         }
  101. }


  102. /********************************************************************
  103. * 名稱 : Main()
  104. * 功能 : 實現(xiàn)按鍵控制LED的亮滅
  105. * 輸入 : 無
  106. * 輸出 : 無
  107. ***********************************************************************/
  108. void main(void)
  109. {
  110.         Timer0Init();
  111.         UartInit();
  112.         while(1)
  113.         {
  114.                 KEY();
  115.         }
  116. }
復(fù)制代碼
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表