在keil中编写一个以51单片机为例的驱鸟器传感器产生的信号直接接入单片机的外部中断 1,当有鸟时内部 Bird_Count1 变量自加。通过定时器 1 定时 1000ms 中断查询 Bird_Count1 变量的数值,并与前两次 的值作对比判断是否有鸟,只有当前测得的 Bird_Count1 次数大于前一次次数加 1 和大 于前前一次次数加 1 才判断为有鸟
时间: 2024-03-17 10:43:27 浏览: 38
好的,这是一个关于51单片机的驱鸟器的程序。程序使用了外部中断和定时器中断,实现了对鸟的检测和计数。
下面是程序的主要代码:
```c
#include <reg51.h>
sbit Sensor = P3^2; // 传感器接口
sbit LED = P2^0; // LED接口
unsigned int Bird_Count1 = 0; // 鸟计数器
unsigned int Bird_Count2 = 0; // 鸟计数器
void Timer1_ISR() interrupt 3 // 定时器1中断服务程序
{
Bird_Count2 = Bird_Count1; // 保存前一次的计数值
Bird_Count1 = 0; // 清零计数器
}
void External_ISR() interrupt 2 // 外部中断1服务程序
{
Bird_Count1++; // 鸟计数器自加1
}
void main()
{
TMOD = 0x10; // 定时器1工作在模式1
TH1 = 0xFC; // 设置定时器初值
TL1 = 0x67; // 设置定时器初值
ET1 = 1; // 允许定时器1中断
EA = 1; // 允许总中断
EX1 = 1; // 允许外部中断1
IT1 = 1; // 设置外部中断1为下降沿触发
LED = 0; // 关闭LED灯
while(1)
{
// 判断是否有鸟
if(Bird_Count1 > Bird_Count2 + 1 && Bird_Count1 > Bird_Count2 + 1)
{
LED = 1; // 有鸟,点亮LED灯
}
else
{
LED = 0; // 没有鸟,关闭LED灯
}
}
}
```
程序的主要思路是,当传感器检测到有鸟时,会触发外部中断1,计数器自加1。定时器1每隔1000ms会触发中断,此时会将当前计数器的值保存下来,并将计数器清零。在程序的主循环中,每次检查前两次计数值和当前计数值是否符合有鸟的条件,如果符合则点亮LED灯,否则关闭LED灯。
需要注意的是,在程序中使用了两个鸟计数器,分别保存前一次和前前一次的计数值,这是为了避免计数器溢出导致计数错误。同时,在判断是否有鸟的条件中,使用了两次加法运算,而不是一次加2的运算,也是为了避免计数器溢出导致计数错误。