找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2146|回复: 7
打印 上一主题 下一主题
收起左侧

大神帮我看一下我的程序,我是初学者 谢谢

[复制链接]
跳转到指定楼层
楼主
ID:65605 发表于 2014-11-10 22:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*这是用外部中断下降沿 第1次在3秒内达5次以上 点亮Green_LED 和 LED5 ,如果少以5次Red_LED程序停止 . 第2.3次依次 */
#include <reg52.h>
#define   uchar unsigned char
#define   uint unsigned int
uchar counter1;
uchar JDQ1,JDQ2,JDQ3;
sbit Green_LED =P0^0;
sbit Green_LED1 =P0^1;
sbit Green_LED2 =P0^2;
sbit Red_LED   =P0^3;
sbit    LED5   =P1^0;
sbit    LED6   =P1^1;
sbit    LED7   =P1^2;
sbit    LED8   =P1^3;
void Delay_1ms(unsigned int Time)
{
  unsigned int x, y;      
  for(x = Time; x > 0; x--)               
   for(y = 120; y > 0; y--);
}
void timer1_init()
{
     TMOD |= 0x10;
     TMOD &= 0xdf;  
     TH0 = (65536-50000)/256;
     TL0 = (65536-50000)%256;
     TR0 = 1; //启动定时器0
  TF0=0;
}
void interrupter_init()
{
    ET0 = 1; //开定时器0中断
            
    EX0=1; //开外部中断0  
EA=1;  //开总中断      
    IT0=1; //下降沿触发
//IE0=0;
PX0=1;
// TCON |=0X01;         
}
main()
{
     timer1_init();
     interrupter_init();
  Red_LED =1;
     Green_LED =1;
     Green_LED1 = 1;
     Green_LED2 =1;
  LED5  = 1;
  LED6  = 1;
  LED7  = 1;
  LED8  = 1;
  JDQ1=0;
  JDQ2=0;
  JDQ3=0;
     while(1);
}      
void ISR_Key(void) interrupt 0
{
   counter1++;
  }
void interrupt_timer1() interrupt 1
{
       uint sec;
       uchar counter;
    TF0=0;
       TH0 = (65536-50000)/256;
       TL0 = (65536-50000)%256;
   
       counter++;
       if(counter ==20)
       {
         counter = 0;
   if(JDQ2==0)
         sec++;      
           if ((sec<30)&&(counter1>=5))
       {
           Green_LED=0;
           LED5 =0;
   
           
      }
   if ((sec<30)&&(counter1>=5)&&(JDQ1 ==1))
          { JDQ1=2;
            Green_LED1 =0;
            LED6 = 0;
         
            }  
   
     if ((sec<30)&&(counter1>=5)&&(JDQ1 ==3))
         { JDQ1=4;
           Green_LED2 =0;
           LED7 = 0;
   
         }
   if ((sec>=30)&&(counter1<5))
   {
            Red_LED=0;
      }
         if (sec>=40)
   { sec=0;counter1=0;
            JDQ1=1;
   if (JDQ2==2)
    {
        JDQ1=3;
    }
   if(JDQ1==4)
   {
     JDQ1=0;
     JDQ2=1;
     LED8  =0;
      
   }
   }
       }
                                 
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:65605 发表于 2014-11-10 23:58 来自手机 | 只看该作者
大神快帮帮忙
回复

使用道具 举报

板凳
ID:66032 发表于 2014-11-11 09:03 | 只看该作者
这个代码2个星期前我帮另一个人写过, 请在帖子里找一下
回复

使用道具 举报

地板
ID:65605 发表于 2014-11-11 09:14 来自手机 | 只看该作者
找不到
回复

使用道具 举报

5#
ID:65605 发表于 2014-11-11 09:52 来自手机 | 只看该作者
看一下我的错在哪里
回复

使用道具 举报

6#
ID:66032 发表于 2014-11-11 11:25 | 只看该作者
//用一个外部中断做按5次的键,一个定时器来判断3秒溢出, 如果定时器在3秒内按了5次, 外部中断重新赋初值,这样防止定时器在3秒溢出,绿灯亮。反之,定时器溢出将使得红灯亮, 用12M crystal 和数码管+38译码器

#include <reg52.h>
#define   uchar unsigned char
#define   uint unsigned int

code uchar number[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

uchar a[6];

sbit ENLED = P1^4;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit Green_LED =P2^0;
sbit Red_LED   =P2^1;

void timer1_init()
{
    TMOD |= 0x10;
    TMOD &= 0xdf;  
    TH1   = 0x3C;
    TL1   = 0xB0;
    TR1   = 1;
}
void interrupter_init()
{
   ET1 = 1;
   EA=1;          //諾ÖÖD¶Ï¿a
   EX0=1;         //ía2¿ÖD¶Ï0¿a
   IT0=1;         //±ßÑØ′¥·¢
}
void Scanning_Numerical_LED(void)
{
      static uchar j = 0;
        switch(j)
       {
        case 0: ADDR0 = 0;ADDR1 = 0;ADDR2 = 0;j++;P0 = number[a[0]];break;
        case 1: ADDR0 = 1;ADDR1 = 0;ADDR2 = 0;j++;P0 = number[a[1]];break;
        case 2: ADDR0 = 0;ADDR1 = 1;ADDR2 = 0;j++;P0 = number[a[2]];break;
        case 3: ADDR0 = 1;ADDR1 = 1;ADDR2 = 0;j++;P0 = number[a[3]];break;
        case 4: ADDR0 = 0;ADDR1 = 0;ADDR2 = 1;j++;P0 = number[a[4]];break;
        case 5: ADDR0 = 1;ADDR1 = 0;ADDR2 = 1;j = 0;P0 = number[a[5]];break;
        default: break;
            }
   
}

main()
{
    ENLED = 0; ADDR3 = 1;
    timer1_init();
    interrupter_init();
    while(1)
    {
       Scanning_Numerical_LED();
    }
   
}

void ISR_Key(void) interrupt 0 using 1

{
  uchar counter1;
  counter1++;
  TR1=1;
  if (counter1==5)
    {
      counter1=0;
      TH1 = 0x3C;  //50 ms setting;
      TL1 = 0xB0;
    }

}

void interrupt_timer1() interrupt 3
{
      uint sec;
      uchar counter;
      TH1 = 0x3C;  //50 ms setting;
      TL1 = 0xB0;
      counter++;
      if(counter ==20)
      {
        counter = 0;
        sec++;
        if (sec>=3)
        {
           Red_LED=1;
           TR1=0; 停定时器1;
          }
        else Green_LED=1;
        if (sec==10)
            sec=0;

        a[0] = sec%10;
        a[1] = sec/10;
        //a[2] = sec/100%10;
     //   a[3] = sec/1000%10;
        //a[4] = sec/10000%10;
      // a[5] = sec/100000%10;
      }
                                         
}
回复

使用道具 举报

7#
ID:65605 发表于 2014-11-11 20:51 来自手机 | 只看该作者
我这个程序要实现在3秒内外部中断沿进入5次以上同时用一个IO口接开关按下绿灯亮,如果不管哪一个不成立就红灯亮
回复

使用道具 举报

8#
ID:19715 发表于 2014-11-11 21:03 | 只看该作者
用一个定时器就可以,不用外中断做按键。
这样按键可以用任意IO,
多少个按键都可以

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表