小白一枚,第一次編寫見笑,自己不會寫代碼找了幾個代碼拼湊的,用著還行,寫的很啰嗦老師們給優化下吧。
就是很簡單的遙控開關,按一下開窗打開窗戶,按一下關窗關閉窗戶,如果開窗下雨自動關閉窗戶,關閉后即使有雨感信號也不再執行關窗動作。開窗器自帶過流保護所以不用加限位開關。
單片機源程序如下:
//2021年4月10日遙控開關窗雨感關窗程序//
//遙控信號高電平有效,雨感低電平有效,繼電器輸出控制高電平有效//
#include "STC15F104E.H" //單片機頭文件
#define uint unsigned int //宏定義無符號整型數據
#define uchar unsigned char //宏定義無符號字符型數據
sbit KAI=P3^4; //開窗信號輸入
sbit KAIO=P3^5; //開窗輸出
sbit YG=P3^0; //雨感輸入
sbit GUANO=P3^1; //關窗輸出
sbit GUAN=P3^2; //關窗信號輸入
sbit ting=P3^3; //停止信號
uchar Cnt50ms,Cnt1s; //中斷計時變量
bit K_sign=0; //開窗狀態標志
bit G_sign=0; //關窗狀態標志
bit K1_sign=0; //開窗狀態1用于雨感
bit YG_sign=0; //雨感狀態標志
bit T_sign=0; //停止狀態標志
/***********停止子程序****************/
void TINGZHI()
{
static uchar count=0; //計數變量
if(ting==1) //檢測輸入如果為1
{
count++; //計數延時消抖
if(count>=100) //100次檢測按鍵如果為0
{
count=100; //防止溢出
if(T_sign==0) //按鍵狀態標志為0
{
T_sign=1; // 停止狀態置1防止重復響應
K_sign=0; //開窗狀態標志清0
KAIO=0; //關閉開窗輸出
G_sign=0; //按鍵狀態標志清0
GUANO=0;
YG_sign=0;
T_sign=0;
TR0=0;
}
}
}
else count=0; //計數變量清0
}
void KAICHUANG()
{
static uchar count=0; //計數變量
if(KAI==1&&G_sign==0&&YG_sign==0) //檢測輸入如果為0
{
count++; //計數延時消抖
if(count>=100) //100次檢測按鍵如果為0
{
count=100; //防止溢出
if(K_sign==0) //按鍵狀態標志為0
{
K_sign=1; //按鍵狀態標志置1,防止重復響應
KAIO=1; //輸出低電平有效
K1_sign=1;
TR0= 1; //啟動定時器
}
}
}
else count=0; //計數變量清0
}
void GUANCHUANG()
{
static uchar count=0; //計數變量
if(GUAN==1 &&K_sign==0) //檢測輸入如果為0
{
count++; //計數延時消抖
if(count>=100) //100次檢測按鍵如果為0
{
count=100; //防止溢出
if(G_sign==0) //按鍵狀態標志為0
{
G_sign=1; //按鍵狀態標志置1,防止重復響應
GUANO=1; //輸出低電平有效
TR0= 1; //啟動定時器
}
}
}
else count=0; //計數變量清0
}
void yugan()
{
static uchar count=0; //計數變量
if(YG==0&&K_sign==0&&K1_sign==1) //檢測輸入如果為0
{
count++; //計數延時消抖
if(count>=100) //100次檢測按鍵如果為0
{
count=100; //防止溢出
if(YG_sign==0) //按鍵狀態標志為0
{
YG_sign=1; //按鍵狀態標志置1,防止重復響應
GUANO=1; //輸出低電平有效
K1_sign=0;
TR0= 1; //啟動定時器
}
}
}
else count=0; //計數變量清0
}
/***********定時器初始化程序****************/
void Timer0Init() //50毫秒@11.0592MHz
{
AUXR &= 0x7F; //定時器時鐘12T模式
TMOD &= 0xF0; //設置自動重載模式
TL0 = 0x00; //設置定時初值
TH0 = 0x4C; //設置定時初值
TF0 = 0; //清除TF0標志
//TR0 = 1; //定時器0開始計時
}
/***************主程序****************/
void main()
{
Timer0Init(); //定時器初始化
EA=1; //開總中斷
ET0=1; //開定時器0中斷
Cnt50ms=0; //賦初值0
Cnt1s=0; //賦初值0
GUANO=0;
KAIO=0;
P3M1=0x00;
P3M0=0x22;
while(1)
{
KAICHUANG();
yugan();
TINGZHI();
GUANCHUANG();
}
}
/**************中斷服務程序*****************/
void timer0() interrupt 1
{
Cnt50ms++; //中斷變量Cnt50ms自+1
if(Cnt50ms>=20) //1秒
{
Cnt50ms=0; //中斷變量Cnt50ms清0
Cnt1s++; //計數清0
if(Cnt1s>=35) //1~255秒任意設置
{
Cnt1s=0; //中斷變量Cnt1s自清0
K_sign=0; //按鍵狀態標志清0
KAIO=0; //關閉輸出
G_sign=0; //按鍵狀態標志清0
GUANO=0;
YG_sign=0;
T_sign=0;
TR0=0; //關閉定時器
}
}
}
|