报警器模拟仿真 原理图与程序(汇编+C语言)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5
在仿真软件 Proteus 中绘制仿真原理图如上图所示。 注意事项:①蜂鸣器使用“BUZZER”元件进行仿真,该元件给电之后就可 以进行蜂鸣,而“SPEAKER”是扬声器,俗称喇叭,可以通过输出不同频率的 电流,就可以产生不同的声音。②上图中的蜂鸣器连接在三极管上了,因为一般 蜂鸣器需要的驱动电流较大,单片机无法直接驱动,因此最好通过电流放大元件 进行电流放大,图中使用的是三极管进行方法。在仿真软件中,也可以直接将蜂
3
单片机实验指导书
等待按键(报警信号源)产生低电平。当报警信号源产生低电平之后,立即让蜂 鸣器以规定频率蜂鸣,发光二极管立即以规定频率闪烁。同时检测报警信号源的 状态,当报警信号源一直为低电平时,则蜂鸣器和发光二极管一直报警。当检测 到报警信号源为高电平时,开始定时器 T1 计时,到达 2 秒后,停止报警。
报警源可以采用温度传感器、湿度传感器等各种传感器,也可以采用各种开 关元件。在此次模拟中,采用按键作为报警源,当按键按下时,报警器开始声光 报警,当按键松开后,报警器继续报警 2 秒后,停止报警。 实验目的:
通过读声光报警器的模拟,掌握定时器中断的使用方法,掌握使用定时器中 断进行多次定时的编程方法,掌握多个定时器同时使用的方法。 仿真原理图:
编程思路:通过定时器 0 计蜂鸣器以及发光二极管的脉冲,通过定时器 1 计当按键松开后,蜂鸣器和数码管继续工作的时长。当然这里也可以使用一个定 时器中断完成上述功能,但是那样定时器 T0 中断的中断服务程序稍微复杂,这 里采用分开编写的方法,程序较为简单。
主程序中,首先开定时器中断 0 以及定时器中断 1,为定时器中断作好准备。
单片机实验指导书
报警器模拟(中级实验)
实验介绍: 通过单片机作为核心控制器,制作一个声光报警器。当达到报警条件后,单
片机利用发光二极管的闪烁模拟光报警,利用蜂鸣器模拟声音报警。发光二极管 的闪烁周期为 0.2 秒(亮 0.1 秒,停 0.1 秒),蜂鸣器蜂鸣的频率为 1 秒(响 0.5 秒,停 0.5 秒)。
修改蜂鸣器驱动电压的方法:双击蜂鸣器元件,在弹出的“Edit Component” (编辑元件)对话框找到 Operating Voltage(驱动电压),将驱动电压的从默认值 “12V”修改为 5V,修改 Load Resistance 的方法同上,这里不再赘述。
汇编语言代码以及 C 语言代码如下: 汇编语言代码: ORG 0H JMP MAIN ORG 0BH JMP DSQ0 ORG 1BH JMP DSQ1 ORG 30H MAIN: MOV TMOD,#11H SETB ET0 SETB ET1 SETB EA MOV TH0,#HIGH(65536-50000) MOV TL0,#LOW(65536-50000) MOV TH1,#HIGH(65536-50000) MOV TL1,#LOW(65536-50000) MOV R2,#2 MOV R3,#10 MOV R4,#40 MAIN1: JB P3.0,MAIN1 SETB TR0
1Hale Waihona Puke 单片机实验指导书鸣器连接至单片机,在实际电路必须通过电流放大电路驱动蜂鸣器。③蜂鸣器在 仿真软件 Proteus 中,默认驱动电压是 12V,使用单片机进行驱动时,我们应该 将该元件的驱动电压修改为 5V,同时将“Load Resistance”值修改的稍大,建议 修改为 50 以上。④用于驱动的三极管最好采用 PNP 型,而不用 NPN 型,因为 单片机上电复位后,单片机 I/O 口都为高电平,为了防止单片机上电瞬间三极管 导通,最好采用 PNP 型三极管。
TMOD=0X11; ET0=1; ET1=1; EA=1; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TH1=(65536-50000)/256; TL1=(65536-50000)%256;
while(1) {
if(P30==0) { TR0=1; while(P30==0);
TR1=1; } } } DSQ0() interrupt 1 { TH0=(65536-50000)/256;
4
单片机实验指导书
TL0=(65536-50000)%256; i++; j++; if(i==2) { P20=~P20;
i=0; } if(j==10) { P21=~P21;
j=0; } } DSQ1() interrupt 3 { TH1=(65536-50000)/256; TL1=(65536-50000)%256; k++; if(k==40) {TR0=0; TR1=0; k=0; P20=1; P21=1; } } 程序中,在装入定时器初值时,使用了除以 256 的方法取出装入定时器中高 8 位的初值,采用 256 取余的方法取出装入定时器中低 8 位的初值。进入定时器 2 中断时,类似于上述程序,我们同样应该将蜂鸣器以及发光二极管的状态修改 为停止闪烁以及停止蜂鸣,否则容易出现当退出中断后,蜂鸣器一直响同时发光 二极管一直亮的情况。 上述程序已经经过 Proteus 仿真软件测试,可以放心使用。
在使用定时器中断时需要注意,采用 12MHz 的晶振,其定时器最长定时时 间是 65536 微秒,大约是 65 毫秒。如此短的时长,在现实生活中很多场合都用 不上。往往需要进行定时器的重复定时,在上面的程序中,定时器定时时长为 50000 微秒,也就是 50 毫秒,发光二极管的定时时长为 0.1 秒,需要重复定时 2 次,程序中的 R2。蜂鸣器的定时时长为 0.5 秒,需要重复定时 10 次,程序中的 R3。报警延时时长为 2 秒,同样定时器 1 定时时长为 50 毫秒,需要重复定时 40 次,程序中的 R4。 C 语言代码: #include <reg52.h> #define uchar unsigned char uchar i=0,j=0,k=0; sbit P20=P2^0; sbit P21=P2^1; sbit P30=P3^0; void main() {
2
单片机实验指导书
MAIN2: JNB P3.0,MAIN2 SETB TR1 JMP MAIN1 DSQ0: MOV TH0,#HIGH(65536-50000) MOV TL0,#LOW(65536-50000) DJNZ R2,X1 MOV R2,#2 CPL P2.0 X1: DJNZ R3,X2 MOV R3,#10 MOV R3,#10 CPL P2.1 X2: RETI DSQ1: MOV TH1,#HIGH(65536-50000) MOV TL1,#LOW(65536-50000) DJNZ R4,X3 MOV R4,#40 CLR TR0 CLR TR1 SETB P2.0 SETB P2.1 X3: RETI END
相关文档
最新文档