警灯警笛设计:通过独立按键启动警灯警笛,控制报警灯旋转(旋转灯用8个LED灯实现如下图所示,旋转时低3位亮,然后每次左移一位形成旋转显示),并让蜂鸣器发出警报声(即通过定时产生两种不同频率的输入脉冲给蜂鸣器)
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg51.h>
- #define u16 unsigned int
- #define u8 unsigned char
- sbit beep=P2^3; //beep引脚
- sbit p=P2^4;
- u8 fre,a;
- void delay(u16 k);
- void System_nuit()
- {
- TMOD=0x01;//使用T0定时器
- TH0=0xfe;
- TL0=0x00;
- EA=1; //总开关打开中断控制
- IT0 = 1; //下降沿有效
- EX0 = 1; //允许外部中断1中断
- ET0=1; //定时器允许中断
- TR0=0; // 关定时器
- }
- void main()
- {
- u16 i;
- u8 data1[16]=
- {0x1f,0xff,0x8f,0xff,
- 0xc7,0xff,0xe3,0xff,
- 0xf1,0xff,0xf8,0xff,
- 0x7c,0xff,0x3e,0xff
- };
- P0=0x00;
- p=0;
- System_nuit();
-
- while(1)
- {
- if(p==1)
- {
- for(i=0;i<16;i++)
- {
- P0=~data1[i];
- delay(10);
-
- }if(a%2==0)
- {
- fre=600;
- }
- else
- {
- fre=1000;
- }
- }
- }
- }
- void timer0() interrupt 1 //定时器中段
- {
- TH0=0xfe;
- TL0=fre;
- a++;
- beep=~beep;
-
- if(a==20)
- {
- a=0;
- }
- }
-
- void int0() interrupt 0 //外部中断
- {
- p=~p;
- TR0=~TR0; //定时器
- }
- void delay(u16 k) //延时函数
- { u16 a,b;
- for(a=0;a<k;a++)
- for(b=0;b<114;b++);
- }
复制代码
全部资料51hei下载地址:
shiyan03.zip
(679.95 KB, 下载次数: 29)
|