|
发表于 2023-7-8 14:11:42
|
显示全部楼层
本帖最后由 慕名而来 于 2023-7-8 14:14 编辑
楼主硬件的控制模式是系统上电时按键SW1的端口状态为高电平,此时不能做判断,否则系统上电就进入了“单片机8脚高电平时,1脚延迟3秒输出一个时长1分钟的低电平”这个状态了,虽然楼主要求是判断8脚低电平、高电平,但因为按键不按下就是高电平状态了,所以我的理解为楼主的控制只有按键SW1按下的一个判断,按键松手后就自动进入了另一个状态,也就是说,每按一次按键单片机都要如下运行:
按键按下(按键按下再抬起时开始运行)——>延时3秒——>P3.5=0——>延时1秒——>P3.5=1——>(开始按键高电平状态的运行)延时3S——>P3.4=0——>延时60秒——>P3.4=1——>等待下次按键。
如果楼主需要对两个光耦分别控制则需要两个按键来实现,或者通过按键的长、短时间来分别控制。
对于一楼的控制要求,我的代码分享如下,是通过按键查询模式实现的,也可以改为中断控制的,程序在(STC8H8K64U)开天斧三.1实验板上测试通过。
代码中的P34,P35是头文件中已经定义好的端口名称
#include <stc15.h>
bit flag, f32, f34, f35;
unsigned int count;
//----20ms延时函数----------------------------------
void Delay20ms() [url=]//@11.0592MHz[/url]
{
unsigned char data i, j;
i = 216;
j = 37;
do
{
while (--j);
}
while (--i);
}
//----定时器0初始化函数-----------------------------
void Timer0_Init(void) //50毫秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x00; //设置定时初始值
TH0 = 0x4C; //设置定时初始值
ET0 = 1; //使能定时器0中断
EA = 1;
}
//----定时器0中断函数-------------------------------
void Timer0_Isr(void) interrupt 1
{
if(f35)
{
if(P35)
{
if(count++ > 60) //计时3秒
{
count = 0;
P35 = 0; //使能P3.5脚输出
}
}
if(!P35)
{
if(count++ > 20) //计时1秒
{
count = 0;
P35 = 1; //关闭输出
f32 = 0;
TR0 = 0; //关闭P3.5脚输出
}
}
}
if(f34)
{
if(P34)
{
if(count++ > 60) //计时3秒
{
count = 0;
P34 = 0; //使能P3.4脚输出
}
}
if(!P34)
{
if(count++ > 1200) //计时1分钟
{
count = 0;
P34 = 1; //关闭P3.4脚输出
TR0 = 0; //关闭定时器
}
}
}
}
//----按键函数------------------------------------
void key()
{
if(P32 == 0)
Delay20ms();
if(P32 == 0)
{
f32 = 1;
while(!P32);
}
}
//----主函数--------------------------------------
void main ()
{
P3M0 = 0x30; //配置P3.4、P3.5为推挽输出模式
P3M1 = 0x00;
Timer0_Init();
flag = 0;
f32 = 0;
f34 = 0;
f35 = 0;
count = 0;
while(1)
{
key(); //按键查询
if(f32)
{
TR0 = 1; //开启定时器
flag = 1;
f35 = 1;
f34 = 0;
}
if(P32 & flag )
{
TR0 = 1; //开启定时器
flag = 0;
f34 = 1;
f35 = 0;
}
}
}
|
|