求教高手看下我这个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);
}
}
此帖出自
小平头技术问答
我这个项目倒是不需要精准计时,主要就是这个开关信号个数采集;老是多采,头疼。
1s内计数最多40次。
一周热门 更多>