51单片机自学--外部中断0与按钮消抖效果及4个按钮共有消抖(二例)

/**************************************************************************************
*                外部中断0与按钮消抖实验              *
实现现象:下载程序后按下s4按键可以对流水灯逐个点亮,观察按钮消抖效果。
注意事项:电路板上按钮及LED灯接法区别。                     
***************************************************************************************/
#include "reg52.h"    //此文件中定义了单片机的一些特殊功能寄存器
#include<intrins.h>
typedef unsigned int u16;   //对数据类型进行声明定义
typedef unsigned char u8;

sbit s4 = P3^2;
sbit LED1 = P1^0;

void delay10us(u16 i/*延时函数,i=1时,11.0592M晶振,执行一次US--所需6.5us进入一次函数需要11.95us*/)
{
 while(i--); 
}
void Int0Init()
{
 IT0=1;//设置INT0跳变沿出发方式(1下降沿,0低点平)
 EX0=1;//打开INT0的中断允许。 
 EA=1; //打开总中断 
}
void main()

 delay10us();          /*43728 42209计算延时函数时间*/
 Int0Init();              /* 设置外部中断0*/
 P1 = 0x7f;     /*直接使用P1口赋值给P1,点亮LED8*/
 while(1);  
}

void Int0(/*外部中断0函数*/) interrupt 0  
{
 while(s4);
 P1 = _cror_(P1,1);
 while(!s4);
 delay10us(350);       /*约0.525毫秒为最小单位,450微秒出现不可靠,由反复试验得。*/
}


单片机计时软件矫正
/*
11.0592MHz/12=921600Hz就是1秒921600次机器周期
10ms=9216次机器周期65536-9216=56320次机器周期
56320数值转16进制DC00 TH0=0XDC TL0=0X00
*/
/*24小时慢了30秒,矫正要提前30秒,30/0.05秒=600次,600次/24小时=每小时25次
 25次/60分钟=5次/12分钟=5次/12*60秒=1次/144秒=1次/2分钟24秒(24*60*60/144=600)
 144秒*20次=2880次加一次50MS即24小时提前30秒矫正,
每天可矫正为设定的50ms,10天加1次则每天可矫正5ms,依此类推.
 24小时30秒,30/.05=600次,1728000/600 =2880
 24小时31秒,31/.05=620次,1728000/620~=2787
 24小时32秒,32/.05=640次,1728000/640 =2700
通过以上调整语句位置与自动补偿,确实提高很多精度,8小时约慢1秒*/
之上的20计秒方式会消除某些补偿,因此,更改如下:
void JiShi_JiaoZheng()
{
 if(lingshi>=1728000)lingshi=0;  /*24小时补偿方式*/
 /*if(!(lingshi%20))++miao;    计秒不可放此处因为机器周期快定时周期使秒不断加*/
 if(miao>=60){miao=0;++fen;}       
 if(fen>=60){fen=0;++shi;}
 if(shi>=24)shi=0;                /*24小时3秒多,3/.05=60次,(24*60*60*20)1728000/60=28800*/
 if(Jz >= 28800){++lingshi;Jz=0;} /*未自动补偿及语句放中断中,对比23小时45分钟慢了约29秒*/
}
void ZhongDuan() interrupt 1
{
    ++lingshi;      /*把计时计算移到主函数,尽量减少中断程序运行耗时*/
 ++Jz;
 TH0+=0X4c;               /*76给定时器赋初值,定时50ms触发中断,自动补偿方式*/
 TL0+=0X00 + 2;    /*65536-46080=19456,+2为本次操作所需2次运算机器周期低八位补偿*/         
}
/*
11.0592MHz/12=921600Hz就是1秒921600次机器周期
10ms=9216次机器周期65536-9216=56320次机器周期50ms=9216*5=46080
56320数值转16进制DC00 TH0=0XDC TL0=0X00
*/



猜你喜欢

转载自blog.csdn.net/xianfajushi/article/details/80307175