51单片机,外部中断检测过零检测,双向可控硅,控制220v灯泡亮度,超声波测距离,写个程序
时间: 2023-11-11 15:05:37 浏览: 121
这是一个比较复杂的任务,需要综合运用51单片机的多个外设,下面是一个大致的程序框架:
```c
#include <reg51.h>
#define THRESHOLD 50 // 超声波测距离阈值,单位为厘米
sbit SCR = P1^0; // 双向可控硅控制引脚
sbit ZCD = P1^1; // 外部中断检测过零引脚
sbit TRIG = P1^2; // 超声波发射引脚
sbit ECHO = P1^3; // 超声波接收引脚
sbit LED = P1^4; // 控制220V灯泡的引脚
void delay(unsigned int t)
{
while(t--);
}
void init()
{
TMOD = 0x01; // 定时器0为模式1
TH0 = 0xFC; // 定时器0初值,计数器减到0需要的时钟数
TL0 = 0x18; // 定时器0初值,计数器减到0需要的时钟数
ET0 = 1; // 允许定时器0中断
EA = 1; // 开启总中断
}
void main()
{
ZCD = 1; // 上升沿触发
SCR = 0; // 关闭双向可控硅
P1 = 0x00; // P1口全部输出,初始状态全部置低
init(); // 初始化
while(1)
{
TRIG = 1; // 发射超声波
delay(10); // 延时10us
TRIG = 0;
while(!ECHO); // 等待超声波接收到信号
TH0 = 0; // 定时器0初值清零
TL0 = 0; // 定时器0初值清零
TR0 = 1; // 启动定时器0
while(ECHO); // 等待超声波接收结束
TR0 = 0; // 关闭定时器0
if(TH0*256 + TL0 < THRESHOLD*58) // 距离小于阈值,开灯
{
LED = 1;
}
else // 距离大于阈值,关灯
{
LED = 0;
}
}
}
void timer0_isr() interrupt 1
{
static unsigned char cnt = 0;
cnt++;
if(cnt == 100) // 1s
{
cnt = 0;
ZCD = 0; // 下降沿触发
delay(10); // 延时10us
ZCD = 1;
SCR = 1; // 开启双向可控硅
delay(100); // 延时100us
SCR = 0; // 关闭双向可控硅
}
}
```
其中,定时器0的中断服务函数用于定时产生1s的过零检测信号,并控制双向可控硅触发,实现对220V灯泡亮度的控制。超声波测距离的结果与阈值比较,控制LED引脚的高低电平,实现对灯泡开关的控制。为了保证程序的正确性和可靠性,还需要进行实际硬件调试和测试。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)