這個功能較為簡單,寫了個以STC8H1K08 為例,可以試試。
#include <stc8g.h> //STC8H1K08 IRC內部時鐘選12MHZ
typedef unsigned char u8; //對數據類型進行定義聲明
typedef unsigned int u16; //對數據類型進行定義聲明
sbit key1 = P1^2; //按鍵輸入
sbit key2 = P1^3; //光電開關,0為有信號,1為無信號
sbit key3 = P1^4; //光電開關,0為有信號,1為無信號
sbit key4 = P1^5; //備用輸入
sbit kt1 = P3^7; //繼電器控制,0開啟,1關閉
sbit kt2 = P3^6; //繼電器控制,0開啟,1關閉,備用
bit flag10ms = 0; //10ms時間標志,按鍵掃描
/*********************觸發掃描*************************/
void scan()
{
static u8 i = 0; //掃描次數
kt1 = key2 | key3; //key2和key3中有1路無信號,則關閉繼電器1
if(flag10ms) //檢測10ms時間標志
{
flag10ms = 0; //清零10ms標志
if(key1){i = 0;}
else
{
i++;
if(i == 2) {kt1 = ~kt1;}
if(i == 250) {i = 3;}
}
}
}
/*************************主函數******************************/
void main()
{
P1M0 = 0x00; P1M1 = 0x00; //P3設置為準雙向口
P3M0 = 0x00; P3M1 = 0x00; //P5設置為準雙向口
kt1 = 1; //關閉繼電器1
kt2 = 1; //關閉繼電器2
PT1 = 0; //設置Tim1中斷為低級0 PT1=0
IPH &= 0xF7; //0xF7=11110111 PT1H=0
ET1 = 1; //開啟定時器1中斷
EA = 1; //開啟總中斷
AUXR &= 0xBF; //定時器時鐘12T模式
TMOD &= 0x0F; //設置定時器模式16位自動重裝
TL1 = 0xF0; //設置定時初始值10ms
TH1 = 0xD8; //設置定時初始值
TF1 = 0; //清除TF1標志
TR1 = 1; //定時器1開始計時
WDT_CONTR = 0x24; //使能看門狗,溢出時間約為1s
while(1) //主循環
{
WDT_CONTR = 0x34; //清看門狗,否則系統復位
scan(); //調入繼電器掃描函數
}
}
/**********定時器Tim1中斷 10ms 級別0***********/
void Time1() interrupt 3
{
flag10ms = 1; //產生10ms標志位,用于按鍵掃描
}
/**********Program Size: data=10.1 xdata=0 code=245***********/
|