小白一枚,第一次编写见笑,自己不会写代码找了几个代码拼凑的,用着还行,写的很啰嗦老师们给优化下吧。
就是很简单的遥控开关,按一下开窗打开窗户,按一下关窗关闭窗户,如果开窗下雨自动关闭窗户,关闭后即使有雨感信号也不再执行关窗动作。开窗器自带过流保护所以不用加限位开关。
单片机源程序如下:
//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; //关闭定时器
}
}
}
|