打印
[STC单片机]

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

[复制链接]
2142|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 | 只看该作者

太乱了。。。

使用特权

评论回复
5
samsunghellome|  楼主 | 2013-9-2 20:51 | 只看该作者
老土2F 发表于 2013-9-2 20:34
是不是原来问过了

几个程序模块,我捣鼓好久了,总是有干扰,请高手指点迷津!

使用特权

评论回复
6
samsunghellome|  楼主 | 2013-9-2 20:59 | 只看该作者
程序中两个模式的灭灯有干扰,请大师指点,谢谢!

使用特权

评论回复
7
xinhuaH| | 2013-9-2 21:11 | 只看该作者
看了一下,没有分析明白,有一个问题就是:儿童模式是两个按键都要按下,且同时按下的时间要保证大于1S,才能开关灯!
如果找不出问题,建议写个串口程序,用串口把各个数据都发出来,看看为什么儿童模式关不了灯。或者不写串口程序,直接调用C库的printf函数,也能在串口调试助手上看到你要输出的变量,但是printf占用的资源较多,且不可从入。

使用特权

评论回复
8
samsunghellome|  楼主 | 2013-9-2 22:13 | 只看该作者
xinhuaH 发表于 2013-9-2 21:11
看了一下,没有分析明白,有一个问题就是:儿童模式是两个按键都要按下,且同时按下的时间要保证大于1S,才 ...

我在keil中软件仿真的,可以看到想要的变量!一步一步模拟执行没问题,硬件调试有问题!儿童模式关闭不了灯!

使用特权

评论回复
9
xinhuaH| | 2013-9-2 22:25 | 只看该作者
我的意思是:在程序全速运行的情况下,看看你执行“儿童的关灯状态”时,那些变量是什么值,这样就能看出当硬件处于“儿童的关灯状态”下,软件是怎么执行的。

使用特权

评论回复
10
xinhuaH| | 2013-9-2 22:40 | 只看该作者
可能有干扰:这条语句“while(KEY1==0&&KEY2==0);”如果有一个键放开的话,while就不会再等待,这样,因为放开按键的时候有抖动,存在开、关、开、关的情况,所以存在一个件按下,另一个键按下或者松开的状态,所以对其他状态的开关赵成影响,建议改成:“while(KEY1==0);while(KEY2==0);”这样就能避免干扰!

使用特权

评论回复
11
呆板书生| | 2013-9-3 06:38 | 只看该作者
上操作系统,用多任务完成

使用特权

评论回复
12
samsunghellome|  楼主 | 2013-9-3 08:04 | 只看该作者
呆板书生 发表于 2013-9-3 06:38
上操作系统,用多任务完成

基于51单片机的应用,呵呵

使用特权

评论回复
13
xinhuaH| | 2013-9-3 08:29 | 只看该作者
呆板书生 发表于 2013-9-3 06:38
上操作系统,用多任务完成

呵呵,看到这个我感觉很惊奇,51单片机也能跑系统吗?现在正在学习Linux环境下的设备驱动,我想问问:单片机的flash那么有限,操作系统那么复杂,怎么将操作系统嵌入到单片机里面?难道是外扩存储器,然后将操作系统下载到外扩的存储器里面?

使用特权

评论回复
14
samsunghellome|  楼主 | 2013-9-3 09:50 | 只看该作者
我解决了,把儿童模式关灯和正常模式关灯并列在一起就可以了。。刚开始写程序,有点乱,谢谢大家的帮助!!

使用特权

评论回复
15
mark301600| | 2013-9-3 10:32 | 只看该作者
xinhuaH 发表于 2013-9-3 08:29
呵呵,看到这个我感觉很惊奇,51单片机也能跑系统吗?现在正在学习Linux环境下的设备驱动,我想问问:单 ...

我也在学习这个,目前的理解是应该一般需要外扩nand flash,linux的编译成镜像以后下载到flash中,大概几十m吧,也不知道对不对

使用特权

评论回复
16
xinhuaH| | 2013-9-3 11:53 | 只看该作者
samsunghellome 发表于 2013-9-3 09:50
我解决了,把儿童模式关灯和正常模式关灯并列在一起就可以了。。刚开始写程序,有点乱,谢谢大家的帮助!! ...

什么意思?怎么个并列法?

使用特权

评论回复
17
dirtwillfly| | 2013-9-3 14:33 | 只看该作者
好长的程序

使用特权

评论回复
18
samsunghellome|  楼主 | 2013-9-3 16:54 | 只看该作者
xinhuaH 发表于 2013-9-3 11:53
什么意思?怎么个并列法?

儿童关灯和正常关灯开头判断有冲突,并在一起,哪个成立就执行哪个程序块!

使用特权

评论回复
19
xuwulian| | 2013-9-3 17:21 | 只看该作者
xinhuaH 发表于 2013-9-3 08:29
呵呵,看到这个我感觉很惊奇,51单片机也能跑系统吗?现在正在学习Linux环境下的设备驱动,我想问问:单 ...

有一个small rtos for51的,陈明计写的

使用特权

评论回复
20
outstanding| | 2013-9-4 00:57 | 只看该作者
贴这么多代码 头大 睡觉觉了

使用特权

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

本版积分规则

43

主题

198

帖子

0

粉丝