在keil5中编写一个以51单片机为固件的程序,当有鸟时内部 Bird_Count1变量自加。通过定时器 1 定时 1000ms 中断查询 Bird_Count1 变量的数值,并与前两次的值作对比判断是否有鸟,只有当前测得的 Bird_Count1 次数大于前一次次数加 1 和大于前前一次次数加 1 才判断为有鸟。驱鸟器若在五分钟内连续驱鸟次数达到 5 次以上,则认为是有恶劣天气引起的,驱鸟器则停止工作 15 分钟,若是驱鸟器连续 5 个 15 分钟停止工作,则认为天气情况特别恶劣,驱鸟器直接停止工作5小时。
时间: 2024-03-17 09:46:54 浏览: 58
51单片机开发板实验:定时器T1中断控制两个LED以不同周期闪烁程序源代码.rar
以下是一个简单的程序框架,供您参考:
```c
#include <reg51.h>
unsigned int Bird_Count1 = 0; // 记录鸟的数量
unsigned int last_count = 0; // 上一次查询时的鸟的数量
unsigned int last_last_count = 0; // 上上次查询时的鸟的数量
unsigned int no_bird_count = 0; // 记录连续无鸟的次数
unsigned int bad_weather_count = 0; // 记录恶劣天气的次数
unsigned int stop_count = 0; // 记录停工的次数
// 中断处理函数
void interrupt_handler() interrupt 1 {
// 判断中断来源
if (/* 来源为定时器1 */) {
// 查询 Bird_Count1 变量的数值
// 判断是否有鸟
if (Bird_Count1 > last_count + 1 && Bird_Count1 > last_last_count + 1) {
// 有鸟
no_bird_count = 0; // 重置连续无鸟的次数
// 驱鸟
// 判断是否达到连续驱鸟次数的阈值
if (bad_weather_count > 0) { // 处于恶劣天气状态
// 停工15分钟
// 检查是否达到停工的次数阈值
if (stop_count >= 5) { // 达到停工次数阈值
// 停工5小时
}
} else { // 正常状态
// 记录鸟的数量
// 判断是否达到连续驱鸟次数的阈值
if (/* 达到连续驱鸟次数阈值 */) {
// 进入恶劣天气状态
// 重置计数器
}
}
} else {
// 无鸟
no_bird_count++; // 记录连续无鸟的次数
// 判断是否达到连续无鸟次数的阈值
if (no_bird_count >= 5) { // 达到连续无鸟次数阈值
// 进入恶劣天气状态
// 重置计数器
}
}
// 更新上一次和上上次查询时的鸟的数量
// 重置 Bird_Count1 变量
}
}
// 主函数
void main() {
// 初始化定时器1
// 注册中断处理函数
while (1) {
// 进入空闲模式
}
}
```
在实际编写中,您需要具体实现驱鸟子程序、实现定时器1的初始化以及注册中断处理函数等功能,并根据实际需求调整阈值参数。同时,还需要注意单片机的低功耗设计。
阅读全文