STC51单片机中断技术比实际多咋办

2019-03-24 17:51发布

求教高手看下我这个51中断计数问题;磁开关快速通过磁铁基本正常,慢了就会多记;程序如下。

#include<reg51.h>
#include <intrins.h>
//volatile
unsigned int count=0;
        sbit key=P3^2;
//延时函数
void delayms(unsigned int xms)
{
    unsigned int i,j;
for(i=xms;i>0;i--)        //i=xms即延时约xms毫秒
  for(j=110;j>0;j--);
}
//初始化子程序
void init()
{
key=1;
SCON=0x50; //设定串口工作方式;8位数据位,无奇偶校验;
PCON=0x00; //波特率不倍增   
TMOD=0x20; //定时器1工作于8位自动重载模式, 用于产生波特率
//ES = 1;    //串口中断 使能
TL1=0xfd;  
TH1=0xfd;  //波特率9600
TR1=1;    //定时器1中断 使能

EX0=1;    //外部中断0 使能
IT0=1;    //外部中断0触发方式 边沿触发
EA=1;      //全局中断  开启
}
//外部中断0服务函数
void ISR_KEY(void)interrupt 0 using 1
{
EX0=0;    //外部中断0 使能
delayms(10);
if(key==0)
{
count++;
}
else
count=count;
EX0=1;    //外部中断0 使能
}
//串口服务
void ComOutChar(unsigned char OutData)
{
SBUF = OutData;     //输出字符
while(!TI);        //空语句判断字符是否发完
TI = 0;           //清TI   
}
//主函数
void main()
{
init();               //初始化中断
while(1)
{
  
  if(count!=0)
  {
  ComOutChar(count);   //开始
  delayms(1);
  }
  else
  {
   count=count;
  }
  delayms(1000);
}
}

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
weizhongc
1楼-- · 2019-03-25 02:13
 精彩回答 2  元偷偷看……
ltbytyn
2楼-- · 2019-03-25 03:24
延时计时很难做到精准计时,用定时器吧
yangxf1217
3楼-- · 2019-03-25 08:26
ltbytyn 发表于 2015-9-14 12:54
延时计时很难做到精准计时,用定时器吧

我这个项目倒是不需要精准计时,主要就是这个开关信号个数采集;老是多采,头疼。
yangxf1217
4楼-- · 2019-03-25 08:35
 精彩回答 2  元偷偷看……
虚空落地
5楼-- · 2019-03-25 11:09
在中断中加延时不太好,如果有多个需要计数的管脚会丢数。
yangxf1217
6楼-- · 2019-03-25 12:13
虚空落地 发表于 2015-10-8 13:33
在中断中加延时不太好,如果有多个需要计数的管脚会丢数。

1s内计数最多40次。

一周热门 更多>