【Proteus仿真】51单片机外部中断控制输出10秒,后关闭输出
【Proteus仿真】51单片机外部中断控制输出10秒,后关闭输出
- Proteus仿真

控制原理
当外部中断引脚P32引脚电压被拉低时,触发外部中断,启动定时器0,定时10秒钟,十秒钟后,关闭输出。可以反复触发。
程序代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
| #include <reg51.h> unsigned char table[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char count=0; sbit LED_B1=P3^6; sbit LED_A1=P3^7; sbit fmq=P1^0; unsigned char counter; unsigned char NSF=0;
typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8;
sbit k1=P3^1; sbit k2=P3^0;
sbit beep=P1^0; sbit relay=P1^1; u8 start=0; void delayms(unsigned int xms); //定时器0初始化 void Init(void) { TMOD=0x01; TH0=(65536-10000)/256; TL0=(65536-10000)%256; } /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* \*\*\*\*\*\*\*\*\*\*\*\*\*\*\* \* 函 数 名 : Int1Init() \* 函数功能 : 设置外部中断 1 \* 输 入 : 无 \* 输 出 : 无 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* \*\*\*\*\*\*\*\*\*\*\*\*\*\*/ void Int0Init() { //设置 INT0 IT0=1;//跳变沿出发方式(下降沿) EX0=1;//打开 INT0 的中断允许。 EA=1;//打开总中断 } /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* \*\*\*\*\*\*\*\*\*\*\*\*\*\*\* \* 函 数 名 : Int0() interrupt 0 \* 函数功能 : 外部中断 0 的中断函数 \* 输 入 : 无 \* 输 出 : 无 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* \*\*\*\*\*\*\*\*\*\*\*\*\*\*/ void Int0() interrupt 0 //外部中断 0 的中断函数 { //delay(1000); //延时消抖 ET0=1;//定时器中断使能 TR0=1;//启动 T0 EA=1; }
//处理定时器0中断 void timer0(void) interrupt 1 { TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1; ET0=1; EA=1; beep=1; relay=1; count++; if(count>19) {//当定时到1秒时执行花括号里面的语句 count=0; NSF++; } }
void delayms(unsigned int xms) { unsigned int i,j; for(i=xms; i>0; i--) for(j=110; j>0; j--);
}
//数码管显示函数 void display1(unsigned char num1,unsigned char num2) { LED_A1=0; P0=table[num1];
delayms(10); LED_A1=1;
LED_B1=0; P0=table[num2];
delayms(10); LED_B1=1; } void main() { relay =0; Int0Init();//外部中断1 Init();//定时器初始化,但是不启动 beep=0; while(1) { display1(NSF/10,NSF%10); delayms(10); if(NSF>10) {//输出10秒后,关闭定时器。 ET0=0;//定时器中断使能 TR0=0;//启动 T0 NSF=0; beep=0; relay=0; } } }
|
程序源码和仿真资源
1 2 3
| 链接:https://pan.baidu.com/s/1Abou-RQx8mgLuFUmBxCwuQ 提取码:gm1b
|
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!