我在做毕业设计遇到一难点,可能要用到定时器,麻烦大家帮我看下,有全部源代码,多谢啦!!!!
大家好,我在做毕业设计,想实现这一功能,不知要怎样做?麻烦大家帮忙看下,多谢!我现在没有多分给大家,能否以后再加,多谢啦。我用的是 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函数后执行相关代码即可 我说的清楚吗?
[解决办法]
给你一个思路,如果你会使用定时器的话
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;}