找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机检测独立按键是否按下代码不对吗?

[复制链接]
跳转到指定楼层
楼主
ID:1038888 发表于 2022-7-8 21:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求走过路过的好哥哥,好姐姐,帮弟弟看看哪出问题了
单片机源程序如下:
  1. #include <reg52.h>

  2. typedef unsigned int u16;
  3. typedef unsigned char u8;

  4. sbit BEEP = P2^5;
  5. sbit KEY = P3^1;
  6. sbit LED = P2^0;


  7. //延时函数
  8. void delay_10us(u16 ten_us)
  9. {
  10.         while(ten_us--);
  11. }

  12. //初始化外部中断0
  13. void exti0_init()
  14. {
  15.         EX0 = 1;
  16.         IT0 = 1; //外部中断0触发方式选择下降沿
  17. }


  18. //初始化定时器
  19. void time0_init()
  20. {
  21.         TMOD |= 0x01;  //加或的目的是防止改变TOMD中已有的位数
  22.         TH0 = 0xFC;     
  23.         TL0 = 0x66;  
  24.         ET0 = 1;
  25.         TR0 = 1;
  26. }

  27. //main函数
  28. void main()
  29. {
  30.         time0_init();
  31.         exti0_init();
  32.         EA = 1;
  33.         while(1);
  34. }



  35. //定时器0中断函数
  36. void time0() interrupt 1
  37. {
  38.         u8 num;
  39.         num++;
  40.         TH0 = 0xFC;
  41.         TL0 = 0x66;
  42.         //if(KEY==1)
  43.         //{
  44.         //        delay_10us(1000);
  45. //                ET0=0; //关闭定时器
  46.         //        PCON = 0x02; //打开掉电模式
  47.         //        _nop_();
  48.         //        _nop_();
  49.                 //_nop_();
  50. //        }
  51.         if(num>=2000)
  52.         {
  53.         
  54.                 u16 i = 2000;
  55.                 while(i--)
  56.                 {
  57.                         BEEP = !BEEP;
  58.                         delay_10us(100);        
  59.                 }
  60.                
  61.                 //LED = 1;
  62.         }
  63. }

  64. //外部中断0函数
  65. void exti0() interrupt 0
  66. {
  67.         PCON=0; //关闭掉电模式
  68.         ET0=1; //打开定时器0
  69. }



复制代码



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

使用道具 举报

沙发
ID:94031 发表于 2022-7-9 06:40 | 只看该作者
1 中断函数里不应该加延时函数。2  想触发外中断,按键应接P3^2,而不是P3^1。
回复

使用道具 举报

板凳
ID:1023753 发表于 2022-7-9 07:59 | 只看该作者
你按键注释掉了  
回复

使用道具 举报

地板
ID:332444 发表于 2022-7-9 08:02 | 只看该作者
检测独立按键代码:if(KEY==0)...
回复

使用道具 举报

5#
ID:213173 发表于 2022-7-9 10:14 | 只看该作者
给你改了,你试试。
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. typedef unsigned int u16;
  4. typedef unsigned char u8;

  5. sbit BEEP = P2^5;
  6. sbit KEY = P3^1;
  7. sbit LED = P2^0;

  8. u16 num;

  9. //延时函数
  10. /*
  11. void delay_10us(u16 ten_us)
  12. {
  13.         while(ten_us--);
  14. }*/

  15. //初始化外部中断0
  16. void exti0_init()
  17. {
  18.         EX0 = 1;
  19.         IT0 = 1; //外部中断0触发方式选择下降沿
  20. }

  21. //初始化定时器
  22. void time0_init()
  23. {
  24.         TMOD |= 0x01;  //加或的目的是防止改变TOMD中已有的位数
  25.         TH0 = 0xFC;     
  26.         TL0 = 0x66;  
  27.         TR0 = 1;
  28.         ET0 = 1;
  29.         EA = 1;
  30. }

  31. void main()
  32. {
  33.         time0_init();
  34.         exti0_init();
  35.         LED=0;//LED亮
  36.         while(1)
  37.         {
  38.                 if(!KEY)//启动掉电模式
  39.                 {
  40.                         LED=1;//LED熄
  41.                         _nop_();
  42.                         _nop_();
  43.                         PCON = 0x02; //进入掉电模式
  44.                         _nop_();
  45.                         _nop_();
  46.                 }               
  47.         }
  48. }

  49. //定时器0中断函数
  50. void time0() interrupt 1
  51. {
  52.         TH0 = 0xFC;
  53.         TL0 = 0x66;

  54.         BEEP = ~BEEP;//无源蜂鸣器响
  55.         num++;
  56.         if(num>=1000)//1秒
  57.         {
  58.                 num=0;
  59.                 BEEP = 1;//蜂鸣器复位
  60.                 TR0 = 0;//关闭定时器
  61.         }
  62. }

  63. //外部中断0函数
  64. void exint0() interrupt 0
  65. {
  66. //        PCON=0; //关闭掉电模式
  67.         TR0 =1; //打开定时器0
  68.         LED=0;  //LED亮
  69. }
复制代码
回复

使用道具 举报

6#
ID:1038888 发表于 2022-7-10 16:28 | 只看该作者
xuyaqi 发表于 2022-7-9 06:40
1 中断函数里不应该加延时函数。2  想触发外中断,按键应接P3^2,而不是P3^1。

粗心了,没注意到触发键的问题,谢谢师傅提醒,请问为什么中断函数里面不能加延时函数呀
回复

使用道具 举报

7#
ID:59202 发表于 2022-7-10 18:38 | 只看该作者
不是不能加延时程序,只是中断函数的原则是尽量精简,把运行时间尽量交到主程序,如果中断函数中加入了较长的延时,那么主程序运行的时间就会大大减少,造成系统运行速度慢
回复

使用道具 举报

8#
ID:1038888 发表于 2022-7-10 21:49 | 只看该作者
xxxevery 发表于 2022-7-10 18:38
不是不能加延时程序,只是中断函数的原则是尽量精简,把运行时间尽量交到主程序,如果中断函数中加入了较长 ...

好嘞,明白了,感谢师傅
回复

使用道具 举报

9#
ID:1013784 发表于 2022-7-11 01:56 | 只看该作者
你的外部中断设置的引脚不对
回复

使用道具 举报

10#
ID:1009217 发表于 2022-7-14 23:22 | 只看该作者
SRC51 发表于 2022-7-10 16:28
粗心了,没注意到触发键的问题,谢谢师傅提醒,请问为什么中断函数里面不能加延时函数呀

中断,就像你打游戏一样有主线程和子线程,而中断就是子线程,你要是花太多时间在你的子线程上面,主线程就会出问题啊,中断也还分定时器中断和外部中断和串口中断,定义那些你可以去网上查查
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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