找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1835|回复: 7
打印 上一主题 下一主题
收起左侧

按键按下,单片机定时器就死了?

[复制链接]
跳转到指定楼层
楼主
/********************************************************************
* 文件名  : 独立按键.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();
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1080935 发表于 2023-6-14 09:02 | 只看该作者
原因是开了串口中断,解决方法:
1、关闭串口串口中断,ES=0;因为你目前没用到串口中断。
2、写个串口中断函数,可以是空的。void USART_IRQ(void) interrupt 4 { }
回复

使用道具 举报

板凳
ID:302293 发表于 2023-6-14 09:11 | 只看该作者
LaoYuTou 发表于 2023-6-14 09:02
原因是开了串口中断,解决方法:
1、关闭串口串口中断,ES=0;因为你目前没用到串口中断。
2、写个串口中 ...

好的,谢谢
回复

使用道具 举报

地板
ID:302293 发表于 2023-6-14 09:12 | 只看该作者
LaoYuTou 发表于 2023-6-14 09:02
原因是开了串口中断,解决方法:
1、关闭串口串口中断,ES=0;因为你目前没用到串口中断。
2、写个串口中 ...

   关闭串口ES,一样是死机
回复

使用道具 举报

5#
ID:302293 发表于 2023-6-14 09:18 | 只看该作者
LaoYuTou 发表于 2023-6-14 09:02
原因是开了串口中断,解决方法:
1、关闭串口串口中断,ES=0;因为你目前没用到串口中断。
2、写个串口中 ...

为什么进不了串口中断就会死机呢?
回复

使用道具 举报

6#
ID:161164 发表于 2023-6-14 09:42 | 只看该作者

打开了串口中断,但又没有串口中断函数
于是在按键之后,SBUF = ...
程序就跑飞了
182行改为ES = 0;或注释掉就可以了

回复

使用道具 举报

7#
ID:220661 发表于 2023-6-14 10:25 | 只看该作者
重新赋值都是0?

     TH0=0x00;                  //重新赋值
     TL0=0x00;  
回复

使用道具 举报

8#
ID:213173 发表于 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. * 功能 : 实现按键功能,当按键按下时,相应的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秒再进行下次按键的检测
  62.                 }      
  63.         }
  64. }

  65. /*------------------------------------------------
  66.                     串口初始化
  67. ------------------------------------------------*/
  68. void UartInit(void)                //9600bps@11.0592MHz
  69. {
  70.         SCON = 0x50;                //8位数据,可变波特率
  71.         AUXR &= 0xBF;                //定时器时钟12T模式
  72.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  73.         TMOD &= 0x0F;                //设置定时器模式
  74.         TL1 = 0xE8;                //设置定时初始值
  75.         TH1 = 0xFF;                //设置定时初始值
  76.         ET1 = 0;                //禁止定时器1中断
  77.         TR1 = 1;                //定时器1开始计时
  78. }                          
  79. void Timer0Init(void)                //50毫秒@11.0592MHz
  80. {
  81.         AUXR &= 0x7F;                //定时器时钟12T模式
  82.         TMOD &= 0xF0;                //设置定时器模式
  83.         TMOD |= 0x01;                //设置定时器模式
  84.         TL0 = 0x00;                //设置定时初始值
  85.         TH0 = 0x4C;                //设置定时初始值
  86.         TF0 = 0;                //清除TF0标志
  87.         TR0=1;           //定时器开关打开
  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. * 功能 : 实现按键控制LED的亮灭
  105. * 输入 : 无
  106. * 输出 : 无
  107. ***********************************************************************/
  108. void main(void)
  109. {
  110.         Timer0Init();
  111.         UartInit();
  112.         while(1)
  113.         {
  114.                 KEY();
  115.         }
  116. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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