打印

程序问题

[复制链接]
770|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xsgy123|  楼主 | 2012-5-13 18:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序不知那里出错,试了一天都不知为什么会这样,麻烦大家帮忙看下,多谢!我用的是 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;

  
}
  }
}

相关帖子

沙发
hsbjb| | 2012-5-13 18:59 | 只看该作者
可能:
1:k没有初始化,也可能没影响,但是如果uchar k=0;//可能明确点
2:分析单片机大部分时间干嘛:你的程序开始就检测按键,然后就switch了,如果k赋值1(因为没初值),那么就执行case 1.这和你的解释相同。你的按键不是用中断实现的,所以要想被单片机机在一个恰当的时间检测到(即单片机正好到keyscan,而你在这期间按下按键)是难的,因为你每次按键事件不会很长。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

229

主题

2603

帖子

1

粉丝