找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4067|回复: 0
收起左侧

[求助]Proteus仿真正常,接硬件不行

[复制链接]
ID:27418 发表于 2010-12-29 14:30 | 显示全部楼层 |阅读模式

附程序,外部中断不响应,据说是初始化,大家帮忙看看

 

#include<reg51.h>

#define LEDPort P1


unsigned char aucLED_SELECT_01[9]=
    {0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,};
           //方式0,方式1灯开关数组。
unsigned char aucLED_SELECT_23[5]=
    {0xFF,0x7E,0xBD,0xDB,0xE7};
           //方式2,方式3灯开关数组。

unsigned char _i=0;          //数据选择计数。
           
unsigned char uc_Mode=0;     //模式选择,默认为模式0。

unsigned char uc_Count=1;     //定时器中断计数。

unsigned char uc_Delay=1;     //延迟计数,通过改变改数值改变灯状态延迟时间。
           //灯延迟时间=uc_Dalay*定时器溢出时间。

 

void main()
{             
 TMOD=0x01;        //定时器0模式一。
 TH0=0x3C;
 TL0=0xB0;        //溢出时间:50ms。
 TR0=1;         //定时器0开启。

 IT0=1;         //外部中断0下降沿触发。
 IT1=1;         //外部中断1下降沿触发。

 EX0=1;         //外部中断0开。
 EX1=1;         //外部中断1开。
 ET0=1;         //定时器0中断开。
 EA=1;         //总中断开。

 while(1);
}


//*********************************************************************************************************
//*                            *
//*  ************************************定时器0中断函数************************************     *
//*                            *
//*<函数功能>:当定时器0溢出时执行此函数,首先执行2个判断:              *
//*    (1)if判断是否改变灯的状态,可用于改变延时时间;            *
//*    (2)switch判断闪烁模式,根据不同模式对灯进行不同的通断。          *
//*   最后对定时器TH0,TL0重新赋值,溢出时间为50ms。              *
//*                            *
//*********************************************************************************************************

void vTimer0(void) interrupt 1      
{
 
 if(uc_Count%uc_Delay==0)     //通过此判断语句来改变延时。,例如:当uc_Delay=6时,定时器          
 {           //溢出5次时灯状态改变1次。同时uc_Count重新赋值1.否则,uc_Count++
  uc_Count=1;        //等待下一次溢出。因此可以改变延时。
  switch(uc_Mode)
   {
 //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<模式0,灯从上往下依次点亮,不断循环。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    case 0:     
      if(_i>=8)
       _i=0;
      else _i++;
      LEDPort=aucLED_SELECT_01[_i];
      break;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<模式1,灯从下往上依次点亮,不断循环。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
    case 1:    
      if(i<=0)
       i=8;
      else _i--;

      LEDPort=aucLED_SELECT_01[_i];
      break;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<模式2,灯从两边往中间依次点亮,不断循环。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    case 2:        
      if(_i>=4)
       _i=0;
      else _i++;

      LEDPort=aucLED_SELECT_23[_i];
      break; 
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<模式3,灯从中间往两边依次点亮,不断循环。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    case 3:     
      if(_i<=0)
       _i=4;
      else _i--;

      LEDPort=aucLED_SELECT_23[_i];
      break;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<所有等以一定时间间隔同时闪烁。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    case 4:      
      if(LEDPort==0xFF)
       LEDPort=0x00;
      else LEDPort=0xFF;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<其他>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    default:
      break;
   }
  }
  else uc_Count++;

 TH0=0x3C; //重新给定时器赋值。
 TL0=0xB0; //定时时间:50ms。
}

 

 

//*********************************************************************************************************
//*                            *
//*  ************************************外部中断0中断函数************************************    *
//*                            *
//* <函数功能>:当外部中断0产生下降沿信号时执行此函数,将闪灯模式从模式0到4循环切换。        *
//*                            *
//*********************************************************************************************************

void vModeChange(void) interrupt 0
{
 if(uc_Mode>=4)
  uc_Mode=0;
 else uc_Mode++;
}

 

 

//*********************************************************************************************************
//*                            *
//*  ************************************外部中断1中断函数************************************    *
//*                            *
//*<函数功能>:当外部中断1产生下降沿信号时执行此函数,将闪灯时间从50ms,250ms,500ms,750ms循环切换。    *
//*                            *
//*********************************************************************************************************

void vDelayChange(void) interrupt 2
{
 if(uc_Delay>=16)
  uc_Delay=1;
 else uc_Delay+=5;
}

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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