发布时间:2023-10-02 18:30
①超声波测距里while后没有加分号
②超声波存储距离的变量需要定义u16
③Read_Key()函数里定义的key_return需要赋初值0
我的思路:定一个记录持续时间的变量,每秒加1,并将当前记时赋给一个变量past_relay_sustain_time(用作当不满足小于30cm时候接着定时,直到5s关闭蜂鸣器)当5s后去关掉蜂鸣器
但是存在一个问题就是触发蜂鸣器亮时,满足距离小于30,但是触发后就物体就离开了,此时距离不小于30,所以在else里使用past_relay_sustain_time模仿距离小于30时触发继电器的操作
if(sonic_get_distance<30 ) //费了点时间,实现这个亮5s后自动熄灭的功能,学习一下别人怎么实现的!!!
{
if(relay_sustain_time==0)
relay_flag=1;
if(relay_one_sec_flag==1)
{
relay_one_sec_flag=0;
relay_sustain_time++;
if(relay_sustain_time==6)
{
relay_flag=0;
}
}
past_relay_sustain_time=relay_sustain_time;
}
else
{
if(past_relay_sustain_time!=0)
{
relay_sustain_time=0;
}
if(relay_one_sec_flag==1)
{
relay_one_sec_flag=0;
past_relay_sustain_time++;
if(past_relay_sustain_time==6)
{
relay_flag=0;
}
}
}
如何实现依次显示?
我的思路如下:定义一个index,让按下一次按键就进行加一,然后将此按键按下对应的数字赋给一个数组
case 5:
if(menjin_mode==2)
{
mima_index++;
mimamen_menu[mima_index+1]=smg_duan[8]; //用来数码管显示
input_password[input_index]=8; //用来与正确密码对比的密码数组
input_index++;
}
我的思路:
将输入的数字存到一个数组里,定义一个正确密码的数组,然后定义一个函数用来比较两个数组是否相等,通过返回值来反映是否数组相等
//0:不相等 1:两个相等
u8 judge_array(u8 a[],u8 b[])
{
u8 i=0;
for(i=0;i<6;i++) //第三个数组到第八个数组
{
if(a[i]!=b[i])return 0;
}
return 1;
}
别人是根据大方向设置了mode,然后如果一个mode里还有小界面就会设置一个新的变量作为另一个模式变量。按下如下操作即可,set_mode == 0的话就是mode == 0本身的界面,如果set_mode == 1的话就是小界面1,如果set_mode == 2就是小界面2
//数码管显示程序如下
每一个按键有自己的功能,强烈建议在这里按键case里先只写相关函数
在一个按键中就写相应功能,思路十分清晰
我的错误思绪(十分的麻烦):
这样不好的思路也就会让我要写一堆标志去保证逻辑的畅通。
case 12题目中说了是确认按键,那么就判断是密码正确的,那里面就应该写一个判断是否正确的函数
整体做题目步骤,分模式的话,一个模式一个模式的写,先写按键方面的模式,因为按键的逻辑比较复杂,先复杂再简单
例如超声波距离小于30cm时候,door_flag=1;
否则的door_flag=0;
在中断里这样判断,如果door_flag1则开始加
!!下图中door_flag=5000改成door_count5000
//下图是中断里记时部分
//下图是door_flag触发及触发后实现功能部分