用初學者能看懂的方式寫個示例
- /*****************************************************
- 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;
- }
- }
復制代碼 |