找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1009|回复: 7
收起左侧

51单片机控制数码管显示(中断问题)

[复制链接]
ID:1061677 发表于 2023-1-29 15:00 | 显示全部楼层 |阅读模式
问题是这样的。
我希望用P3.2和P3.3引脚控制两个弹性按键,实现秒表功能如下:
1.当P3.2引脚变为低电平(即有键按下),暂停计数;再次按下时,继续计数;
2.在任何时候P3.3引脚变为低电平,则从0开始计数。
我写了外部中断0和外部中断1的函数,但是我不知道这两个函数为什么不起作用,想问问大家是这个程序出问题了吗?
还是说我还需要在主程序中加上if(P3^2==0)……if(P3^3==0)?但我记得中断函数不需要引用即可生效的。
还望大佬指点迷津!
单片机源程序如下:
  1. #include<reg51.h>
  2. //00~60秒的简易秒表设计,两个静态数码管,定时器采用查询方式
  3. #include<intrins.h>
  4. unsigned char count=0;
  5. unsigned char miao=56;        //秒计数器
  6. bit b=0; //暂停/继续标志位,b=0暂停,b=1继续
  7. void int_0() interrupt 0  //外部中断0的中断函数,中断类型号为0       
  8. {
  9.         if(b==0)
  10.         {
  11.                 TR1=0;
  12.                 b=1;   //暂停计数
  13.         }
  14.         else
  15.         {
  16.                 b=0;
  17.                 TR1=1;         //继续计数
  18.         }
  19. }
  20. void int_1() interrupt 2  //外部中断1的中断函数,中断类型号为2
  21. {
  22.         miao=0;
  23.         count=0;                                         //清零并开始计数
  24.         TH1=(65536-50000)/256;
  25.     TL1=(65536-50000)%256;
  26.     TR1=1;
  27. }
  28. void delay1s()
  29. {
  30.         unsigned char i;
  31.     for(i=0;i<20;i++)
  32.     {
  33.                 TH1=(65536-50000)/256;
  34.         TL1=(65536-50000)%256;
  35.         TR1=1;
  36.         while(!TF1);
  37.         TF1=0;
  38.     }
  39. }
  40. void disp(unsigned char i)
  41. {
  42.     unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};   //定义0~9显示码,共阳极数码管
  43.         P1=led[i/10];        //显示i高位
  44.         P2=led[i%10];        //显示i低位
  45. }
  46.                        
  47. void main()                //主函数
  48. {
  49.         TMOD=0x10;
  50.     TH1=(65536-50000)/256;
  51.     TL1=(65536-50000)%256;
  52.     ET1=1;
  53.         EX0=1;
  54.         IT0=1;
  55.         EX1=1;
  56.         IT1=1;
  57.     EA=1;
  58.     TR1=1;
  59.     while(1)
  60.     {
  61.                 disp(miao);
  62.         delay1s();
  63.         miao++;
  64.         if(miao==60)
  65.                 {
  66.                         miao=0;               
  67.         }
  68.         }
  69. }
复制代码

简易秒表.zip

104.99 KB, 下载次数: 4

回复

使用道具 举报

ID:146878 发表于 2023-1-31 12:36 | 显示全部楼层
按键要做消抖处理。
回复

使用道具 举报

ID:1061677 发表于 2023-2-1 13:12 | 显示全部楼层
pdwdzz 发表于 2023-1-31 12:36
按键要做消抖处理。

但是我用的是51单片机,P3.2和P3.2,也就是外部中断0和外部中断1。写了外部中断0和外部中断1的函数难道还需要按键消抖吗?
回复

使用道具 举报

ID:146878 发表于 2023-2-1 14:51 | 显示全部楼层
百二秦关终属我 发表于 2023-2-1 13:12
但是我用的是51单片机,P3.2和P3.2,也就是外部中断0和外部中断1。写了外部中断0和外部中断1的函数难道还 ...

不消抖,那按下时可能多次进中断。比如按下时因抖动进入了两次中断。结果时暂停又启动。
回复

使用道具 举报

ID:146878 发表于 2023-2-1 14:56 | 显示全部楼层
百二秦关终属我 发表于 2023-2-1 13:12
但是我用的是51单片机,P3.2和P3.2,也就是外部中断0和外部中断1。写了外部中断0和外部中断1的函数难道还 ...

另外我说的指示你程序中存在的一个问题。我没细看,应该导致没效果还有其他原因。因为指示消抖的原因,那你的程序应该有一半概率能在正常。
回复

使用道具 举报

ID:1061677 发表于 2023-2-2 12:39 | 显示全部楼层
pdwdzz 发表于 2023-2-1 14:56
另外我说的指示你程序中存在的一个问题。我没细看,应该导致没效果还有其他原因。因为指示消抖的原因,那 ...

我按照你的说法在主函数中加了消抖,可是依然无用,我想了想,大抵是中断函数有问题。
回复

使用道具 举报

ID:1061677 发表于 2023-2-2 13:43 | 显示全部楼层
pdwdzz 发表于 2023-2-1 14:56
另外我说的指示你程序中存在的一个问题。我没细看,应该导致没效果还有其他原因。因为指示消抖的原因,那 ...

对了,我想问一下,是不是如果定时器溢出采用查询方式,那么INT0和INT1用中断函数来写就是无效的?
而如果要用到INTO和INT1的话,那定时器溢出必须使用中断的形式。是这样吗?
回复

使用道具 举报

ID:409878 发表于 2023-2-20 16:33 | 显示全部楼层
定时器没打开中断,没有起作用。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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