新手请教大家,我在做毕业设计,程序不知那里出错,请大家帮忙看下,多谢!

flye126 2012-05-13 02:57:53
大家好,我在做毕业设计,程序不知那里出错,试了一天都不知为什么会这样,麻烦大家帮忙看下,多谢!我现在没有分给大家,能否以后再给,多谢啦。我用的是 STC89C52RC 单片机

case 1: //按下"A开关"
{
losign=0; //取消端口A DC12V
delay(50); //延时0.05秒
asign=1; //LED灯亮
delay(1000);
asign=0; //延时一秒后,LED灯灭
delay(1000);
lsign=1; //端口B 得DC12V
};break;


按下"A开关",时,程序执行到asign=1 前面正常,但后面就对了,不断的开灯,关灯,开灯,LED灯一直是一闪一闪的,而且lsign=1这句根本没有执行到,因为我量了端口B 没有得到DC12V

下面是整个程序:
-------------------------------------------------------------------------------------------------
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit okey=P2^0; //A开关
sbit ikey=P2^1; //B开关


sbit losign=P1^0; //端口A DC12V
sbit asign=P1^1; //LED灯
sbit lsign=P1^2; //端口B DC12V



uchar K;
void delay(unsigned int xx) //晶振=11.0592Mhz, 基数0.001秒
{
unsigned char a,b;
unsigned int c;
for(c=xx;c>0;c--)
for(b=102;b>0;b--)
for(a=3;a>0;a--);
}


void keyscan() //按键扫描
{


if(okey==0) //"A开关"是否被按下
{

delay(10);
//延时去抖大概8us
if(okey==0) //通过延时之后再次判断是否"A开关"被按下
{
while(!okey); //松手检测(如果松手就开始执行下面的语句)
K=1;
}
}

if(ikey==0) //"B开关"是否被按下
{
delay(10); //延时去抖大概8us

if(ikey==0) //通过延时之后再次判断是否"B开关"被按下
{
while(!ikey); //松手检测(如果松手就开始执行下面的语句)
K=2;
}

}

}


void main()
{

losign=1; //端口A初始化,有DC12V

while(1)
{
keyscan();
switch(K)
{
case 1: //按下"A开关"
{



losign=0; //取消端口A DC12V
delay(50); //延时0.05秒
asign=1; //LED灯亮
delay(1000);
asign=0; //延时一秒后,LED灯灭
lsign=1; //端口B 得DC12V

};break;

case 2: //按下"B开关"
{

losign=0; //取消端口A DC12V
delay(50); //延时0.05秒
asign=1; //LED灯亮
delay(1000); //延时1秒
lsign=0; //取消端口B DC12V
fsign=0; //取消端口C DC12V


};break;


}
}
}
...全文
176 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
EmbeddedLong 2012-05-15
  • 打赏
  • 举报
回复
硬件上跑得吗?为什么要用全局变量呢?局部的不好吗?

还有就是
while(!ikey); //松手检测(如果松手就开始执行下面的语句)
K=2;

改成
K =2 ;
while(!ikey); //松手检测(如果松手就开始执行下面的语句)

试试
路过蜻蜓 2012-05-14
  • 打赏
  • 举报
回复
小朋友,判断前得先拉高...
路过蜻蜓 2012-05-14
  • 打赏
  • 举报
回复
好难啊..
flye126 2012-05-14
  • 打赏
  • 举报
回复
还是不行,查不出为什么,大家能否帮我看看,多谢。。
luoanp 2012-05-13
  • 打赏
  • 举报
