单片机C语言实例:12、51单片机中断

一、外部中断0电平触发

程序实例1:

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

/*------------------------------------------------
                    主程序
------------------------------------------------*/
main()
{
	P1=0x55;       //P1口初始值
	EA=1;          //全局中断开
	EX0=1;         //外部中断0开
	IT0=0;         //电平触发
	while(1)
	{
	}
}

/*------------------------------------------------
                 外部中断程序
------------------------------------------------*/
void ISR_Key(void) interrupt 0 using 1
{
	P1=~P1;     //进入中断程序执行程序,
	//此时可以通过 EA=0指令暂时关掉中断    
}

二、外部中断1电平触发

程序实例2:

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit LED=P1^0; //定义LED端口

void DelayUs2x(unsigned char t);//us级延时函数声明 
void DelayMs(unsigned char t); //ms级延时
/*------------------------------------------------
                    主程序
------------------------------------------------*/
main()
{
	LED=0;         //LED灯点亮
	EA=1;          //全局中断开
	EX1=1;         //外部中断0开
	IT1=0;         //琁T1=0表示电平触发
	while(1)
	{
					//在此添加其他程序
	}
}
/*------------------------------------------------
                 外部中断程序
------------------------------------------------*/
void ISR_INT1(void) interrupt 2 
{
 
	if(!INT1)
	{
		DelayMs(10);//在此处可以添加去抖动程序,防止按键抖动造成错误
		if(!INT1)
		while(!INT1);//等待按键释放
		{
			LED=!LED;   
		}
	}
}

/*------------------------------------------------
 uS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
 长度如下 T=tx2+5 uS 
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
	while(--t);
}

/*------------------------------------------------
 mS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
     
	while(t--)
	{
		//大致延时1mS
		DelayUs2x(245);
		DelayUs2x(245);
	}
}

三、外部中断0下降沿触发

程序实例3:

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
/*------------------------------------------------
                    主程序
------------------------------------------------*/
main()
{
	P1=0x55;       //P1口初始值
	EA=1;          //全局中断开
	EX0=1;         //外部中断0开
	IT0=1;         //边沿触发
	while(1)
	{
					//在此添加其他程序
	}
}

/*------------------------------------------------
                 外部中断程序
------------------------------------------------*/
void ISR_Key(void) interrupt 0 using 1
{
	P1=~P1;         //s3按下触发一次,P1取反一次
}

四、外部中断1下降沿触发

程序实例4:

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit LED=P1^0; //定义LED端口

void DelayUs2x(unsigned char t);//us级延时函数声明 
void DelayMs(unsigned char t); //ms级延时
/*------------------------------------------------
                    主程序
------------------------------------------------*/
main()
{
	LED=0;         //LED灯点亮
	EA=1;          //全局中断开
	EX1=1;         //外部中断1开
	IT1=1;         //IT1=1表示边沿触发
	while(1)
	{
					//在此添加其他程序
	}
}
/*------------------------------------------------
                 外部中断程序
------------------------------------------------*/
void ISR_INT1(void) interrupt 2 
{
 
	if(!INT1)
	{
		DelayMs(10);//在此处可以添加去抖动程序,防止按键抖动造成错误
		if(!INT1)
		{
			LED=!LED;   
		}
	}
}

/*------------------------------------------------
 uS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
 长度如下 T=tx2+5 uS 
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
	while(--t);
}

/*------------------------------------------------
 mS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{    
	while(t--)
	{
		//大致延时1mS
		DelayUs2x(245);
		DelayUs2x(245);
	}
}

五、T0外部计数输入

程序实例5:

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit LED=P1^2;    //定义LED端口

/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
	TMOD |= 0x01 | 0x04;	  //使用模式1,16位计数器,使用"|"符号可以在使用多个定时器时不受影响		     
	TH0=0xFF;	      //给定初值
	TL0=245;         //从245计数到255 
	EA=1;            //总中断打开
	ET0=1;           //定时器中断打开
	TR0=1;           //定时器开关打开
}
/*------------------------------------------------
                    主程序
------------------------------------------------*/
main()
{
	Init_Timer0();
	while(1);
}

/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 using 1
{
	TH0=0xFF;	      //重新给定初值
	TL0=245; 

	LED=~LED;        //指示灯反相,可以看到闪烁
}

六、T1外部计数输入

程序实例6:

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit LED=P1^2;    //定义LED端口

/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Init_Timer1(void)
{
	TMOD |= 0x10 | 0x40;	  //使用模式1,16位计数器,使用"|"符号可以在使用多个定时器时不受影响		     
	TH1=0xFF;	      //给定初值
	TL1=245;         //从245计数到255 
	EA=1;            //总中断打开
	ET1=1;           //定时器中断打开
	TR1=1;           //定时器开关打开
}

/*------------------------------------------------
                    主程序
------------------------------------------------*/
main()
{
	Init_Timer1();
	while(1);
}

/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer1_isr(void) interrupt 3 
{
	TH1=0xFF;	      //重新给定初值
	TL1=245; 

	LED=~LED;        //指示灯反相,可以看到闪烁

}

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
51单片机是一种常用的嵌入式系统开发工具,常常使用C语言进行编程。下载51单片机C语言实例可以帮助我们学习和了解如何在51单片机上进行C语言编程,以及如何利用该单片机的功能进行各种应用开发。 下载51单片机C语言实例的好处有很多。首先,它可以帮助我们快速上手学习51单片机的编程方法和技巧,从而提高我们在嵌入式系统开发中的效率和能力。其次,通过实例代码的学习,我们可以了解各种传感器、执行器等外设的驱动和应用方法,为我们在实际项目开发中提供参考和帮助。另外,下载C语言实例还可以帮助我们深入理解嵌入式系统的原理和设计思想,为我们今后的软硬件开发打下坚实的基础。 在选择51单片机C语言实例下载时,我们可以通过各种渠道获取,比如网络上的开发者社区、技术论坛或者开发工具厂商的官方网站都可以提供丰富的资源供我们学习和下载。在下载实例代码时,我们需要注意选择合适的版本和类型,比如针对不同的单片机型号、不同的外设接口以及不同的应用场景等,确保能够满足我们的具体需求。 综上所述,通过下载51单片机C语言实例,我们可以快速上手学习和了解嵌入式系统的开发方法和技巧,为我们今后的项目开发提供帮助和指导。希望大家能够充分利用这些资源,不断提升自己的嵌入式系统开发能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值