51单片机开发模板制作温度显示按键控速风扇,程序编好,按键功能实现不了,求大神门帮忙看看,感谢,感谢

本人萌新一名,想依靠普中科技51单片机开发模板制作一个温度显示,按键控制风速的风扇实验,现在程序已经编好,但是只显示温度和风扇转,按键没有用,请大神门帮忙看一下,感激不尽下面是程序代码。
#include "reg52.h" #include"temp.h" typedef unsigned int u16;typedef unsigned char u8;unsigned char Count; #include<intrins.h>
sbit moto = P1^0;sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;sbit k1=P1^1;
sbit k2=P1^2 ; sbit k3=P1^3 ; u8 flag;
char num=0;u8 DisplayData[8];u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示管
void delay(u16 i){while(i--);}//延时设置
void datapros(int temp) {float tp; if(temp< 0){DisplayData[0] = 0x40;
temp=temp-1;temp=~temp;tp=temp;temp=tp*0.0625*100+0.5;}
else{DisplayData[0] = 0x00;tp=temp;temp=tp*0.0625*100+0.5;
}
DisplayData[1] = smgduan[temp / 10000];DisplayData[2] = smgduan[temp % 10000 / 1000];DisplayData[3] = smgduan[temp % 1000 / 100] | 0x80;DisplayData[4] = smgduan[temp % 100 / 10];DisplayData[5] = smgduan[temp % 10];
void DigDisplay(){u8 i;for(i=0;i<6;i++){switch(i)
{case(0):LSA=0;LSB=0;LSC=0; break;//显示第0位case(1):LSA=1;LSB=0;LSC=0; break;
case(2):LSA=0;LSB=1;LSC=0; break;//显示第2位case(3):LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
}
P0=DisplayData[i];//发送数据
delay(100); //间隔一段时间扫描
P0=0x00;//消隐
}
}
void keypros()
{
if(k1==0) //检测按键K1是否按下
{
delay(1000); //消除抖动 一般大约10ms
if(k1==0) //再次判断按键是否按下
{
flag=0; //led状态取反

}
while(!k1); //检测按键是否松开
}
if(k2==0) //检测按键K1是否按下
{
delay(1000); //消除抖动 一般大约10ms
if(k2==0) //再次判断按键是否按下
{
flag=1; //led状态取反

}
while(!k2); //检测按键是否松开
}
if(k3==0) //检测按键K1是否按下
{
delay(1000); //消除抖动 一般大约10ms
if(k3==0) //再次判断按键是否按下
{
flag=2; //led状态取反

}
while(!k3); //检测按键是否松开
}
}
void main()
{
u8 i;
moto=0;
while(1)
{
datapros(Ds18b20ReadTemp()); //数据处理函数
DigDisplay();//数码管显示函数
keypros(); //按键处理函数
if(flag==0)
{
for(i=0;i<100;i++) //循环100次,也就是大约5S
{
if(i>70)
moto=1;
else
moto=0; //开启电机
}
}
if(flag==1)
{
for(i=0;i<100;i++) //循环100次,也就是大约5S
{
if(i>30)
moto=1;
else
moto=0; //开启电机
}
}
if(flag==2)
{

moto=1; //开启电机

}
}

}

首先你这程序有问题,这四行不属于任何的子程序,编译都出错。
DisplayData[1] = smgduan[temp / 10000];
DisplayData[2] = smgduan[temp % 10000 / 1000];
DisplayData[3] = smgduan[temp % 1000 / 100] | 0x80;
DisplayData[4] = smgduan[temp % 100 / 10];DisplayData[5] = smgduan[temp % 10];
把这四行改正后,编译后仿真运行程序,3个按键是起作用的。你感觉不起作用,是因为那3个按键,就是改变 flag 分别为0,1,2。可是,主程序中根据 flag 值不同,执行的却是同一个动作,都是 moto=1; (稍稍有一点区别,只是你感觉不出来)所以,按什么键都是这个动作,按不按都 一样,当然那就会觉得按键不起作用。那3个按键控制的动作要有区别呀,或者动作区别要大,才能看出来按键起作用啦。最简单,直接的方法是,按住按键不松手,看数码管是不是全灭啦,如果全灭了,说明按键就是起作用的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-06-11
写一个小函数,按一下灯亮的那种,先看看是硬件问题还是软件问题。
我就看你flag判断的外接口只有motor,先sbit一个灯的引脚吧
sbit led = P^某引脚;
void test(void)
{
if(k1 == 0) led = 0;
else led = 1;
}
然后丢主函数试一下追问

硬件是没有问题的,之前我写了一个小的中断,是可以用的,

本回答被网友采纳
第2个回答  2019-06-13
小哥哥 你最后有调出来吗
第3个回答  2019-06-11
多按一会儿试试追问

都快按烂了,

第4个回答  2019-06-11
 5 51单片机开发模板制作温度显示按键控速风扇,程序编好,按键功能实现不了,求大神门帮忙看看,感谢,感谢追问

兄弟你会改程序吗?帮老弟看看好吗?谢谢