首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

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

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

新手请教大家,我在做毕业设计,程序不知那里出错,请大家帮忙看下,多谢!
大家好,我在做毕业设计,程序不知那里出错,试了一天都不知为什么会这样,麻烦大家帮忙看下,多谢!我现在没有分给大家,能否以后再给,多谢啦。我用的是 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;

 
}
  }
}


[解决办法]
可能:
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; //[color=#FF0000][/color]初值
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; //[color=#FF0000][/color]重新给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;//[color=#FF0000][/color]------
}
}
}


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

C:
改用外部中断实现键盘
[解决办法]
K是全局变量,需要每次循环后做初始化。
while(1)
{
K=0; //[color=#FF0000][/color]重新给K=0

[解决办法]
你把delay()的参数改成uchar类型,传值时传个240,试试。这会儿只是随便猜。如果实在搞不定,我再真正跑程序看看。

热点排行