用初学者能看懂的方式写个示例
- /*****************************************************
- IN_1、IN_2低电平触发,OUT1、OUT2输出高电平并经延时后
- 恢复低电平,两路控制独立工作,互不关联
- 触发电平宽度与延时时间无关,延时输出期间重复触发无效
- *****************************************************/
- #include <reg51.h>//头文件
- //端口定义
- sbit IN_1=P1^0;
- sbit IN_2=P1^1;
- sbit OUT1=P2^0;
- sbit OUT2=P2^1;
- //变量声明
- unsigned int time_1=0,time_2=0;//定时时间变量
- bit sign_1=0,sign_2;//触发信号状态标志位变量
- //主函数
- void main(void)
- {
- //初始化端口
- IN_1=1;
- IN_2=1;
- OUT1=0;
- OUT2=0;
- //初始化定时器
- TMOD = 0x01;
- TH0 = 0xFC;//12MHz 1ms
- TL0 = 0x18;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- //主循环
- while(1)
- {
- if(!IN_1)
- {
- if(!sign_1 && time_1==0)
- {
- sign_1=1;
- time_1=2000;//预置时间2s
- OUT1=1;
- }
- }
- else sign_1=0;
- if(!IN_2)
- {
- if(!sign_2 && time_2==0)
- {
- sign_2=1;
- time_2=5000;//预置时间5s
- OUT2=2;
- }
- }
- else sign_2=0;
- }
- }
- //定时器0中断服务函数
- void Timer0Interrupt(void) interrupt 1
- {
- TH0 = 0xFC;
- TL0 = 0x18;
- if(time_1>0)//1通道延时
- {
- time_1--;
- if(time_1==0)
- OUT1=0;
- }
- if(time_2>0)//2通道延时
- {
- time_2--;
- if(time_2==0)
- OUT2=0;
- }
- }
复制代码 |