此程序为模拟应对因为线路老化而造成灯饰自燃隐患的紧急预警系统-B18021008侯永琪
①未照明时,系统为初始状态
②外部中断1即sw-spst自锁开关按下,数码管显示工作状态“1”,流水灯开始闪亮
③流水灯自燃,外部中断2即sw-spst自锁开关按下,数码管显示工作状态“2”,蜂鸣器开始报警,紧急照明灯开始工作
④定时器中断1即设置周期为2秒,数码管显示工作状态“3”,电机开始工作(紧急处理装置)
程序查看器(建议)
C51 MCU程序
/* 此程序为模拟应对因为线路老化而造成灯饰自燃隐患的紧急预警系统-B18021008侯永琪 软件开发环境:keil 2线路仿真环境:proteus 8.9/************************未经同意,禁止转载***************************************/ /*项目说明 : 系统未开启工作时,数码管显示未开机状态即“----” ①外部中断1即sw-spst自锁开关按下,数码管显示工作状态“1”,并流水灯开始闪亮 ②外部中断2即sw-spst自锁开关按下,数码管显示工作状态“2”,蜂鸣器开始工作 ③定时器中断1即设置周期为2秒,数码管显示工作状态“3”,电机开始工作 */#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit EXT0_interrupt = P3^2;//外部中断0模拟灯饰开关 sbit EXT1_interrupt = P3^3;//外部中断1模拟报警器开关 sbit P24 = P3^0;// 数码管引脚-显示处于哪一个工作状态 sbit P25 = P2^5;// 数码管引脚-显示处于哪一个工作状态 sbit P26 = P2^6;// 数码管引脚-显示处于哪一个工作状态 sbit P27 = P2^7;// 数码管引脚-显示处于哪一个工作状态 sbit P06 = P0^6; sbit P14 = P1^4;//电机正转 -电机模拟紧急灭火系统的带轮运动方向 sbit P15 = P1^5;//电机反转 -电机模拟紧急灭火系统的带轮运动方向 sbit P16 = P1^6;//灯饰自燃后的紧急照明系统 sbit SPK=P1^3;//报警器 void _74HC154();//彩灯1 void _74LS138();//彩灯2 uchar code DSY_CODE[]={0xf9,0xa4,0xb0,0x99,0xbf};//延时函数 i=1时,大约延时10usvoid delay(uint ms){uchar i;while(ms--)for(i=0;i<40;i++);}//紧急照明驱动程序 void emergency_led(){P16 = 0;}//彩灯照明驱动程序void _74LS138(){uchar h;for(h=0;h<8;h++){P1 = (P1+1)%8;delay(500);}}//彩灯照明驱动程序void _74HC154(){uchar h;for(h=0;h<16;h++){P2 = (P2+1)%16;delay(500);}}//显示器驱动程序-人机交互 void dynamic_tube(){uchar h;/*if(EXT0_interrupt == 0){h=0;y=1;}*/for(h=0;h<4;h++){P0=0xff;//关闭显示P0=DSY_CODE[h]; //发送数字段码switch(h){case 0:{P24=1;delay(500); break; } case 1:{P25=1;delay(500);break; } case 2:{P26=1;delay(500);break; } case 3:{P27=1;delay(500);break; } }delay(500);switch(h){case 0:{P24=0;delay(500);break; } case 1:{P25=0;delay(500);break; } case 2:{P26=0;delay(500);break; } case 3:{P27=0;delay(500);break; } }delay(500);}}//显示器驱动程序-人机交互 void digital_1(){P0=DSY_CODE[0];P24=1;}//显示器驱动程序-人机交互 void digital_2(){P0=DSY_CODE[1];P25=1;}//显示器驱动程序-人机交互 void digital_3(){P0=DSY_CODE[2];P26=1;}//显示器驱动程序-人机交互 /*void digital_4(){P0=DSY_CODE[3];P27=1;}*///报警器驱动程序 void Alarm(uchar t){uchar i,j;for(i=0;i<200;i++){SPK=~SPK;for(j=0;j<t;j++);//由参数t行成不同的频率}}//初始状态函数(显示器显示“- - - - ”) void Start_before(){P0=DSY_CODE[4];P24=1;//四个显示器全部显示- P25=1;//四个显示器全部显示 P26=1;//四个显示器全部显示 P27=1;//四个显示器全部显示 }//彩灯初始化函数 void init(){P1 = 0X00;P2 = 0X00;P24=0;}//main void main(){Start_before();//dynamic_tube();TMOD = 0X01;// method oneTH0 = (65536-50000)/256;TL0 = (65536-50000)%256;EA = 1;//总中断EX0 = 1;//INT0IT0 = 1;//INT0EX1 = 1;//INT1IT1 = 1;//INT1while(1);}//彩灯正常工作(未自然) void EXT0() interrupt 0{init();while(1){digital_1();_74LS138();_74HC154();if(EXT0_interrupt == 1){break;}}Start_before();}//彩灯自燃,外部中断1打开 void EXT1() interrupt 2{init();ET0 = 1;//报警器警报同时开启应急装置(定时器中断1) TR0 = 1;//报警器警报同时开启应急装置(定时器中断1)emergency_led();//紧急照明灯打开 while(1){Alarm(90);//报警器开始警报 digital_2();//工作状态2 delay(100);P25=0;//delay(100);Alarm(120);if(EXT1_interrupt == 1){break;}}Start_before();}//响应定时器中断,紧急灭火系统开始工作 (即电机自动正反转) void timer1()interrupt 1{uchar q;init();digital_3();TH0 = (65536-50000)/256;TL0 = (65536-50000)%256;for(q=0;q<3;q++){P14 = 1;P15 = 0;delay(10000);P14 = 0;P15 = 1;delay(10000);}while(1){init();dynamic_tube(); }}
Proteus 仿真环境
百度网盘链接
链接:/s/1ruz9B6My91geAlcpoTPuKg
链接: link.
提取码:
复制这段内容后打开百度网盘手机App,操作更方便哦