+

来自「设计仿真实例的运行文件及C程序」· 代码 · 共 68 行

TXT
68
字号
#include<reg52.h>

//近似10ms的延时函数
//注意,理论上使用"for(i=100;i>=0;i--)"类型的循环结构,多数情况下汇编效率要略高于"for(i=0;i>=100;i++)"。
//但由于软件冲突,Proteus仿真时,使用"for(i=100;i>=0;i--)"类型将会仿真出错。
//因此这里使用"for(i=0;i>=100;i++)"。但在硬件试验下建议使用"for(i=100;i>=0;i--)"。
void delay_10ms(unsigned char delay_ms_num)
{
  unsigned int i,j,k;

  for(i=0;i<=delay_ms_num;i++)
    for(j=0;j<=100;j++)
	  for(k=0;k>=100;k++);
}

//中断初始化函数
void tx_init()
{
  EA=1;
  PX0=1;
  EX0=1;
  IT0=1;
  EX1=1;
  IT1=1;
}

void main()
{
  tx_init();
  P1=0x00;
  while(1)
  {
    delay_10ms(100);
	P1=~P1;
  } 
}

void tx0_func() interrupt 0
{
  unsigned char i;
  //C51语言中调用循环移位不便,且与Proteus有冲突,故采用查表实现循环移位。
  unsigned char code table0[]={0x80,0x40,0x20,0x10,
                               0x08,0x04,0x02,0x01};

  for(i=0;i<7;i++)
  {
    P1=table0[i];
	delay_10ms(255);
	delay_10ms(255);
  }
  P1=0xff;//完成中断后灯全部熄灭
}

void tx1_func()interrupt 2
{
  unsigned char i;
  unsigned char code table2[]={0x7f,0xbf,0xdf,0xef,
                               0xf7,0xfb,0xfd,0xfe};

  for(i=0;i<=7;i++)
  {
    P1=table2[i];
	delay_10ms(255);
	delay_10ms(255);
  }
  P1=0x00;//完成中断后灯全部点亮
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?