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
0.5毫秒/(11.0592MHz/12)=0.5/1.085069=461,65536-461=65075=FE33
0.05=FFCD
*/

之上采取一些措施经过实测确实如我同事说的要精确很难,经过一段单片机的实践,发现定时器受程序中其他延时不能及时响应中断的影响极大,这就是计时不准确的因素,若能在各种延时中采取及时跳出延时或可能提高定时精度。



  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值