国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee
ELEOK
標題:
簡易51單片機報警器Proteus仿真圖與程序
[打印本頁]
作者:
eng
時間:
2021-7-20 16:30
標題:
簡易51單片機報警器Proteus仿真圖與程序
簡易報警器:當第一次觸發時發出報警信號,延時6s后報警信號停止。從停止后計時10s內沒有第二次觸發則復位,10s內觸發第二次則持續報警,只可由復位鍵復位。
采用定時器0進行10s計時,定時器1為無源蜂鳴器提供頻率500hz的方波。
仿真代碼下載:
報警器.rar
(39.85 KB, 售價: 3 E幣)
2023-6-5 16:20 上傳
點擊文件名下載附件
售價: 3 E幣
[記錄]
[
購買
]
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
1.jpg
(46.7 KB)
下載附件
2021-7-20 16:28 上傳
單片機源程序如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit beep=P2^5;
sbit keyalarm=P3^1;
sbit keyreset=P3^0;
//sbit tensled=P2^1;
uchar flag,timer0,timer1,alarm;
void Timer0Init()//定時器0用來計時
{
TMOD|=0X01;//選擇為定時器模式,工作方式1,僅用TR0打開啟動。
TH0 = 0x3c; //配置50ms定時
TL0 = 0xb0;
ET0 = 1; //打開定時器中斷
EA = 1; //打開總中斷
}
void Timer1Init() //定時器1用來控制蜂鳴器
{
TMOD|=0X10;//選擇為定時器模式,工作方式1,僅用TR1打開啟動。
TH1 = 0xfc; //配置1毫秒定時
TL1 = 0x18;
ET1 = 1; //打開定時器中斷
EA = 1; //打開總中斷
TR1=1;
}
void Delay1ms(uint y)//延時1ms
{
uint x;
for( ; y>0; y--)
{
for(x=123; x>0; x--);
}
}
void keypros()
{
if(keyalarm==0&&flag==0)//第一次按鍵
{
Delay1ms(1); //消除抖動 一般大約1ms
if(keyalarm==0) //再次判斷按鍵是否按下
{
flag++; //按鍵次數+1
alarm=1; //第一次按鍵響6s后關閉
Delay1ms(6000);
alarm=0;
TR0=1; // 啟動定時器
}
while(!keyalarm); //檢測按鍵是否松開
}
else if(keyalarm==0&&flag>=1&&timer0<=200)//若10s內再次按鍵
{
Delay1ms(1); //消除抖動 一般大約1ms
if(keyalarm==0) //再次判斷按鍵是否按下
{
alarm=1;//警報一直響
flag++;
}
while(!keyalarm); //檢測按鍵是否松開
}
else if(keyreset==0)
{
Delay1ms(1); //消除抖動 一般大約1ms
if(keyreset==0) //再次判斷按鍵是否按下
{
alarm=0; //關閉警報
TR0=0; //關閉定時器
timer0=0; //定時器計數值歸零
flag=0; //清除按鍵次數
}
while(!keyreset); //檢測按鍵是否松開
}
}
void autoreset()
{
if(flag==1&&timer0>200)//10s內未按第二次則自動復位
{
TR0=0; //關閉定時器
timer0=0;//定時器計數值歸零
flag=0; //清除按鍵次數
}
}
void main()
{
Timer0Init();//定時器0初始化
Timer1Init();//定時器1初始化
alarm=0; //關閉警報
while(1)
{
keypros();
autoreset();
}
}
void time0(void) interrupt 1
{
TH0 = 0x3c; //配置50ms定時
TL0 = 0xb0;
timer0++; //定時器0中斷每50ms計數值+1
}
void time1(void) interrupt 3
{
TH1 = 0xfc; //配置1毫秒定時
TL1 = 0x18;
timer1++; //timer0開始計數,每1毫秒加一
if(timer1>2) //PWM周期為2毫秒
{
timer1=0;
}
if(timer1 <alarm)
{
beep=1;
}
else
{
beep=0;
}
}
復制代碼
歡迎光臨 ELEOK (http://www.afoofa.cn/)
Powered by Discuz! X5.0