当前位置: 代码迷 >> 单片机 >> 小弟我在做毕业设计遇到一难点,可能要用到定时器,麻烦大家帮小弟我看下,有全部源代码,谢谢啦!
  详细解决方案

小弟我在做毕业设计遇到一难点,可能要用到定时器,麻烦大家帮小弟我看下,有全部源代码,谢谢啦!

热度:52   发布时间:2016-04-28 15:57:15.0
我在做毕业设计遇到一难点,可能要用到定时器,麻烦大家帮我看下,有全部源代码,多谢啦!!!!
大家好,我在做毕业设计,想实现这一功能,不知要怎样做?麻烦大家帮忙看下,多谢!我现在没有多分给大家,能否以后再加,多谢啦。我用的是 STC89C52RC 单片机

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


按下"A开关",时,程序执行正常,但毕业设计要求,当lsign=1即端口B得DC12V,但持续5秒后,如果C开关没有被按下,则端口B电压为0V,即lsign=0,如果5秒后检测到C开关有被按下,则保持端口B有DC12V。
这个功能要怎样实现,我原来想用延时5秒后,再判断C开关有没有被按下,如果有按下则端口B持续有DC12V,没有按下就把lsign=0,但老师说不行,因为用延时5秒的话,在这5秒之内单片机就在空跑了,要想其他办法,是不是要用到定时器与中断功能?多谢!!

下面是整个程序:
-------------------------------------------------------------
#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 senkey=P^2 //C开关

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;
  }

 } 
if(senkey==0) //"C开关"是否被按下
 {

  delay(10);
  //延时去抖大概8us
  if(senkey==0) //通过延时之后再次判断是否"C开关"被按下
  {
  K=3; 
  }
 }

}


void main()
{
 
losign=1; //端口A初始化,有DC12V
K=0;
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,持续5秒后,如果C开关没有被按下,则端口B电压为0V,即lsign=0,如果5秒后检测到C开关有被按下,则保持端口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;
}
  }
}

------解决方案--------------------
楼主的问题的确说的不十分清楚 你说的“5秒后” 实际应该是5秒内吧 否则单片机岂不要永远等待下去了 
如果问题是5秒内 C开关未曾按下 则端口B电压为0V 5秒内C开关被按下 则端口B为12V 就要用到外部中断和定时器了 定时器计时5s 同时开放定时器中断和端口中断 如果5s内端口触发中断 执行开关按下代码 否则执行开关未按下代码 可以设一个全局变量STATE 起始位0 然后分别在端口中断程序中和定时器中断程序中根据实际情况 改变STATE值 回到main函数后执行相关代码即可 我说的清楚吗?
------解决方案--------------------
给你一个思路,如果你会使用定时器的话

C/C++ code
uint ledcnt=0;while(1)   {keyscan();switch(K){case 1: //按下"A开关"{    ledcnt=500;//假设TIMER0是10MS触发一次/*端口B 得DC12V,持续5秒后,如果C开关没有被按下,则端口B电压为0V,即lsign=0,如果5秒后检测到C开关有被按下,则保持端口B有DC12V,这个功能要怎样实现? */};break;void Timer0(void) interrupt 1{    TH0=0XD8;    TL0=0XF0;        if(ledcnt>0){losign=1;ledcnt--;}        else losign=0;}
  相关解决方案