[STC单片机] 大家进来看看我的程序吧,模块之间有冲突,不知道怎么写

[复制链接]
2971|19
 楼主| samsunghellome 发表于 2013-9-2 19:37 | 显示全部楼层 |阅读模式
#include<reg52.h>
sbit KEY1=P3^0;  
sbit KEY2=P3^6;  
sbit LED1=P1^0;
sbit LED2=P1^1;
bit Flag=0;//Flag为模块选择标志位
void DelayUs2x(unsigned int t);
void DelayMs(unsigned int t);
static unsigned char i;
static unsigned char j;
bit a;//a为正常模式200ms延时标志位
bit b;//b为儿童模式1秒延时标志位
bit c;//c为儿童模式开灯/关灯控制标志位
void Init_Timer0()
{
TMOD|= 0x01;   //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响      
TH0=(65536-50000)/256;       //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
TL0=(65536-50000)%256;
EA=1;            //总中断打开
ET0=1;           //定时器中断打开
TR0=1;           //定时器开关打开
}
void Init_Timer1()
{
TMOD|= 0x10;   //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响      
TH1=(65536-50000)/256;       //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
TL1=(65536-50000)%256;
EA=1;            //总中断打开
ET1=1;           //定时器中断打开
TR1=1;           //定时器开关打开
}
void main()
{
  KEY1=1;
  KEY2=1;
while(1)
{ /********正常开灯********/
if(KEY1==0&&LED1==1) //正常开灯     
  {DelayMs(2);
   if(KEY1==0&&LED1==1)//按键1延时去抖
   while(!KEY1);
   a=1;
   Init_Timer0();        
while(a)
{if(KEY2==0)
   {DelayMs(2);
       if(KEY2==0)   
  {LED1=0;
   a=0;
   while(!KEY2);//等待按键2释放     
  }
   }
}
   }
   /********正常关灯********/                                             
    if(KEY2==0&&LED1==0)//正常关灯      
    {DelayMs(2);
      if(KEY2==0&&LED1==0)//按键2延时去抖
   while(!KEY2);
   a=1;
   Init_Timer0();      
  while(a)
     {if(KEY1==0&&KEY2==1)
       {DelayMs(2);
            if(KEY1==0&&KEY2==1)      
      {LED1=1;
       a=0;
    while(!KEY1);//等待按键1释放              
         }
       }                           
     }
}
/********儿童开灯********/
  if(KEY2==0&&LED1==1) //儿童开灯
    { DelayMs(2);
if(KEY2==0&&LED1==1)
   b=0;      
   if(KEY1==0&&KEY2==0)
    {Init_Timer1();//定时1s,b=1;
     while(b==0);
     if(KEY1==0&&KEY2==0)   
   LED1=0;
   b=0;
  while(KEY1==0&&KEY2==0);
    }      
}  
   /********儿童关灯********/
   if(KEY2==0&&LED1==0) //儿童关灯
    { DelayMs(2);
  if(KEY2==0&&LED1==0)
   b=0;      
   if(KEY1==0&&KEY2==0&&LED1==0)
    {Init_Timer1();//定时1s,b=1;
     while(b==0);
     if(KEY1==0&&KEY2==0&&LED1==0)   
   LED1=1;
   b=0;
  while(KEY1==0&&KEY2==0);
    }      
}  
}
}   
void DelayUs2x(unsigned int t)
{   
while(--t);
}

void DelayMs(unsigned int t)
{
    while(t--)
{
     //大致延时1mS
     DelayUs2x(245);
  DelayUs2x(245);
}
}
void Timer0_isr(void) interrupt 1 //using 1
{
   TH0=(65536-50000)/256;       //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
   TL0=(65536-50000)%256;
   i++;
   if(i==3) //超过150ms视为无效操作
    {
     i=0;
  a=0;
  TR0=0;  
}
}
void Timer1_isr(void) interrupt 3 //using 1
{
   TH1=(65536-50000)/256;       //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
   TL1=(65536-50000)%256;
   j++;      
   if(j==20) //1s
    {j=0;//超过1秒后,启动儿童模式
     b=1;
TR1=0;
}  
}   

正常模式:k1按下,150ms内按下k2,灯亮
               k2按下,150ms内按下k1,灯灭
儿童模式:k2按下之后k1按下,1s后,灯亮
               k2按下之后k1按下,1s后,灯灭
正常模式下开灯,儿童模式可以关闭;儿童模式下开的灯,正常模式可以关闭
要求系统运行可靠,不相互干扰,我的不是按键,是红外感应模块,所以去抖时间短。
此程序存在的问题:1、正常模式运行正常。
                           2、儿童模式可以正常开灯,不可以关灯
                           3、正常模式开的灯,儿童模式关闭不了
请高手指点指点,谢谢!   

1344231802 发表于 2013-9-2 20:17 | 显示全部楼层
好复杂
老土2F 发表于 2013-9-2 20:34 | 显示全部楼层
是不是原来问过了
草民 发表于 2013-9-2 20:47 | 显示全部楼层