回复
K是全局变量,需要每次循环后做初始化。
while(1)
{
K=0; //重新给K=0
flye126 2012-05-13
  • 打赏
  • 举报
回复
shuiyan,你好, 我把延时函数改成uchar了。
void delay(uchar xx) //延时=(xx*0.001)秒
{
unsigned char a,b;
unsigned int c;
for(c=xx;c>0;c--)
for(b=102;b>0;b--)
for(a=3;a>0;a--);
}

结果:
case 1: //按下"A开关"
{
losign=0; //取消端口A DC12V
delay(240); //延时
asign=1; //LED灯亮
delay(240);
asign=0; //延时,LED灯灭
lsign=1; //端口B 得DC12V
};break;

这一段中,只执行到 losign=0; //取消端口A DC12V(这一句执行对了) 然后后面就没有反应了。
shuiyan 2012-05-13
  • 打赏
  • 举报
回复
你把delay()的参数改成uchar类型,传值时传个240,试试。这会儿只是随便猜。如果实在搞不定,我再真正跑程序看看。
shuiyan 2012-05-13
  • 打赏
  • 举报
回复
你把delay()的参数改成uchar类型,传值时传个240,试试。这会儿只是随便猜。如果实在搞不定,我再真正跑程序看看。
田子方 2012-05-13
  • 打赏
  • 举报
回复
可能:
1:k没有初始化,也可能没影响,但是如果uchar k=0;//可能明确点
2:分析单片机大部分时间干嘛:你的程序开始就检测按键,然后就switch了,如果k赋值1(因为没初值),那么就执行case 1.这和你的解释相同。你的按键不是用中断实现的,所以要想被单片机机在一个恰当的时间检测到(即单片机正好到keyscan,而你在这期间按下按键)是难的,因为你每次按键事件不会很长。
解决方法:
A:
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit okey=P2^0; //A开关
sbit ikey=P2^1; //B开关


sbit losign=P1^0; //端口A DC12V
sbit asign=P1^1; //LED灯
sbit lsign=P1^2; //端口B DC12V



uchar K=0; //初值
void delay(unsigned int xx) //晶振=11.0592Mhz, 基数0.001秒
{
unsigned char a,b;
unsigned int c;
for(c=xx;c>0;c--)
for(b=102;b>0;b--)
for(a=3;a>0;a--);
}


void keyscan() //按键扫描
{


if(okey==0) //"A开关"是否被按下
{

delay(10);
//延时去抖大概8us
if(okey==0) //通过延时之后再次判断是否"A开关"被按下
{
while(!okey); //松手检测(如果松手就开始执行下面的语句)
K=1;
}
}

if(ikey==0) //"B开关"是否被按下
{
delay(10); //延时去抖大概8us

if(ikey==0) //通过延时之后再次判断是否"B开关"被按下
{
while(!ikey); //松手检测(如果松手就开始执行下面的语句)
K=2;
}

}

}


void main()
{

losign=1; //端口A初始化,有DC12V

while(1)
{
K=0; //重新给K=0
keyscan();
switch(K)
{
case 1: //按下"A开关"
{



losign=0; //取消端口A DC12V
delay(50); //延时0.05秒
asign=1; //LED灯亮
delay(1000);
asign=0; //延时一秒后,LED灯灭
lsign=1; //端口B 得DC12V

};break;

case 2: //按下"B开关"
{

losign=0; //取消端口A DC12V
delay(50); //延时0.05秒
asign=1; //LED灯亮
delay(1000); //延时1秒
lsign=0; //取消端口B DC12V
fsign=0; //取消端口C DC12V


};break;

default:break;//------
}
}
}


B:
一直按着按键,时间>case执行的时间(1S以上)

C:
改用外部中断实现键盘
flye126 2012-05-13
  • 打赏
  • 举报
回复
wifity,luoanp,你们好,我按照你们说的加了 K=0;
while(1)
{
K=0; //重新给K=0

测试结果是:

case 1: //按下"A开关"
{



losign=0; //取消端口A DC12V
delay(50); //延时0.05秒
asign=1; //LED灯亮
delay(1000);
asign=0; //延时一秒后,LED灯灭
lsign=1; //端口B 得DC12V

};break;

这一段中,只执行到 losign=0; //取消端口A DC12V(这一句执行对了) 然后后面就没有反应了。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