太乱了。。。
 楼主| samsunghellome 发表于 2013-9-2 20:51 | 显示全部楼层
老土2F 发表于 2013-9-2 20:34
是不是原来问过了

几个程序模块,我捣鼓好久了,总是有干扰,请高手指点迷津!
 楼主| samsunghellome 发表于 2013-9-2 20:59 | 显示全部楼层
程序中两个模式的灭灯有干扰,请大师指点,谢谢!
xinhuaH 发表于 2013-9-2 21:11 | 显示全部楼层
看了一下,没有分析明白,有一个问题就是:儿童模式是两个按键都要按下,且同时按下的时间要保证大于1S,才能开关灯!
如果找不出问题,建议写个串口程序,用串口把各个数据都发出来,看看为什么儿童模式关不了灯。或者不写串口程序,直接调用C库的printf函数,也能在串口调试助手上看到你要输出的变量,但是printf占用的资源较多,且不可从入。
 楼主| samsunghellome 发表于 2013-9-2 22:13 | 显示全部楼层
xinhuaH 发表于 2013-9-2 21:11
看了一下,没有分析明白,有一个问题就是:儿童模式是两个按键都要按下,且同时按下的时间要保证大于1S,才 ...

我在keil中软件仿真的,可以看到想要的变量!一步一步模拟执行没问题,硬件调试有问题!儿童模式关闭不了灯!
xinhuaH 发表于 2013-9-2 22:25 | 显示全部楼层
我的意思是:在程序全速运行的情况下,看看你执行“儿童的关灯状态”时,那些变量是什么值,这样就能看出当硬件处于“儿童的关灯状态”下,软件是怎么执行的。
xinhuaH 发表于 2013-9-2 22:40 | 显示全部楼层
可能有干扰:这条语句“while(KEY1==0&&KEY2==0);”如果有一个键放开的话,while就不会再等待,这样,因为放开按键的时候有抖动,存在开、关、开、关的情况,所以存在一个件按下,另一个键按下或者松开的状态,所以对其他状态的开关赵成影响,建议改成:“while(KEY1==0);while(KEY2==0);”这样就能避免干扰!
呆板书生 发表于 2013-9-3 06:38 | 显示全部楼层
上操作系统,用多任务完成
 楼主| samsunghellome 发表于 2013-9-3 08:04 | 显示全部楼层
呆板书生 发表于 2013-9-3 06:38
上操作系统,用多任务完成

基于51单片机的应用,呵呵
xinhuaH 发表于 2013-9-3 08:29 | 显示全部楼层
呆板书生 发表于 2013-9-3 06:38
上操作系统,用多任务完成

呵呵,看到这个我感觉很惊奇,51单片机也能跑系统吗?现在正在学习Linux环境下的设备驱动,我想问问:单片机的flash那么有限,操作系统那么复杂,怎么将操作系统嵌入到单片机里面?难道是外扩存储器,然后将操作系统下载到外扩的存储器里面?
 楼主| samsunghellome 发表于 2013-9-3 09:50 | 显示全部楼层
我解决了,把儿童模式关灯和正常模式关灯并列在一起就可以了。。刚开始写程序,有点乱,谢谢大家的帮助!!
mark301600 发表于 2013-9-3 10:32 | 显示全部楼层
xinhuaH 发表于 2013-9-3 08:29
呵呵,看到这个我感觉很惊奇,51单片机也能跑系统吗?现在正在学习Linux环境下的设备驱动,我想问问:单 ...

我也在学习这个,目前的理解是应该一般需要外扩nand flash,linux的编译成镜像以后下载到flash中,大概几十m吧,也不知道对不对
xinhuaH 发表于 2013-9-3 11:53 | 显示全部楼层
samsunghellome 发表于 2013-9-3 09:50
我解决了,把儿童模式关灯和正常模式关灯并列在一起就可以了。。刚开始写程序,有点乱,谢谢大家的帮助!! ...

什么意思?怎么个并列法?
dirtwillfly 发表于 2013-9-3 14:33 | 显示全部楼层
好长的程序
 楼主| samsunghellome 发表于 2013-9-3 16:54 | 显示全部楼层
xinhuaH 发表于 2013-9-3 11:53
什么意思?怎么个并列法?

儿童关灯和正常关灯开头判断有冲突,并在一起,哪个成立就执行哪个程序块!
xuwulian 发表于 2013-9-3 17:21 | 显示全部楼层
xinhuaH 发表于 2013-9-3 08:29
呵呵,看到这个我感觉很惊奇,51单片机也能跑系统吗?现在正在学习Linux环境下的设备驱动,我想问问:单 ...

有一个small rtos for51的,陈明计写的
outstanding 发表于 2013-9-4 00:57 | 显示全部楼层
贴这么多代码 头大 睡觉觉了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

198

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部